如何在Linux上监控SQL Server性能
导读:Linux上监控 SQL Server 性能的可落地方案 一 快速排障的 Linux 与 SQL 组合 Linux 基础资源 进程与 CPU/内存:使用 top/htop 定位 sqlservr 进程的 CPU、内存占用;必要时用 ps...
Linux上监控 SQL Server 性能的可落地方案
一 快速排障的 Linux 与 SQL 组合
- Linux 基础资源
- 进程与 CPU/内存:使用 top/htop 定位 sqlservr 进程的 CPU、内存占用;必要时用 ps aux | grep mssql 精确筛选。
- 虚拟内存与整体负载:用 vmstat 1(需安装 sysstat)观察 us、sy、wa、free 等关键列。
- 磁盘 I/O:用 iostat -x 1(需 sysstat)查看 %util、await、r/s、w/s,识别磁盘瓶颈。
- 网络与连接:用 ss -tulnp | grep mssql 或 netstat -an | grep mssql 检查 1433 端口监听与连接状态。
- SQL Server 内置诊断
- 当前活动与慢查询:查询 sys.dm_exec_requests / sys.dm_exec_sessions / sys.dm_exec_sql_text 定位阻塞与长时语句。
- 性能计数器:查询 sys.dm_os_performance_counters 获取缓冲池命中率、批处理请求等关键指标。
- 轻量跟踪:使用 Extended Events 捕获死锁、超时、慢查询等事件,替代开销较大的 Profiler。
二 长期监控与可视化
- Prometheus + Grafana
- 部署 Prometheus 采集时序数据,配置 mssql-exporter(或社区 prometheus-mssql-exporter)作为目标抓取 SQL Server 指标。
- 部署 Grafana,导入 SQL Server 社区仪表盘,配置阈值告警(如连接数、锁等待、批处理请求/秒异常)。
- Zabbix
- 安装 Zabbix Server/Agent,加载 SQL Server 模板,监控连接数、缓存命中、日志空间、I/O 等,并通过邮件/短信/企业微信等发送告警。
- Netdata
- 一键安装 Netdata,访问 http://< 服务器IP> :19999 查看系统与应用层实时指标,适合临时可视化与快速定位。
三 常用 SQL 查询模板
- 当前耗时最长的前 5 条查询
SELECT TOP 5
r.session_id,
r.status,
r.cpu_time,
r.total_elapsed_time,
t.text AS query_text
FROM sys.dm_exec_requests r
CROSS APPLY sys.dm_exec_sql_text(r.sql_handle) t
ORDER BY r.total_elapsed_time DESC;
- 缓冲池命中率(Buffer Cache Hit Ratio)
SELECT
(1.0 - CAST(SUM(CAST(1.0 * cntr_value AS FLOAT)) / SUM(CAST(1.0 * base.cntr_value AS FLOAT))) * 100.0 AS BufferCacheHitRatio
FROM sys.dm_os_performance_counters c
CROSS JOIN (
SELECT cntr_value
FROM sys.dm_os_performance_counters
WHERE object_name LIKE '%Buffer Manager%'
AND counter_name = 'Buffer cache hit ratio base'
) base
WHERE c.object_name LIKE '%Buffer Manager%'
AND c.counter_name = 'Buffer cache hit ratio';
- 日志空间使用
DBCC SQLPERF(LOGSPACE);
- 会话与等待统计
SELECT
s.session_id,
s.login_name,
s.status,
r.wait_type,
r.wait_time,
r.blocking_session_id,
t.text
FROM sys.dm_exec_sessions s
LEFT JOIN sys.dm_exec_requests r ON s.session_id = r.session_id
OUTER APPLY sys.dm_exec_sql_text(r.sql_handle) t
ORDER BY r.wait_time DESC;
- 建议将以上查询加入定时作业,写入监控库或导出到 Prometheus Pushgateway,便于长期趋势分析与阈值告警。
四 告警与自动化
- 阈值告警示例(Shell + mailx)
#!/usr/bin/env bash
THRESHOLD=80
EMAIL="admin@example.com"
NOW=$(date '+%F %T')
CPU_USAGE=$(top -bn1 | grep "Cpu(s)" | sed "s/.*, *\([0-9.]*\)%* id.*/\1/" | awk '{
print 100 - $1}
')
if (( $(echo "$CPU_USAGE >
$THRESHOLD" | bc -l) ));
then
echo "$NOW - CPU 使用率超过阈值($THRESHOLD%),当前:$CPU_USAGE%" | mail -s "SQL Server CPU 告警" "$EMAIL"
fi
- 建议做法
- 将脚本加入 cron(如每 5 分钟执行),并结合 logrotate 管理日志。
- 生产环境优先使用 Prometheus Alertmanager 或 Zabbix 的告警规则,减少脚本维护成本与误报。
五 实践建议与注意事项
- 分层监控:同时覆盖 OS 层(CPU/内存/磁盘/网络) 与 数据库层(会话/请求/等待/缓存/日志),避免只看单点。
- 采样开销:谨慎使用 SQL Server Profiler,优先 Extended Events;DMV 查询建议限定时间窗口与采样频率。
- 基线对比:建立 7/30 天 性能基线,关注 批处理请求/秒、Page Life Expectancy、锁等待、%util、await 的趋势变化。
- 安全合规:为监控账号授予最小权限(如 VIEW SERVER STATE),避免在生产高峰执行重查询。
- 平台提示:Debian 并非 SQL Server 官方支持平台,部分工具与功能可能受限,上线前需充分测试与验证。
声明:本文内容由网友自发贡献,本站不承担相应法律责任。对本内容有异议或投诉,请联系2913721942#qq.com核实处理,我们将尽快回复您,谢谢合作!
若转载请注明出处: 如何在Linux上监控SQL Server性能
本文地址: https://pptw.com/jishu/783727.html
