Skip to content

MySQL 系统级指标

CPU 指标

1. 关键 CPU 指标

指标名称描述正常范围告警阈值收集命令
%user用户空间 CPU 使用率50-70%>80%top, sar -u
%system内核空间 CPU 使用率10-20%>30%top, sar -u
%iowaitI/O 等待 CPU 使用率<10%>20%top, sar -u
%idle空闲 CPU 使用率>20%<10%top, sar -u
负载平均值系统负载<CPU 核心数>CPU 核心数*1.5uptime, vmstat
上下文切换每秒上下文切换次数<10000>50000vmstat, sar -w

2. CPU 指标监控

bash
# 实时查看 CPU 使用率
top -p $(pgrep -d ',' -f mysqld)

# 使用 sar 收集 CPU 统计
sar -u 1 10 > cpu_stats.txt

# 查看 MySQL 线程 CPU 使用率
mysqladmin -u root -p extended-status | grep 'Threads_running'

# 使用 Performance Schema 查看线程 CPU 使用
SELECT * FROM performance_schema.threads WHERE PROCESSLIST_ID IS NOT NULL ORDER BY CPU_TIME DESC;

3. CPU 瓶颈分析

bash
# 找出消耗 CPU 最多的 MySQL 线程
mysql -u root -p -e "SHOW PROCESSLIST;" | grep -v Sleep

# 查看慢查询日志
mysqldumpslow -s t /var/log/mysql-slow.log | head -10

# 使用 pt-query-digest 分析查询
sudo pt-query-digest /var/log/mysql-slow.log

内存指标

1. 关键内存指标

指标名称描述正常范围告警阈值收集命令
内存使用率已使用内存占总内存百分比<80%>90%free -m, sar -r
Swap 使用率已使用 swap 占总 swap 百分比<10%>20%free -m, sar -r
页交换每秒页换入/换出次数<100>500vmstat, sar -B
MySQL 内存使用MySQL 进程占用内存根据配置>配置值*1.1ps aux

2. 内存指标监控

bash
# 查看系统内存使用
free -m

# 查看 MySQL 进程内存使用
ps aux --sort=-%mem | grep mysqld | head -5

# 查看 MySQL 内存相关参数
mysql -u root -p -e "SHOW VARIABLES LIKE '%buffer%'; SHOW VARIABLES LIKE '%cache%';"

# 使用 Performance Schema 查看内存使用
SELECT * FROM performance_schema.memory_summary_global_by_event_name ORDER BY SUM_NUMBER_OF_BYTES_ALLOC DESC LIMIT 10;

3. 内存瓶颈分析

bash
# 检查 MySQL 配置是否合理
mysql -u root -p -e "SHOW VARIABLES LIKE 'innodb_buffer_pool_size'; SHOW VARIABLES LIKE 'key_buffer_size';"

# 查看内存相关状态
mysql -u root -p -e "SHOW GLOBAL STATUS LIKE 'Innodb_buffer_pool_pages%'; SHOW GLOBAL STATUS LIKE 'Key_blocks%';"

# 检查系统内存压力
vmstat 1 5

磁盘指标

1. 关键磁盘指标

指标名称描述正常范围告警阈值收集命令
磁盘使用率已使用磁盘空间百分比<80%>90%df -h
磁盘 I/O 使用率磁盘 I/O 使用率百分比<70%>90%iostat -x
平均读取延迟平均磁盘读取延迟<5ms>20msiostat -x
平均写入延迟平均磁盘写入延迟<5ms>20msiostat -x
读取吞吐量每秒磁盘读取数据量取决于磁盘类型-iostat -x
写入吞吐量每秒磁盘写入数据量取决于磁盘类型-iostat -x

2. 磁盘指标监控

bash
# 查看磁盘空间使用
df -h

# 查看磁盘 I/O 统计
iostat -x 1

# 查看 MySQL 数据目录磁盘使用
du -sh /var/lib/mysql/*

# 查看 MySQL 日志文件大小
du -sh /var/log/mysql/*

# 监控磁盘 I/O 实时情况
iotop -oPa

3. 磁盘瓶颈分析

bash
# 找出最活跃的磁盘分区
iostat -x | sort -k 14 -nr | head -5

# 查看 MySQL 慢查询日志,分析 I/O 密集型查询
mysqldumpslow -s t /var/log/mysql-slow.log | head -10

# 检查 InnoDB I/O 状态
mysql -u root -p -e "SHOW GLOBAL STATUS LIKE 'Innodb_data%'; SHOW GLOBAL STATUS LIKE 'Innodb_os_log%';"

# 检查 MySQL 临时表使用情况
mysql -u root -p -e "SHOW GLOBAL STATUS LIKE 'Created_tmp%';"

网络指标

1. 关键网络指标

指标名称描述正常范围告警阈值收集命令
网络连接数系统当前网络连接数取决于系统配置>最大连接数*0.8netstat -n
MySQL 连接数MySQL 当前连接数<max_connections*0.8>max_connections*0.9mysqladmin status
网络吞吐量每秒网络数据传输量取决于网络带宽>带宽*0.8sar -n DEV
丢包率网络数据包丢失率<0.1%>1%ping, mtr
TCP 重传率TCP 数据包重传率<0.5%>2%netstat -s

2. 网络指标监控

bash
# 查看系统网络连接数
netstat -n | wc -l

# 查看 MySQL 连接数
mysqladmin -u root -p status
mysql -u root -p -e "SHOW GLOBAL STATUS LIKE 'Threads_connected'; SHOW GLOBAL VARIABLES LIKE 'max_connections';"

# 查看网络吞吐量
sar -n DEV 1 10

# 查看 TCP 统计
netstat -s | grep -E 'retransmit|loss'

# 监控 MySQL 连接状态
mysql -u root -p -e "SHOW PROCESSLIST;" | awk '{print $6}' | sort | uniq -c

3. 网络瓶颈分析

bash
# 检查 MySQL 连接状态
mysql -u root -p -e "SHOW PROCESSLIST;" | grep -v Sleep

# 检查网络连接状态
netstat -an | grep ESTABLISHED | wc -l
netstat -an | grep TIME_WAIT | wc -l

# 检查防火墙规则
iptables -L -n

# 测试网络延迟
ping -c 10 mysql_server_ip
mtr mysql_server_ip

系统负载指标

1. 关键系统负载指标

指标名称描述正常范围告警阈值收集命令
1分钟负载平均值1分钟内系统平均负载<CPU核心数>CPU核心数*1.5uptime, vmstat
5分钟负载平均值5分钟内系统平均负载<CPU核心数>CPU核心数*1.2uptime, vmstat
15分钟负载平均值15分钟内系统平均负载<CPU核心数>CPU核心数uptime, vmstat
运行队列长度等待CPU的进程数<CPU核心数*0.5>CPU核心数vmstat
进程数系统当前进程总数取决于系统>2000ps aux

2. 系统负载监控

bash
# 查看系统负载
uptime

# 查看详细系统负载
vmstat 1

# 查看进程状态统计
mpstat -P ALL 1

# 查看 MySQL 线程状态
mysql -u root -p -e "SHOW GLOBAL STATUS LIKE 'Threads_%';"

3. 系统负载瓶颈分析

bash
# 找出消耗资源最多的进程
top

# 查看 MySQL 慢查询
mysqldumpslow -s t /var/log/mysql-slow.log | head -10

# 检查 InnoDB 状态
mysql -u root -p -e "SHOW ENGINE INNODB STATUS\G"

# 检查锁等待
mysql -u root -p -e "SHOW GLOBAL STATUS LIKE 'Innodb_row_lock%';"

系统级指标监控工具

1. 命令行工具

top

  • 功能:实时监控系统 CPU、内存、进程等
  • 使用示例
    bash
    top -p $(pgrep -d ',' -f mysqld)  # 只监控 MySQL 进程

vmstat

  • 功能:虚拟内存统计、CPU 负载、磁盘 I/O 等
  • 使用示例
    bash
    vmstat 1 10  # 每秒输出一次,共10次

iostat

  • 功能:磁盘 I/O 统计
  • 使用示例
    bash
    iostat -x 1 10  # 详细模式,每秒输出一次,共10次
    iostat -d -k /dev/sda 1 10  # 只监控 sda 磁盘,以 KB 为单位

sar

  • 功能:系统活动报告,收集 CPU、内存、磁盘、网络等统计
  • 使用示例
    bash
    sar -u 1 10  # CPU 统计
    sar -r 1 10  # 内存统计
    sar -b 1 10  # I/O 统计
    sar -n DEV 1 10  # 网络统计

2. 监控系统

Prometheus + Grafana

  • 功能:开源监控系统,支持多维度数据收集和可视化
  • MySQL 相关 Exporter
    • node_exporter:收集系统级指标
    • mysqld_exporter:收集 MySQL 指标
  • 配置示例
    yaml
    # prometheus.yml
    scrape_configs:
      - job_name: 'node'
        static_configs:
          - targets: ['localhost:9100']
      - job_name: 'mysql'
        static_configs:
          - targets: ['localhost:9104']

Zabbix

  • 功能:企业级监控系统,支持自动发现、告警、可视化等
  • MySQL 监控
    • 内置 MySQL 模板
    • 自定义监控项
    • 触发器和告警
  • 使用示例
    bash
    # 安装 Zabbix Agent
    sudo apt install zabbix-agent
    
    # 配置 Zabbix Agent
    sudo vi /etc/zabbix/zabbix_agentd.conf

Nagios

  • 功能:经典监控系统,支持插件扩展
  • MySQL 监控插件
    • check_mysql_health:监控 MySQL 健康状态
    • check_mysql:监控 MySQL 连接
  • 使用示例
    bash
    # 检查 MySQL 连接
    /usr/local/nagios/libexec/check_mysql -H localhost -u nagios -p password
    
    # 检查 MySQL 健康状态
    /usr/local/nagios/libexec/check_mysql_health -H localhost -u nagios -p password -m connection-time

系统级指标告警配置

1. 告警策略

指标类型告警级别告警条件告警方式
CPU 使用率警告>80% 持续 5 分钟邮件、短信
CPU 使用率严重>90% 持续 3 分钟邮件、短信、电话
内存使用率警告>85% 持续 5 分钟邮件
内存使用率严重>95% 持续 3 分钟邮件、短信
Swap 使用率警告>15% 持续 5 分钟邮件
Swap 使用率严重>30% 持续 3 分钟邮件、短信
磁盘使用率警告>85% 持续 5 分钟邮件
磁盘使用率严重>95% 持续 3 分钟邮件、短信
I/O 等待警告>20% 持续 5 分钟邮件
I/O 等待严重>30% 持续 3 分钟邮件、短信
MySQL 连接数警告>max_connections*0.8 持续 5 分钟邮件
MySQL 连接数严重>max_connections*0.95 持续 3 分钟邮件、短信

2. 告警配置示例

Prometheus Alertmanager 配置

yaml
# alertmanager.yml
global:
  smtp_smarthost: 'smtp.example.com:587'
  smtp_from: 'alerts@example.com'
  smtp_auth_username: 'alerts@example.com'
  smtp_auth_password: 'password'

route:
  group_by: ['alertname', 'cluster', 'service']
  group_wait: 30s
  group_interval: 5m
  repeat_interval: 4h
  receiver: 'team-email'

receivers:
- name: 'team-email'
  email_configs:
  - to: 'team@example.com'
    send_resolved: true

inhibit_rules:
- source_match:
    severity: 'critical'
  target_match:
    severity: 'warning'
  equal: ['alertname', 'cluster', 'service']

Prometheus 告警规则

yaml
# mysql_alerts.yml
groups:
- name: mysql_alerts
  rules:
  - alert: MySQLHighCpuUsage
    expr: rate(node_cpu_seconds_total{job="node", mode="user"}[5m]) * 100 > 80
    for: 5m
    labels:
      severity: warning
    annotations:
      summary: "High CPU Usage on MySQL Server"
      description: "CPU usage is above 80% for 5 minutes"

  - alert: MySQLHighMemoryUsage
    expr: (node_memory_MemTotal_bytes - node_memory_MemAvailable_bytes) / node_memory_MemTotal_bytes * 100 > 85
    for: 5m
    labels:
      severity: warning
    annotations:
      summary: "High Memory Usage on MySQL Server"
      description: "Memory usage is above 85% for 5 minutes"

  - alert: MySQLHighConnectionCount
    expr: mysql_global_status_threads_connected > mysql_global_variables_max_connections * 0.8
    for: 5m
    labels:
      severity: warning
    annotations:
      summary: "High Connection Count on MySQL Server"
      description: "Connection count is above 80% of max_connections for 5 minutes"

系统级指标优化

1. CPU 优化

bash
# 优化 MySQL 查询
sudo pt-query-digest /var/log/mysql-slow.log

# 调整 MySQL 线程池
mysql -u root -p -e "SET GLOBAL thread_handling = 'pool-of-threads'; SET GLOBAL thread_pool_size = 8;"

# 优化系统调度器
# 对于 MySQL 服务器,推荐使用 performance 调度器
echo performance | sudo tee /sys/devices/system/cpu/cpu*/cpufreq/scaling_governor

2. 内存优化

bash
# 调整 MySQL 内存配置
mysql -u root -p -e "SET GLOBAL innodb_buffer_pool_size = 16G; SET GLOBAL key_buffer_size = 64M;"

# 禁用不必要的服务
sudo systemctl disable unused_service

# 调整系统 swappiness
# 对于数据库服务器,推荐将 swappiness 设置为较低值
echo 10 | sudo tee /proc/sys/vm/swappiness
sudo vi /etc/sysctl.conf  # 添加 vm.swappiness=10

3. 磁盘优化

bash
# 优化磁盘调度器
# 对于 SSD,推荐使用 none 或 deadline 调度器
# 对于 HDD,推荐使用 cfq 调度器
echo deadline | sudo tee /sys/block/sda/queue/scheduler

# 调整 InnoDB I/O 配置
mysql -u root -p -e "SET GLOBAL innodb_io_capacity = 2000; SET GLOBAL innodb_io_capacity_max = 8000;"

# 启用 TRIM(仅 SSD)
sudo fstrim -av

4. 网络优化

bash
# 调整 TCP 配置
sudo vi /etc/sysctl.conf
# 添加以下配置
net.core.somaxconn = 4096
net.ipv4.tcp_max_syn_backlog = 4096
net.ipv4.tcp_fin_timeout = 30
net.ipv4.tcp_tw_reuse = 1
net.ipv4.tcp_tw_recycle = 1

# 应用配置
sudo sysctl -p

# 调整 MySQL 连接配置
mysql -u root -p -e "SET GLOBAL max_connections = 2000; SET GLOBAL wait_timeout = 600;"

系统级指标最佳实践

1. 监控频率

  • 生产环境:关键指标每 1 秒收集一次,汇总数据每 5 分钟聚合一次
  • 测试环境:关键指标每 5 秒收集一次,汇总数据每 15 分钟聚合一次
  • 历史数据保留
    • 原始数据:保存 7 天
    • 5 分钟聚合数据:保存 30 天
    • 1 小时聚合数据:保存 1 年
    • 1 天聚合数据:保存 3 年

2. 指标可视化

  • 仪表板设计

    • 系统概览仪表板:显示关键系统指标
    • CPU 仪表板:详细 CPU 使用率、负载等
    • 内存仪表板:内存使用率、swap 使用等
    • 磁盘仪表板:磁盘 I/O、吞吐量等
    • 网络仪表板:连接数、吞吐量等
    • MySQL 仪表板:MySQL 特定指标
  • 可视化工具

    • Grafana:功能强大的可视化工具
    • Kibana:适合日志和时间序列数据
    • Zabbix:集成监控和可视化

3. 告警管理

  • 告警分级

    • 严重(Critical):需要立即处理的问题
    • 警告(Warning):需要关注的问题
    • 信息(Info):信息性通知
  • 告警抑制

    • 避免告警风暴
    • 抑制规则:严重告警抑制同类型警告告警
    • 告警聚合:相同问题的告警聚合为一个
  • 告警升级

    • 5 分钟未处理:升级到团队负责人
    • 15 分钟未处理:升级到部门负责人
    • 30 分钟未处理:升级到 CTO

4. 性能基准

  • 建立基准

    • 收集正常状态下的系统指标
    • 建立性能基线
    • 定期更新基线
  • 性能测试

    • 定期进行压力测试
    • 比较测试结果与基线
    • 识别性能退化

常见问题(FAQ)

Q1: 如何确定系统级指标的合理阈值?

A1: 确定合理阈值的方法:

  1. 参考行业标准:使用公认的最佳实践作为起点
  2. 建立基线:收集正常状态下的指标数据,建立基线
  3. 逐步调整:根据实际运行情况逐步调整阈值
  4. 考虑业务需求:根据业务重要性调整告警级别和阈值
  5. 参考硬件规格:根据硬件能力调整阈值

Q2: 如何区分 MySQL 问题和系统级问题?

A2: 区分方法:

  • MySQL 问题

    • MySQL 进程 CPU 使用率高
    • MySQL 连接数接近上限
    • 慢查询数量增加
    • InnoDB 锁等待增加
  • 系统级问题

    • 整体 CPU 使用率高,但 MySQL 进程使用率正常
    • 内存或 swap 使用率高
    • 磁盘 I/O 等待高
    • 网络连接数高

Q3: 如何监控多实例 MySQL 服务器?

A3: 多实例监控方法:

  • 使用不同端口:每个实例使用不同端口
  • 配置不同监控项:为每个实例配置独立监控项
  • 使用标签区分:在监控系统中使用标签区分不同实例
  • 集中管理:使用统一监控平台管理所有实例

Q4: 如何优化系统级指标收集性能?

A4: 优化方法:

  • 合理设置收集频率:根据需要调整收集间隔
  • 使用高效收集工具:选择性能开销小的收集工具
  • 优化监控查询:减少复杂查询,使用索引
  • 定期清理历史数据:避免存储过多历史数据
  • 使用分布式收集:对于大规模部署,使用分布式收集架构

Q5: 如何处理系统级指标告警?

A5: 处理流程:

  1. 确认告警:验证告警是否真实存在
  2. 定位问题:使用监控工具定位具体问题
  3. 分析原因:找出问题根本原因
  4. 实施修复:采取相应措施修复问题
  5. 验证修复:确认问题已解决
  6. 记录问题:记录问题和解决方案
  7. 预防措施:采取措施防止类似问题再次发生

Q6: 如何使用系统级指标进行容量规划?

A6: 容量规划方法:

  1. 收集历史数据:收集过去 3-6 个月的系统指标
  2. 分析增长趋势:识别指标增长趋势
  3. 预测未来需求:根据增长趋势预测未来需求
  4. 确定扩容阈值:设置扩容触发阈值
  5. 制定扩容计划:制定详细的扩容计划
  6. 定期 review:定期审查和更新容量规划

Q7: 如何监控云环境中的 MySQL 系统指标?

A7: 云环境监控方法:

  • 使用云平台监控服务:AWS CloudWatch、Azure Monitor、Google Cloud Monitoring
  • 部署自定义监控:在云实例上部署监控代理
  • 集成第三方工具:将云监控数据集成到第三方监控平台
  • 利用云原生服务:使用云数据库服务的内置监控

Q8: 如何监控容器化环境中的 MySQL 系统指标?

A8: 容器化环境监控方法:

  • 使用 Kubernetes 监控:Prometheus + Grafana + kube-state-metrics
  • 容器监控代理:cAdvisor、node-exporter
  • 服务网格监控:Istio、Linkerd
  • 日志聚合:ELK Stack、Loki

案例分析

案例1:高 CPU 使用率问题

场景描述

某电商平台 MySQL 服务器 CPU 使用率持续超过 90%,导致系统响应缓慢。

问题分析

  1. 监控发现

    • CPU 使用率:95%
    • 用户空间 CPU:85%
    • 系统空间 CPU:10%
    • 负载平均值:12.5(8 核心 CPU)
  2. 定位问题

    bash
    # 找出消耗 CPU 最多的进程
    top -p $(pgrep -d ',' -f mysqld)
    
    # 分析慢查询
    sudo pt-query-digest /var/log/mysql-slow.log | head -20
    
    # 查看 MySQL 线程
    mysql -u root -p -e "SHOW PROCESSLIST;" | grep -v Sleep
  3. 根本原因

    • 发现多个复杂查询占用大量 CPU
    • 查询缺少索引
    • 没有使用 LIMIT 限制结果集

解决方案

  1. 优化查询

    • 为查询添加合适的索引
    • 优化查询语句,减少复杂度
    • 添加 LIMIT 限制结果集
  2. 调整配置

    • 调整 MySQL 线程池大小
    • 优化查询缓存
    • 调整 InnoDB 缓存大小
  3. 实施效果

    • CPU 使用率降低到 45%
    • 系统响应时间从 5 秒降低到 0.5 秒
    • 慢查询数量减少 80%

案例2:内存不足问题

场景描述

某金融系统 MySQL 服务器频繁出现内存不足告警,导致系统卡顿。

问题分析

  1. 监控发现

    • 内存使用率:95%
    • Swap 使用率:25%
    • 页交换:800 次/秒
  2. 定位问题

    bash
    # 查看内存使用
    free -m
    
    # 查看 MySQL 内存使用
    ps aux --sort=-%mem | grep mysqld
    
    # 查看 MySQL 内存配置
    mysql -u root -p -e "SHOW VARIABLES LIKE '%buffer%'; SHOW VARIABLES LIKE '%cache%';"
  3. 根本原因

    • MySQL 内存配置过大
    • innodb_buffer_pool_size 设置为 32G(系统总内存 32G)
    • 其他进程占用内存

解决方案

  1. 调整 MySQL 内存配置

    • 将 innodb_buffer_pool_size 调整为 24G
    • 调整其他缓存参数
    • 重启 MySQL 服务
  2. 优化系统配置

    • 调整 swappiness 为 10
    • 关闭不必要的服务
    • 清理缓存
  3. 实施效果

    • 内存使用率降低到 75%
    • Swap 使用率降低到 5%
    • 页交换降低到 10 次/秒
    • 系统卡顿问题解决

未来发展趋势

1. 智能化监控

  • AI 辅助监控

    • 机器学习预测异常
    • 自动识别性能问题
    • 智能告警优先级
    • 自动根因分析
  • 自适应阈值

    • 根据负载自动调整告警阈值
    • 学习正常模式
    • 动态调整监控频率

2. 云原生监控

  • 云原生指标

    • Kubernetes 原生指标
    • 容器级监控
    • 服务网格指标
  • 无代理监控

    • eBPF 技术
    • 减少资源开销
    • 更细粒度监控

3. 分布式监控

  • 分布式架构

    • 大规模部署支持
    • 高可用性
    • 水平扩展
  • 统一监控平台

    • 整合多种监控数据源
    • 统一告警管理
    • 跨平台支持

4. 边缘计算监控

  • 边缘节点监控

    • 边缘计算环境监控
    • 低带宽环境优化
    • 离线监控支持
  • 边缘云协同

    • 边缘和云监控协同
    • 数据分级处理
    • 智能数据传输