温馨提示×

如何在Linux上监控SQL Server性能

小樊
40
2025-12-29 15:50:51
栏目: 云计算

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 mssqlnetstat -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 AlertmanagerZabbix 的告警规则,减少脚本维护成本与误报。

五 实践建议与注意事项

  • 分层监控:同时覆盖 OS 层(CPU/内存/磁盘/网络)数据库层(会话/请求/等待/缓存/日志),避免只看单点。
  • 采样开销:谨慎使用 SQL Server Profiler,优先 Extended Events;DMV 查询建议限定时间窗口与采样频率。
  • 基线对比:建立 7/30 天 性能基线,关注 批处理请求/秒、Page Life Expectancy、锁等待、%util、await 的趋势变化。
  • 安全合规:为监控账号授予最小权限(如 VIEW SERVER STATE),避免在生产高峰执行重查询。
  • 平台提示:Debian 并非 SQL Server 官方支持平台,部分工具与功能可能受限,上线前需充分测试与验证。

0