外观
MySQL 系统级指标
CPU 指标
1. 关键 CPU 指标
| 指标名称 | 描述 | 正常范围 | 告警阈值 | 收集命令 |
|---|---|---|---|---|
| %user | 用户空间 CPU 使用率 | 50-70% | >80% | top, sar -u |
| %system | 内核空间 CPU 使用率 | 10-20% | >30% | top, sar -u |
| %iowait | I/O 等待 CPU 使用率 | <10% | >20% | top, sar -u |
| %idle | 空闲 CPU 使用率 | >20% | <10% | top, sar -u |
| 负载平均值 | 系统负载 | <CPU 核心数 | >CPU 核心数*1.5 | uptime, vmstat |
| 上下文切换 | 每秒上下文切换次数 | <10000 | >50000 | vmstat, 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 | >500 | vmstat, sar -B |
| MySQL 内存使用 | MySQL 进程占用内存 | 根据配置 | >配置值*1.1 | ps 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 | >20ms | iostat -x |
| 平均写入延迟 | 平均磁盘写入延迟 | <5ms | >20ms | iostat -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 -oPa3. 磁盘瓶颈分析
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.8 | netstat -n |
| MySQL 连接数 | MySQL 当前连接数 | <max_connections*0.8 | >max_connections*0.9 | mysqladmin status |
| 网络吞吐量 | 每秒网络数据传输量 | 取决于网络带宽 | >带宽*0.8 | sar -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 -c3. 网络瓶颈分析
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.5 | uptime, vmstat |
| 5分钟负载平均值 | 5分钟内系统平均负载 | <CPU核心数 | >CPU核心数*1.2 | uptime, vmstat |
| 15分钟负载平均值 | 15分钟内系统平均负载 | <CPU核心数 | >CPU核心数 | uptime, vmstat |
| 运行队列长度 | 等待CPU的进程数 | <CPU核心数*0.5 | >CPU核心数 | vmstat |
| 进程数 | 系统当前进程总数 | 取决于系统 | >2000 | ps 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_governor2. 内存优化
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=103. 磁盘优化
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 -av4. 网络优化
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: 确定合理阈值的方法:
- 参考行业标准:使用公认的最佳实践作为起点
- 建立基线:收集正常状态下的指标数据,建立基线
- 逐步调整:根据实际运行情况逐步调整阈值
- 考虑业务需求:根据业务重要性调整告警级别和阈值
- 参考硬件规格:根据硬件能力调整阈值
Q2: 如何区分 MySQL 问题和系统级问题?
A2: 区分方法:
MySQL 问题:
- MySQL 进程 CPU 使用率高
- MySQL 连接数接近上限
- 慢查询数量增加
- InnoDB 锁等待增加
系统级问题:
- 整体 CPU 使用率高,但 MySQL 进程使用率正常
- 内存或 swap 使用率高
- 磁盘 I/O 等待高
- 网络连接数高
Q3: 如何监控多实例 MySQL 服务器?
A3: 多实例监控方法:
- 使用不同端口:每个实例使用不同端口
- 配置不同监控项:为每个实例配置独立监控项
- 使用标签区分:在监控系统中使用标签区分不同实例
- 集中管理:使用统一监控平台管理所有实例
Q4: 如何优化系统级指标收集性能?
A4: 优化方法:
- 合理设置收集频率:根据需要调整收集间隔
- 使用高效收集工具:选择性能开销小的收集工具
- 优化监控查询:减少复杂查询,使用索引
- 定期清理历史数据:避免存储过多历史数据
- 使用分布式收集:对于大规模部署,使用分布式收集架构
Q5: 如何处理系统级指标告警?
A5: 处理流程:
- 确认告警:验证告警是否真实存在
- 定位问题:使用监控工具定位具体问题
- 分析原因:找出问题根本原因
- 实施修复:采取相应措施修复问题
- 验证修复:确认问题已解决
- 记录问题:记录问题和解决方案
- 预防措施:采取措施防止类似问题再次发生
Q6: 如何使用系统级指标进行容量规划?
A6: 容量规划方法:
- 收集历史数据:收集过去 3-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%,导致系统响应缓慢。
问题分析
监控发现:
- CPU 使用率:95%
- 用户空间 CPU:85%
- 系统空间 CPU:10%
- 负载平均值:12.5(8 核心 CPU)
定位问题:
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根本原因:
- 发现多个复杂查询占用大量 CPU
- 查询缺少索引
- 没有使用 LIMIT 限制结果集
解决方案
优化查询:
- 为查询添加合适的索引
- 优化查询语句,减少复杂度
- 添加 LIMIT 限制结果集
调整配置:
- 调整 MySQL 线程池大小
- 优化查询缓存
- 调整 InnoDB 缓存大小
实施效果:
- CPU 使用率降低到 45%
- 系统响应时间从 5 秒降低到 0.5 秒
- 慢查询数量减少 80%
案例2:内存不足问题
场景描述
某金融系统 MySQL 服务器频繁出现内存不足告警,导致系统卡顿。
问题分析
监控发现:
- 内存使用率:95%
- Swap 使用率:25%
- 页交换:800 次/秒
定位问题:
bash# 查看内存使用 free -m # 查看 MySQL 内存使用 ps aux --sort=-%mem | grep mysqld # 查看 MySQL 内存配置 mysql -u root -p -e "SHOW VARIABLES LIKE '%buffer%'; SHOW VARIABLES LIKE '%cache%';"根本原因:
- MySQL 内存配置过大
- innodb_buffer_pool_size 设置为 32G(系统总内存 32G)
- 其他进程占用内存
解决方案
调整 MySQL 内存配置:
- 将 innodb_buffer_pool_size 调整为 24G
- 调整其他缓存参数
- 重启 MySQL 服务
优化系统配置:
- 调整 swappiness 为 10
- 关闭不必要的服务
- 清理缓存
实施效果:
- 内存使用率降低到 75%
- Swap 使用率降低到 5%
- 页交换降低到 10 次/秒
- 系统卡顿问题解决
未来发展趋势
1. 智能化监控
AI 辅助监控:
- 机器学习预测异常
- 自动识别性能问题
- 智能告警优先级
- 自动根因分析
自适应阈值:
- 根据负载自动调整告警阈值
- 学习正常模式
- 动态调整监控频率
2. 云原生监控
云原生指标:
- Kubernetes 原生指标
- 容器级监控
- 服务网格指标
无代理监控:
- eBPF 技术
- 减少资源开销
- 更细粒度监控
3. 分布式监控
分布式架构:
- 大规模部署支持
- 高可用性
- 水平扩展
统一监控平台:
- 整合多种监控数据源
- 统一告警管理
- 跨平台支持
4. 边缘计算监控
边缘节点监控:
- 边缘计算环境监控
- 低带宽环境优化
- 离线监控支持
边缘云协同:
- 边缘和云监控协同
- 数据分级处理
- 智能数据传输
