那天下午收到监控系统告警,显示生产环境某台服务器的loadavg值持续超过20,而该机器是8核CPU配置。按照经验法则,健康状态的loadavg应该保持在CPU核数以内。登录机器后,我习惯性地用uptime命令确认了情况:
bash复制$ uptime
14:30:01 up 45 days, 8:23, 3 users, load average: 23.17, 18.43, 15.62
这个数值显然不正常。我立即展开排查,首先用top命令观察整体资源使用情况,发现CPU使用率只有30%左右,内存剩余充足,这形成了明显矛盾——高负载但低CPU利用率。
经验提示:当loadavg与CPU使用率出现背离时,通常意味着存在I/O等待或锁竞争问题
我采用多层诊断工具进行交叉验证:
vmstat检查:重点关注r(运行队列)和b(阻塞进程)列
bash复制$ vmstat 1 5
procs -----------memory---------- ---swap-- -----io---- -system-- ------cpu-----
r b swpd free buff cache si so bi bo in cs us sy id wa st
12 8 0 5849324 102384 530324 0 0 125 342 103 156 15 10 65 10 0
iostat检查磁盘I/O:发现sda设备的%util持续在90%以上
bash复制$ iostat -x 1 3
Device: rrqm/s wrqm/s r/s w/s rkB/s wkB/s avgrq-sz avgqu-sz await r_await w_await svctm %util
sda 0.00 12.00 85.00 23.00 3420.00 456.00 82.13 14.25 131.23 145.67 82.33 9.25 99.80
pidstat定位问题进程:
bash复制$ pidstat -d 1
14:35:01 UID PID kB_rd/s kB_wr/s kB_ccwr/s Command
14:35:02 33 4876 3420.00 0.00 0.00 java
通过strace和perf工具对可疑Java进程进行跟踪:
bash复制$ strace -p 4876 -T -tt -o /tmp/trace.log
$ perf top -p 4876
发现大量futex系统调用和io_submit操作,结合业务日志分析,确认是某个批量处理任务在频繁进行小文件读写。
经过多维度数据交叉分析,最终确定问题复合型成因:
我们分三个阶段实施修复:
紧急缓解措施
bash复制# 临时调整IO调度器
echo deadline > /sys/block/sda/queue/scheduler
# 限制进程IO优先级
ionice -c2 -n3 -p 4876
中期代码优化
java复制// 原代码:同步单文件写入
for(File file : files) {
writeToFile(file);
}
// 优化后:批量异步写入
ExecutorService executor = Executors.newFixedThreadPool(8);
List<Future<?>> futures = new ArrayList<>();
for(File batch : createBatches(files, 100)) {
futures.add(executor.submit(() -> batchWrite(batch)));
}
长期架构改进
建立多维验证体系:
基准测试:使用fio工具模拟业务IO模式
ini复制[global]
ioengine=libaio
direct=1
group_reporting=1
[test]
rw=randwrite
bs=4k
numjobs=8
size=1G
runtime=300
业务指标监控:
bash复制# 自定义监控项
echo 'loadavg5=$(cat /proc/loadavg | cut -d" " -f1)' >> /etc/zabbix/zabbix_agentd.conf.d/loadavg.conf
告警规则优化:
性能测试规范:
text复制压测要求:
- 必须包含磁盘IO密集型场景
- 监控运行队列长度
- 记录上下文切换频率
整理出可复用的诊断流程图:
总结出三条黄金准则:
构建完整的性能分析工具集:
这次排查经历让我深刻认识到,系统负载是个综合指标,需要结合CPU、内存、I/O等多维度分析。特别是在云原生环境下,容器化部署还会引入新的干扰因素,这需要我们建立更立体的监控体系。后续我们计划将这类典型问题的诊断过程固化为自动化检查脚本,提升团队整体的问题定位效率。