优化 Debian 上的 SQL Server(通常指 Microsoft SQL Server on Linux)可以从 系统层、SQL Server 配置、查询与索引、存储与 I/O、监控与维护 等方面入手。下面给你一套比较完整、可落地的优化思路。
编辑 /etc/sysctl.conf(或 /etc/sysctl.d/99-sqlserver.conf):
# 增加文件描述符
fs.file-max = 1000000
# 网络优化
net.core.somaxconn = 4096
net.ipv4.tcp_fin_timeout = 30
net.ipv4.tcp_tw_reuse = 1
# 内存管理
vm.swappiness = 1
vm.dirty_ratio = 10
vm.dirty_background_ratio = 5
应用:
sysctl -p
减少 CPU / 内存竞争:
systemctl disable bluetooth
systemctl disable cups
systemctl disable avahi-daemon
echo performance | tee /sys/devices/system/cpu/cpu*/cpufreq/scaling_governor
SQL Server 默认会尽量占用内存,建议手动限制。
查看当前配置:
EXEC sp_configure 'show advanced options', 1;
RECONFIGURE;
EXEC sp_configure 'max server memory (MB)';
设置最大内存(例如 16GB):
EXEC sp_configure 'max server memory (MB)', 16384;
RECONFIGURE;
✅ 建议:
避免大查询占满 CPU:
EXEC sp_configure 'max degree of parallelism', 4;
RECONFIGURE;
一般建议:
默认 5 太低,建议改为:
EXEC sp_configure 'cost threshold for parallelism', 50;
RECONFIGURE;
SQL Server 对磁盘 I/O 非常敏感。
推荐:
/var/opt/mssql/data -- 数据文件
/var/opt/mssql/log -- 日志文件
/var/opt/mssql/tempdb -- TempDB
确保不同磁盘或至少不同目录。
noatime,nodiratime
查看缺失索引:
SELECT * FROM sys.dm_db_missing_index_details;
查找碎片严重的索引:
SELECT * FROM sys.dm_db_index_physical_stats(NULL,NULL,NULL,NULL,NULL);
✅ 定期:
UPDATE STATISTICS 表名;
或在维护计划中定期执行。
建议:
ALTER DATABASE tempdb
ADD FILE (NAME = tempdev2, FILENAME = '/var/opt/mssql/tempdb/tempdb2.ndf', SIZE = 512MB);
确保不是旧版本:
apt list --installed | grep mssql
升级到最新 CU(累积更新)。
SQL Server 官方不推荐:
echo never > /sys/kernel/mm/transparent_hugepage/enabled
常用:
sys.dm_exec_requests
sys.dm_os_wait_stats
sys.dm_exec_query_stats
htop
iostat -x 1
perf top
| 项目 | 建议 |
|---|---|
| SQL Server 最大内存 | 12GB |
| MAXDOP | 4 |
| Cost Threshold | 50 |
| TempDB 文件 | 8 |
| 文件系统 | XFS |
| swappiness | 1 |
你可以直接告诉我:
Debian 版本、SQL Server 版本、内存 / CPU / 磁盘类型、主要用途(OLTP / 报表 / 混合)