在 CentOS 上运行 SQL Server(Microsoft SQL Server on Linux) 时,优化可以从 系统层、SQL Server 层、存储、参数、监控 几个方面来做。下面是一套较完整的优化思路和实践建议。
SQL Server 对内存和文件描述符较敏感。
# 编辑 limits.conf
vi /etc/security/limits.conf
添加:
mssql soft nofile 65536
mssql hard nofile 65536
mssql soft nproc 65536
mssql hard nproc 65536
THP 会影响 SQL Server 性能:
echo never > /sys/kernel/mm/transparent_hugepage/enabled
echo never > /sys/kernel/mm/transparent_hugepage/defrag
永久生效:
vi /etc/rc.d/rc.local
添加上面两行,并:
chmod +x /etc/rc.d/rc.local
避免频繁 swap:
sysctl -w vm.swappiness=10
永久:
echo "vm.swappiness=10" >> /etc/sysctl.conf
SQL Server 官方推荐 XFS
mkfs.xfs /dev/sdb
vi /etc/fstab
示例:
/dev/sdb /var/opt/mssql xfs defaults,noatime,nodiratime 0 0
目录建议:
/var/opt/mssql/data
/var/opt/mssql/log
/var/opt/mssql/tempdb
防止 SQL Server 吃光系统内存:
EXEC sp_configure 'max server memory', 8192; -- 示例 8GB
RECONFIGURE;
原则:
系统内存 - (2GB + 其他服务) = SQL Server 最大内存
ALTER DATABASE tempdb
ADD FILE (NAME = temp2, FILENAME = '/var/opt/mssql/tempdb/tempdb2.ndf', SIZE = 512MB);
OLTP 系统建议:
EXEC sp_configure 'max degree of parallelism', 4;
RECONFIGURE;
EXEC sp_configure 'cost threshold for parallelism', 50;
RECONFIGURE;
SELECT * FROM sys.dm_db_missing_index_details;
UPDATE STATISTICS YourTable;
SELECT
total_elapsed_time/execution_count AS avg_time,
execution_count,
text
FROM sys.dm_exec_query_stats
CROSS APPLY sys.dm_exec_sql_text(sql_handle)
ORDER BY avg_time DESC;
/opt/mssql/bin/mssql-conf set sqlagent.enabled true
systemctl restart mssql-server
/opt/mssql/bin/mssql-conf traceflag 3226 on
top
iostat -x 1
free -m
cat /var/opt/mssql/log/errorlog
| 问题 | 可能原因 |
|---|---|
| CPU 高 | 缺少索引 / 并行度过高 |
| IO 高 | tempdb / 日志盘瓶颈 |
| 内存溢出 | max server memory 未设 |
| 延迟高 | 网络 / 存储 / 锁 |
如果你愿意,可以告诉我:
我可以给你一套 针对性的优化配置参数。