Linux瓶颈分析
性能优化
性能优化一项最重要的步骤就是寻找到系统的瓶颈
粗略分析
系统响应慢,一般的瓶颈在IO、CPU、内存还有应用。
使用top查看
1 |
|
- 输入M,进程列表按内存使用大小降序排序,便于我们观察最大内存使用者使用有问题
- 输入P,进程列表按CPU使用大小降序排序,便于我们观察最耗CPU资源
- 100.0 id 空闲CPU时间百分比,如果这个值过低,表明系统CPU存在瓶颈
- 0.0 wa 等待I/O的CPU时间百分比,如果这个值过高,表明IO存在瓶颈
内存瓶颈
一般使用free工具
1 |
|
缺省时free的单位为KB
属性 | 含义 |
---|---|
total | 总物理内存大小 |
used | 已使用物理内存大小 |
free | 未分配物理内存大小 |
shared | 共享的物理内存大小 |
buff/cache | 为了提高系统的读写速度(包含磁盘块的读写,文件的读写等),操作系统将部分内存作为缓存使用,该数值为缓存占用的物理内存大小 |
available | 可用的物理内存大小 |
属性 | 说明 |
---|---|
total | Swap 分区的总大小 |
used | 已使用的 Swap 分区大小 |
free | 未使用的 Swap 分区大小 |
根据上表,在不考虑 Swap 分区的情况下,内存计算如下:
总内存大小:Mem.total = Mem.used + Mem.free + Mem.shared + Mem.buff/cache
理论上实际可用内存大小:Mem.actual = Mem.total - Mem.used - Mem.shared = Mem.free + Mem.buff/cache
在考虑 Swap 分区的情况下,内存计算如下:
总内存大小:Mem.total = Mem.used + Mem.free + Mem.shared + Mem.buff/cache
理论上实际可用内存大小:Mem.actual = Mem.total - Mem.used - Mem.shared + Swap.free = Mem.free + Mem.buff/cache + Swap.free
属性 | 说明 |
---|---|
PageCache.size | 可以回收的 PageCache 大小,计算公式见上图 |
SlabCache.size | 可以回收的 SlabCache 大小 ,计算公式见上图 |
WaterMark.low | 支持系统使用的最低水位线,计算公式见上图 |
Mem.available = Mem.free + PageCache.size + SlabCache.size - WaterMark.low
进一步的监视内存使用情况,可使用vmstat工具,可实时动态监视操作系统的内存和虚拟内存的动态变化使用情况
vmstat [delay] [count]
- delay是两次输出之间的延迟时间;
- count是指按照这个时间间隔统计的次数。
1 |
|
Procs(进程):
- r: 运行队列中进程数量
- b: 等待IO的进程数量
Memory(内存):
- swpd: 使用虚拟内存大小
- free: 可用内存大小
- buff: 用作缓冲的内存大小
- cache: 用作缓存的内存大小
Swap:
- si: 每秒从交换区写到内存的大小
- so: 每秒写入交换区的内存大小
IO:(现在的Linux版本块的大小为1024bytes)
- bi: 每秒读取的块数
- bo: 每秒写入的块数
system:
- in: 每秒中断数,包括时钟中断
- cs: 每秒上下文切换数
CPU(以百分比表示)
- us: 用户进程执行时间(user time)
- sy: 系统进程执行时间(system time)
- id: 空闲时间(包括IO等待时间)
- wa: 等待IO时间
内存测试工具我们使用Stream,基准测试,注意数据仅在相同软件相同版本有比较价值
IO瓶颈
如果IO存在性能瓶颈,top工具中的%wa会偏高
可使用iostat 进一步分析
iostat [paras] [delay] [count]
- -c显示CPU使用情况
- -d 显示磁盘使用情况
- -k 以 KB 为单位显示
- -m 以 M 为单位显示
- -N 显示磁盘阵列(LVM) 信息
- -p[磁盘] 显示磁盘和分区的情况
- -t 显示终端和CPU的信息
1 | [root@172-20-59-60 apt_ui]# iostat 3 3 |
- %user:CPU处在用户模式下的时间百分比。
- %nice:CPU处在带NICE值的用户模式下的时间百分比。
- %system:CPU处在系统模式下的时间百分比。
- %iowait:CPU等待输入输出完成时间的百分比。
- %steal:管理程序维护另一个虚拟处理器时,虚拟CPU的无意识等待时间百分比。
- %idle:CPU空闲时间百分比。
- rrqm/s: 每秒进行 merge 的读操作数目。即 rmerge/s
- wrqm/s: 每秒进行 merge 的写操作数目。即 wmerge/s
- r/s: 每秒完成的读 I/O 设备次数。即 rio/s
- w/s: 每秒完成的写 I/O 设备次数。即 wio/s
- rsec/s: 每秒读扇区数。即 rsect/s
- wsec/s: 每秒写扇区数。即 wsect/s
- rkB/s: 每秒读K字节数。是 rsect/s 的一半,因为每扇区大小为512字节。
- wkB/s: 每秒写K字节数。是 wsect/s 的一半。
- avgrq-sz: 平均每次设备I/O操作的数据大小 (扇区)。
- avgqu-sz: 平均I/O队列长度。
- await: 平均每次设备I/O操作的等待时间 (毫秒)。
- svctm: 平均每次设备I/O操作的服务时间 (毫秒)。
- %util: 一秒中有百分之多少的时间用于 I/O 操作,即被io消耗的cpu百分比
磁盘测试工具我们一般使用iperf3,注意数据仅在相同软件相同版本有比较价值