用 cpustat 定位瓶颈并落地数据库优化
一 工具选择与安装
sudo go get github.com/uber-common/cpustat;默认采样 200ms、汇总 2s、显示前 10 个进程。sudo apt-get update && sudo apt-get install sysstat,启动:cpustat 或带间隔采样:cpustat 1 60(每秒一次、共 60 次)。二 用 cpustat 快速定位 CPU 瓶颈
cpustat 1,若 idle 长期低且 iowait 高,多为存储/磁盘瓶颈;若 system 偏高,多为内核/锁/上下文切换开销大。cpustat 1 3600 > cpu_usage.txt,便于事后分析峰值时段与模式。sudo $GOBIN/cpustat -u mysql -n 20 -t(按用户过滤、显示前 20、彩色终端)。三 典型症状与数据库优化动作
| 观测现象(cpustat) | 可能根因 | 数据库优化动作 |
|---|---|---|
| iow 高、idle 低、iostat %util 高 | 存储/磁盘瓶颈、大量物理读 | 增大 innodb_buffer_pool_size(建议为内存的 50%–75%),优化慢查询减少随机 I/O,考虑 SSD,合并/批量写入,必要时调整 I/O 调度策略 |
| runq 高、usr 不高 | 连接/锁争用、线程调度排队 | 降低 max_connections 到合理值,启用连接池,优化事务/索引减少锁等待,检查长事务与热点行 |
| sys 高、icx 高 | 内核态开销大(系统调用/锁/上下文切换) | 优化 SQL 与索引减少扫描与排序,减少不必要的函数/触发器,合并小事务,评估参数如 sort_buffer_size/tmp_table_size 的副作用 |
| usr 高、单条 SQL 持续靠前 | 计算密集或缺失索引 | 用 EXPLAIN 分析执行计划,添加/改写索引,避免 **SELECT ***,用 LIMIT 限制返回,必要时引入 Redis/Memcached 做结果缓存 |
| 短时尖峰导致抖动 | 定时任务/统计信息收集/备份 | 错峰执行,降低采集频率,优化统计/备份策略 |
| 以上动作中的数据库参数与 SQL/索引优化、缓存与硬件建议,均为提升数据库性能的高收益手段,可结合 cpustat 的观测结果按需落地。 |
四 落地流程与注意事项
cpustat 与 iostat/vmstat 数据,记录 idle、iowait、runq、usr/sys 的 P95/P99。