Ubuntu 上 SQL Server 性能调优方法
一 操作系统与存储层优化
- 使用支持 FUA(Force Unit Access) 的存储与内核:自 Ubuntu 18.04 起的内核支持 FUA;在满足条件下,启用跟踪标志 3979 作为启动参数,并通过 mssql-conf 设置:control.writethrough=1、control.alternatewritethrough=0,以确保关键写入直达持久化介质、减少双写开销。
- 采用高性能 I/O 栈:优先 XFS/EXT4,并使用 SSD/NVMe 与合适的 RAID(如条带化)以提升吞吐与降低延迟。
- 使用 TuneD 应用 SQL Server 推荐的内核与 CPU 参数(示例配置):
- 关键项:vm.swappiness=1、vm.dirty_background_ratio=3、vm.dirty_ratio=80、vm.dirty_expire_centisecs=500、vm.dirty_writeback_centisecs=100、transparent_hugepages=always(多实例可用 madvise)、vm.max_map_count=1600000、net.core.{rmem,wmem}_{default,max} 合理放大、kernel.numa_balancing=0。
- 启用方式:保存为 /usr/lib/tuned/mssql/tuned.conf,执行 chmod +x 后运行 tuned-adm profile mssql 并验证。
- 文件系统与挂载选项:确保数据/日志所在挂载为 XFS/EXT4,并按需开启/校验 FUA 能力。
二 SQL Server 实例层配置
- 内存:通过 mssql-conf 设置 memory.memorylimitmb(默认约为物理内存的 80%),避免与“最大服务器内存”互相冲突;通常将“最大服务器内存”设置为略低于 memory.memorylimitmb,为 OS 与其他进程预留空间。示例:sudo /opt/mssql/bin/mssql-conf set memory.memorylimitmb 16384(重启生效)。
- 高可用与维护:启用 SQL Server 代理(sqlagent.enabled=true)以执行维护计划、统计更新与备份作业;在 Always On 可用性组 场景下,各节点保持一致的 mssql.conf 配置,并按集群流程进行维护。
- 其他常用项:按需调整默认数据/日志/备份目录、错误日志目录、TCP 端口、TLS 等,减少跨盘争用并提升可维护性。
三 查询与索引优化
- 索引策略:为高频 WHERE/JOIN/ORDER BY 列建立合适的 聚集/非聚集/复合索引;优先 覆盖索引 减少回表;控制索引数量避免写放大;定期 重建/重组 与更新统计信息;删除冗余或低选择性索引;对高选择性列建立索引;避免前导通配的 LIKE(如 ‘%abc’)以免索引失效。
- 查询写法:避免 **SELECT ***,只取必要列;减少复杂子查询与临时表滥用;在适当场景用 JOIN 替代子查询;使用 LIMIT/OFFSET 控制返回量;对大结果集分页处理。
- 执行计划与统计:利用 执行计划 与统计信息识别扫描与隐式转换等瓶颈;保持统计信息最新,必要时使用 查询存储(Query Store) 固定良好计划。
四 监控与维护例行化
- 系统监控:在 Ubuntu 上使用 top/htop、vmstat、iostat -x 1 观察 CPU、内存、I/O 饱和度与队列,定位资源瓶颈。
- 数据库监控:使用 扩展事件(Extended Events)、性能监视器与内置视图持续跟踪慢查询、阻塞与等待统计;结合 SQL Server Profiler/数据库引擎优化顾问 做针对性优化。
- 例行维护:定期 更新统计信息、检查索引碎片、执行 备份与恢复演练,确保可恢复性与计划有效性。
五 网络与高可用架构
- 网络:优化 TCP/IP 栈与网络质量(如 rmem/wmem、队列与中断亲和),降低往返时延与丢包对吞吐的影响;确保实例 TCP 1433 端口与防火墙策略正确配置。
- 高可用:在需要高吞吐与快速故障切换的场景,部署 Always On 可用性组 并结合上述 OS/实例/查询优化,获得更稳定的性能表现。