You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Ubuntu EC2 Docker部署SQL Server,本地SSMS远程连接缓慢求助

问题场景

AWS EC2 Ubuntu 22.04实例(16GB内存、4vCPU)通过Docker Compose部署SQL Server,配置如下:

version: '3.3'
services:
  sqlserver:
    image: mcr.microsoft.com/mssql/server
    ports:
      - "1433:1433"
    environment:
      ACCEPT_EULA: "Y"
      SA_PASSWORD: password
      MSSQL_SA_PASSWORD: password
    volumes:
      - /home/ubuntu/mssql-data:/var/opt/mssql/data
    restart: always
    deploy:
      resources:
        limits:
          cpus: '4'  
          memory: 8G 

本地Windows SSMS连接及查询速度缓慢,但应用层访问正常;切换至孟买区实例后性能略有提升(查询约10秒),但远不及Azure SQL Server本地连接性能。

解决方案

1. 修正SQL Server内存配置错误

你之前设置的max server memory为100000(单位为MB),远超Docker分配的8GB内存限制,会导致SQL Server频繁内存换页,严重影响性能。调整为符合Docker资源限制的值:

sp_configure 'show advanced options', 1;
GO
RECONFIGURE;
GO

sp_configure 'max server memory', 7168; -- 分配7GB,留1GB给SQL Server系统进程及Docker
GO
RECONFIGURE;
GO

2. 优化Docker网络模式

默认桥接网络的端口转发会带来额外延迟,改用host网络模式直接复用主机网络:
修改docker-compose.yml:

version: '3.3'
services:
  sqlserver:
    image: mcr.microsoft.com/mssql/server
    network_mode: host # 启用主机网络,无需端口映射
    environment:
      ACCEPT_EULA: "Y"
      SA_PASSWORD: password
      MSSQL_SA_PASSWORD: password
    volumes:
      - /home/ubuntu/mssql-data:/var/opt/mssql/data
    restart: always
    deploy:
      resources:
        limits:
          cpus: '4'  
          memory: 8G 

3. 调整SSMS连接参数

  • 关闭加密连接:连接时进入「选项」→「连接属性」,取消勾选「加密连接」(未配置SSL证书时,加密会增加不必要的开销)
  • 禁用自动统计更新:临时关闭自动统计更新以减少远程交互开销:
    SET AUTO_UPDATE_STATISTICS OFF;
    
  • 使用DAC连接:在SSMS服务器名称栏输入admin:你的EC2公网IP,通过专用管理员连接测试,该连接优先级更高,可排除常规连接的资源争抢问题。

4. 优化EC2实例网络与硬件

  • 更换实例类型:t系列实例有带宽突发限制,建议改用c5/c6系列计算优化型实例,获得稳定的网络与CPU性能
  • 启用增强型网络:确保EC2实例启用ENA(Elastic Network Adapter),提升网络吞吐量并降低延迟
  • 检查存储性能:若使用EBS卷,升级为gp3并调整IOPS/吞吐量参数,或改用Provisioned IOPS卷,减少磁盘IO延迟对查询的影响

5. 排查SQL Server性能瓶颈

  • 查看执行计划:在SSMS中开启「包含实际执行计划」,分析慢查询是否存在索引缺失、全表扫描等问题
  • 分析等待统计:执行以下查询定位主要等待类型(CPU/内存/IO/网络):
    SELECT TOP 10
        wait_type,
        wait_time_ms / 1000 AS wait_time_sec,
        signal_wait_time_ms / 1000 AS signal_wait_time_sec,
        wait_time_ms - signal_wait_time_ms AS resource_wait_time_sec
    FROM sys.dm_os_wait_stats
    WHERE wait_type NOT IN ('SLEEP_TASK', 'WAITFOR', 'LOGMGR_QUEUE', 'CHECKPOINT_QUEUE', 'LAZYWRITER_SLEEP')
    ORDER BY wait_time_ms DESC;
    

内容的提问来源于stack exchange,提问作者Mohammad Fathi Rahman

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.09 16:53:14