最近了解了下 Linux 性能相关的东西,主要是如何查看服务器性能的一些工具,在这里做个记录,以后遇到相关使用场景的时候,方便查看。

Linux 性能指标

  • CPU

CPU利用率、用户时间(表示CPU在用户进程上的时间百分比)、系统时间(表示CPU花在内核操作上的时间百分比)、空闲时间、平均负载、阻塞、上下文切换、中断等

  • 内存

空闲内存、Swap利用率、缓冲和缓存、活动和非活动内存等

  • 磁盘IO

IO等待、平均队列长度、每秒传输(TPS)等

  • 网络

接收和发送的包、每秒碰撞(各个网络接口所连接网络的所发生的冲突数量)、丢包、错误等

监测工具

以下是对 Linux 的性能进行监控的常用工具:

工具 简介
top 查看进程活动状态以及一些系统状况
vmstat 查看系统状态、硬件和系统信息等
iostat 查看 CPU 负载、硬盘状况
sar 综合工具,查看系统状况
mpstat 查看多处理器状况
netstat 查看网络状况
iptraf 实时网络状态监测
tcpdump 抓取网络数据包,详细分析
tcptrace 网络包分析工具
netperf 网络带宽工具
dstat 综合了 vmstat、iostat、ifstat、netstat 等多个信息

这里介绍其中几个。

top 工具

top是Linux下常用的性能分析工具,能够实时显示系统中各个进程的资源占用状况,类似于Windows的任务管理器。

20180725153253005740341.png

PID:进程的ID

USER:进程所有者

PR:进程的优先级别,越小越优先被执行

NI:nice值

VIRT:进程占用的虚拟内存

RES:进程占用的物理内存

SHR:进程使用的共享内存

S:进程的状态。S表示休眠,R表示正在运行,Z表示僵死状态,N表示该进程优先值为负数

%CPU:进程占用CPU的使用率

%MEM:进程使用的物理内存和总内存的百分比

TIME+:该进程启动后占用的总的CPU时间,即占用CPU使用时间的累加值。

COMMAND:进程启动命令名称

vmstat 工具

vmstat 是个查看系统整体性能的小工具,小巧,即使在机器负载很高的情况下也运行良好,并且可以用时间间隔采集得到连续的性能数据。

2018072515325286132815.png

参数介绍:

  • r,可运行队列的线程数,这些线程都是可运行状态,只不过 CPU 暂时不可用
  • b,被 blocked 的进程数,正在等待 IO 请求
  • in,被处理过的中断数
  • cs,系统上正在做上下文切换的数目
  • us,用户占用 CPU 的百分比
  • sys,内核和中断占用 CPU 的百分比
  • wa,所有可运行的线程被 blocked 以后都在等待 IO,这时候 CPU 空闲的百分比
  • id,CPU 完全空闲的百分比

举两个例子来分析一下

1
2
3
4
5
6
7
8
$ vmstat 1
procs -----------memory---------- ---swap-- -----io---- --system-- -----cpu------
r b swpd free buff cache si so bi bo in cs us sy id wa st
4 0 140 2915476 341288 3951700 0 0 0 0 1057 523 89 21 0 0 0
4 0 140 2915724 341296 3951700 0 0 0 0 1048 546 79 11 0 0 0
4 0 140 2915848 341296 3951700 0 0 0 0 1044 514 88 22 0 0 0
4 0 140 2915848 341296 3951700 0 0 0 24 1044 564 80 20 0 0 0
4 0 140 2915848 341296 3951700 0 0 0 0 1060 546 78 12 0 0 0

从上面的数据可以看出几点:

  1. interrupts(in) 非常高,context switch(cs) 比较低,说明这个 CPU 一直在不停的请求资源
  2. user time(us) 一直保持在 80% 以上,而且上下文切换较低 (cs),说明某个进程可能一直霸占着 CPU
  • run queue(r) 刚好在 4 个
1
2
3
4
5
6
7
8
$ vmstat 1
procs -----------memory---------- ---swap-- -----io---- --system-- -----cpu------
r b swpd free buff cache si so bi bo in cs us sy id wa st
14 0 140 2904316 341912 3952308 0 0 0 460 1106 9593 36 64 1 0 0
17 0 140 2903492 341912 3951780 0 0 0 0 1037 9614 35 65 1 0 0
20 0 140 2902016 341912 3952000 0 0 0 0 1046 9739 35 64 1 0 0
17 0 140 2903904 341912 3951888 0 0 0 76 1044 9879 37 63 0 0 0
16 0 140 2904580 341912 3952108 0 0 0 0 1055 9808 34 65 1 0 0

从上面的数据可以看出几点:

  1. context switch(cs) 比 interrupts(in) 要高的多,说明内核不得不来回切换进程
  2. 进一步观察发现 system time(sy) 很高而 user time(us) 很低,而且加上高频度的上下文切换 (cs),说明正在运行的应用程序调用了大量的系统调用
  3. run queue(r) 在 14 个线程以上,而这个机器的硬件配置 (4 核),应该保持在 12 以内。

iostat 工具

iostat是I/O statistics(输入/输出统计)的缩写,iostat工具将对系统的磁盘操作活动进行监视。它的特点是汇报磁盘活动统计情况,同时也会汇报出CPU使用情况。iostat属于sysstat软件包。可以用yum install sysstat 直接安装。

20180725153253123443993.png

cpu属性值说明:

%user:CPU处在用户模式下的时间百分比。

%nice:CPU处在带NICE值的用户模式下的时间百分比。

%system:CPU处在系统模式下的时间百分比。

%iowait:CPU等待输入输出完成时间的百分比。

%steal:管理程序维护另一个虚拟处理器时,虚拟CPU的无意识等待时间百分比。

%idle:CPU空闲时间百分比。

如果%iowait的值过高,表示硬盘存在I/O瓶颈,%idle值高,表示CPU较空闲,如果%idle值高但系统响应慢时,有可能是CPU等待分配内存,此时应加大内存容量。%idle值如果持续低于10,那么系统的CPU处理能力相对较低,表明系统中最需要解决的资源是CPU。

disk属性值说明:

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百分比

如果 %util 接近 100%,说明产生的I/O请求太多,I/O系统已经满负荷,该磁盘可能存在瓶颈。

如果 svctm 比较接近 await,说明 I/O 几乎没有等待时间;

如果 await 远大于 svctm,说明I/O 队列太长,io响应太慢,则需要进行必要优化。

如果avgqu-sz比较大,也表示有大量io在等待。

  • sar 工具

sar是System Activity Reporter(系统活动情况报告)的缩写。sar工具将对系统当前的状态进行取样,然后通过计算数据和比例来表达系统的当前运行状态。

  • 查看 cpu使用率

sar -u

20180726153257950431065.png

%user 用户模式下消耗的CPU时间的比例;

%nice 通过nice改变了进程调度优先级的进程,在用户模式下消耗的CPU时间的比例

%system 系统模式下消耗的CPU时间的比例;

%iowait CPU等待磁盘I/O导致空闲状态消耗的时间比例;

%steal 利用Xen等操作系统虚拟化技术,等待其它虚拟CPU计算占用的时间比例;

%idle CPU空闲时间比例;

查看平均负载

sar -q

20180726153257961321989.png

runq-sz:运行队列的长度(等待运行的进程数)

plist-sz:进程列表中进程(processes)和线程(threads)的数量

ldavg-1:最后1分钟的系统平均负载

ldavg-5:过去5分钟的系统平均负载

ldavg-15:过去15分钟的系统平均负载

查看内存使用状况

sar -r

20180726153257975922020.png

kbmemfree:这个值和free命令中的free值基本一致,所以它不包括buffer和cache的空间.

kbmemused:这个值和free命令中的used值基本一致,所以它包括buffer和cache的空间.

%memused:物理内存使用率,这个值是kbmemused和内存总量(不包括swap)的一个百分比.

kbbuffers和kbcached:这两个值就是free命令中的buffer和cache.

kbcommit:保证当前系统所需要的内存,即为了确保不溢出而需要的内存(RAM+swap).

%commit:这个值是kbcommit与内存总量(包括swap)的一个百分比.

sar参数说明

-A 汇总所有的报告

-a 报告文件读写使用情况

-B 报告附加的缓存的使用情况

-b 报告缓存的使用情况

-c 报告系统调用的使用情况

-d 报告磁盘的使用情况

-g 报告串口的使用情况

-h 报告关于buffer使用的统计数据

-m 报告IPC消息队列和信号量的使用情况

-n 报告命名cache的使用情况

-p 报告调页活动的使用情况

-q 报告运行队列和交换队列的平均长度

-R 报告进程的活动情况

-r 报告没有使用的内存页面和硬盘块

-u 报告CPU的利用率

-v 报告进程、i节点、文件和锁表状态

-w 报告系统交换活动状况

-y 报告TTY设备活动状况