概述
总体排查思路
- 总体观察,htop命令观察系统负载程度
- 检查CPU占用高的进程
- 检查CPU硬件信息是否为问题根源
- 从宏观到细节分析系统IO情况
- 最后检查系统日志
排查思路
系统负载
通过htop命令查看系统负载,通过系统负载可以判断系统是否繁忙,主要可以反应出系统的任务队列中等待CPU处理的进程数量
htop命令
过去 1 分钟、5 分钟和 15 分钟的平均系统负载
判断标准:负载值应该小于或者接近CPU核心数,例如我的Linux云服务器是2核,那么只要是小于2,CPU就远远没有超负荷
检查CPU占用
主要判断是否存在进程占用了大量的CPU资源
判断标准:一般80%为阈值,如果高于这个数值就要考虑到该进程是否有问题,检查该进程是否有无限循环、死锁问题
检查CPU硬件信息
通过lscpu可以查看硬件信息
CPU基本信息
CPU缓存信息
如果缓存被频繁溢出(例如处理大量小请求时),可能会导致性能瓶颈。在调优时,可以考虑分析 CPU 缓存的使用情况
检查系统IO
常见问题
磁盘 I/O 延迟(await)
如果平均等待时间很高,那么就表明磁盘存在瓶颈。可能是由于磁盘读写速度慢,或者磁盘负载过高。你可以检查磁盘是否满了,或者是否存在过多的磁盘请求导致磁盘响应变慢
一般优化方法更换SSD,或者通过RAID配置优化磁盘的读写速度
磁盘 I/O 阻塞进程(iotop)
某些进程占用了过多的磁盘 I/O,导致系统整体性能下降,可以考虑优化这些进程的 I/O 行为
可以通过减少频繁的磁盘访问,提高文件缓存命中率的方式来减少IO负担
磁盘空间和队列长度(iostat)
如果队列长度过高,明磁盘是 I/O 瓶颈。可以进一步查看 bi 和 bo,确认是读还是写造成的瓶颈。如果是磁盘写操作频繁,可以考虑调整写缓存策略或优化文件系统
排查思路
dstat整体判断CPU是否存在瓶颈
- 磁盘I/O(dsk/total):关注其读取和写入的数据,
- 分页I/O:关注其加载和写入磁盘的数据
- 系统I/O:关注其中断次数和上下文切还能次数,如果连个值都很高则表明系统正在大量的处理I/O操作或者任务切换
iostat进一步分析磁盘性能
- 23.86% 的 CPU 时间用于执行用户空间的进程(
%user
) - 0.00% 的 CPU 时间是用于优先级调整的进程(
%nice
) - 8.63% 的 CPU 时间用于执行内核空间的进程(
%system
) - 0.51% 的 CPU 时间是等待 I/O 完成(
%iowait
),即 CPU 空闲但等待磁盘等外部设备响应。 - 0.00% 的 CPU 被虚拟化系统偷走(
%steal
),这通常出现在虚拟机中 - 67.01% 的 CPU 是空闲的(
%idle
)
重点关注指标
- %util:表明磁盘使用的繁忙程度,如果接近于100%那么就证明磁盘基本没有什么空余空间
- r/s:每秒读取请求的数量
- w/s:每秒写入请求的数量
- r_await:平均读取请求的等待时间
- w_await:平均写入请求的等待时间
- rareq-sz:每个读取请求的平均大小
- wareq-ze:每个写入请求的平均大小
- rrqm/s:每秒合并读取的请求书,合并请求可以减少磁盘访问次数,提高磁盘效率
- aqu-sz:磁盘I/O队列的平均深度,如果队列很长那么就表明系统中有大量的I/O请求等待磁盘处理
- drqm/s:每秒合并的删除请求数。如果你的系统涉及删除操作,查看这些指标可以帮助了解是否有删除请求的瓶颈
vmstat检查I/O等待时间是否过高,进一步确认是否有I/O阻塞问题
在CPU和IO排查中,使用iostat已经可以得到详细的数据,如果想要宏观的分析CPU情况再使用该工具
procs
(进程)
r
: 运行队列中等待执行的进程数,值高表示 CPU 繁忙b
: 不可中断状态的进程数,值高表示 I/O 阻塞
memory
(内存)
swpd
: 已使用的交换空间,值大表示内存紧张free
: 空闲内存,值低表示内存压力大buff
: 用作缓存的内存大小,反映内存管理情况cache
: 页面缓存的内存大小,说明内存管理较好
swap
(交换空间)
si
: 从交换空间读取的内存量,值高表示频繁使用交换空间so
: 写入交换空间的内存量,值高表示内存不足,频繁交换
io
(I/O)
bi
: 每秒从磁盘读取的字节数,值高表示大量磁盘读取操作bo
: 每秒写入磁盘的字节数,值高表示大量磁盘写入操作
system
(系统)
in
: 每秒硬件中断的次数,值高可能意味着系统负载高或硬件中断问题cs
: 每秒上下文切换的次数,值高可能说明系统负载高或频繁的进程切换
cpu
(CPU 使用情况)
us
: 用户空间占用 CPU 的百分比,值高表示应用程序消耗较多 CPUsy
: 内核空间占用 CPU 的百分比,值高表示内核操作占用大量 CPUid
: CPU 空闲时间的百分比,值高表示 CPU 处于空闲状态wa
: I/O 等待占用 CPU 的百分比,值高表示存在 I/O 阻塞st
: 虚拟化环境中的“偷取时间”,值高表示虚拟机间的资源竞争
系统日志检查
journalctl -xe
- -x:显示详细的错误信息
- -e:跳转到日志末尾,查看最新的日志
可以对硬件错误进行筛选
该出问题尚未遇到,后续遇到再详细补充
journalctl -xe | grep -i "hardware error"
反思
目前学习阶段遇到的都是一些轻微的CPU错误,但是经过系统的了解CPU错误排查思路后,CPU问题往往不是单一因素导致的,在解决问题的时候一般是需要多维度考虑问题,从整体分析CPU问题的大概方向,然后使用工具进一步分析出CPU问题的根源
排查过程中,使用自动化工具对问题进行分析的工作不难,比较有挑战性的是从日志错误中分析出有效的信息,因为系统日志中各种信息类型很多。下一步需要学习对于日志筛查的学习,与此同时对于日志的分析页十分重要,借助日志可以提高自己排查错误效率。