Linux性能监控 - CPU、Memory、IO、Network
CPU
CPU 查看这些重要参数: 中断、上下文切换、可运行队列、CPU 利用率来监测性能。
每个参数的健康区间:
- CPU利用率: User Time <= 70%,System Time <= 35%,User Time + System Time <= 70%。
- 上下文切换: 与CPU利用率相关联,如果CPU利用率状态良好,大量的上下文切换也是可以接受的。
- 可运行队列: 每个处理器的可运行队列 <=3 个线程。如双处理器系统的可运行队列里不应该超过6个线程。
运用到的工具有Linux vmstat命令详解、Linux top命令详解、Linux mpstat-显示各个可用CPU的状态
top 查看 CPU 利用率,如果 User Time 比较高,使用 show-busy-java-threads 工具排查,其会从所有运行的Java进程中找出最消耗CPU的线程(缺省5个),打印出其线程栈。Linux 系统 CPU 过高异常排查
如果 System Time 比 User Time 高,以及高频度的上下文切换(cs),说明应用程序进行了大量的系统调用。
vmstat 输出例子
1 | procs -----------memory---------- ---swap-- -----io---- -system-- ------cpu----- |
需要关注的参数
- r: 当前运行队列中线程的数目,代表线程处于可运行状态,但CPU还未能执行
- b: 等待IO的进程数量;如果该值一直都很大,说明IO比较繁忙,处理较慢
- in: 每秒中断数
- cs: 每秒上下文切换数
- us: 用户占用CPU的百分比
- sys: 内核占用CPU的百分比
- id: CPU 完全空闲的百分比
Memory
分析 vmstat 输出
- si: 每秒从交换区写到内存的大小
- so: 每秒写入交换区的内存大小
内存够用的时候,这2个值都是0,如果这2个值长期大于0时,系统性能会受到影响,磁盘IO和CPU资源都会被消耗。有时我们看到空闲内存(free)很少的或接近于0时,就认为内存不够用了,不能光看这一点,还要结合si和so,如果free很少,但是si和so也很少(大多时候是0),那么不用担心,系统性能这时不会受到影响的
IO
通过 vmstat
的输出,重点关注b
、bi
、bo
和wa
字段。这几个值变大,都意味着IO的消耗增加。
对于读请求大的服务器,一般b
、bi
、wa
都会比较大,而对于写入量大的服务器,一般b
、bo
、wa
都会比较大。
借助Linux iostat命令详解可以查看相关参数
- %iowait: 如果该值较高,表示磁盘存在I/O瓶颈
- await: 平均每次设备I/O操作的等待时间 (毫秒),一般地,系统I/O响应时间应该低于5ms,如果大于 10ms就比较大了
- %util:一秒中有百分之多少的时间用于I/O操作,即被IO消耗的CPU百分比,一般地,如果该参数是100%表示设备已经接近满负荷运行了
借助pidstat -d 1
定位出导致瓶颈的进程,参阅Linux pidstat命令详解
现在定位到进程级别了,可能需要知道这个进程到底打开了哪些文件,借助lsof -p 20711
命令列出指定20711进程打开的文件列表,参阅Linux lsof命令详解
Network
网络的监测是所有 Linux 子系统里面最复杂的,这里贴了解到的运维命令
iftop 命令查看端到端流量
NetHogs实时监控进程的网络带宽占用情况,参阅Linux NetHogs 监控工具
还有些ip
,netstat
,tcpdump
,sar
来分析网络性能问题,参阅Linux性能监测:网络篇
UDP监控
对于UDP服务,查看所有监听的UDP端口的网络情况
1 | $ watch netstat -unlp |
对于Recv-Q
和Send-Q
两个指标值为0,或者没有长时间大于0的数值是比较正常的。
对于UDP服务,查看丢包情况(网卡收到了,但是应用层没有处理过来造成的丢包)
1 | $ netstat -su |
packet receive errors
这一项数值增长了,则表明在丢包。
TCP监控
对于TCP服务而言,这个就比较复杂;因为TCP涉及到重传,所以我们就需要重点关注这个重传率。
1 | $ netstat -st | grep segments |
查看segments send out
和segments retransmited
指标,对比一段时间内,这两个指标的增长率就是对应的重传率(Linux性能监测:网络篇文末尾有计算重传率的Shell脚本),发生重传说明网络传输有丢包,基本上从3个点去定位:客户端网络情况、服务端网络情况、中间链路网络情况。
网卡吞吐率
可以通过sar -n DEV 2 3
命令来查看
1 | $ sar -n DEV 2 3 |
将rxkB/s
和txkB/s
进行相加,得到网卡设备的实际吞吐率,然后再和网卡的硬件指标进行比对即可。
比如一个网卡的rxkB/s
指标为21999.10,txkB/s
指标为482.56,那这个网卡的吞吐率大概在22Mbytes/s
,即176 Mbits/sec
,没有达到1Gbit/sec
的硬件上限。
参考链接