Linux常用性能监控命令

2024/5/13 语法

# Top

op命令可以显示当前系统的整体资源使用情况,并以动态的方式实时更新。在终端输入top命令后,可以看到CPU使用率、内存使用率、进程信息等,按q键可以退出

常用命令

# 每隔五秒刷新一次进程列表
top -d 5
# 只显示以root用户启动的进程
top -u root
# 只显示PID=1的进程
top -p 1
# 每隔5秒显示pid是12345和pid是6789的两个进程的资源占用情况
top -p 12345 -p 6789
# 每隔2秒显示pid是12345的进程的资源使用情况,并显式该进程启动的命令行参数
top -d 2 -c -p 123456
# 使用 PID 字段降序排序
top -o -PID
# 使用 PID 字段降序排序
top -o -PID
# 不显示任何闲置 (idle) 或无用 (zombie) 的进程
top -i
# 每隔5秒显式进程的资源占用情况,并显示进程的命令行参数(默认只有进程名)
top -c
 
#执行top命令后,按 shift + f(小写)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20

# 1. Top返回结果说明

统计信息区其内容如下:前五行是系统整体的统计信息

top - 01:06:48 up  1:22,  1 user,  load average: 0.06, 0.60, 0.48
Tasks:  29 total,   1 running,  28 sleeping,   0 stopped,   0 zombie
Cpu(s):  0.3% us,  1.0% sy,  0.0% ni, 98.7% id,  0.0% wa,  0.0% hi,  0.0% si
Mem:    191272k total,   173656k used,    17616k free,    22052k buffers
Swap:   192772k total,        0k used,   192772k free,   123988k cached
 
PID USER      PR  NI  VIRT  RES  SHR S %CPU %MEM    TIME+  COMMAND
1379 root      16   0  7976 2456 1980 S  0.7  1.3   0:11.03 sshd
14704 root      16   0  2128  980  796 R  0.7  0.5   0:02.72 top
1 root      16   0  1992  632  544 S  0.0  0.3   0:00.90 init
2 root      34  19     0    0    0 S  0.0  0.0   0:00.00 ksoftirqd/0
3 root      RT   0     0    0    0 S  0.0  0.0   0:00.00 watchdog/0
1
2
3
4
5
6
7
8
9
10
11
12

  • # 第一行 任务队列信息,同 uptime 命令的执行结果

    #当前系统运行相关
    01:06:48    当前时间
    up 1:22    系统运行时间,格式为时:分
    1 user    当前登录用户数
    load average: 0.06, 0.60, 0.48    系统负载,即任务队列的平均长度。三个数值分别为 1分钟、5分钟、15分钟前到现在的平均值
    
    #load average代表CPU的压力情况,如果负载值超过了当前系统CPU的逻辑核数,则表示CPU已经处理不过来了,此时会出现线程等待的情况
    
    1
    2
    3
    4
    5
    6
    7
  • # 第二行 系统进程数状态

    # 当有多个CPU时,这些内容可能会超过两行。内容如下:
    # 运行进程相关
    Tasks:
    total 进程总数
    running 正在运行的进程数
    sleeping 睡眠的进程数
    stopped 停止的进程数
    zombie 僵尸进程数
    
    1
    2
    3
    4
    5
    6
    7
    8

  • # 第三行 CPU的信息

    # 当有多个CPU时,这些内容可能会超过两行。内容如下:
    # CPU相关
    Cpu(s): 
    0.3% us 	 用户空间占用CPU百分比
    1.0% sy 	 内核空间占用CPU百分比
    0.0% ni 	 用户进程空间内改变过优先级的进程占用CPU百分比
    98.7% id 	 空闲CPU百分比
    0.0% wa 	 等待输入输出的CPU时间百分比
    0.0%hi:		硬件CPU中断占用百分比
    0.0%si:		软中断占用百分比
    0.0%st:		虚拟机占用百分比
    
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11

  • # 第四行 物理内存的使用情况

    Mem:
    191272k total    物理内存总量
    173656k used    使用的物理内存总量
    17616k free    空闲内存总量
    22052k buffers    用作内核缓存的内存量
    
    1
    2
    3
    4
    5

  • # 第五行 交换分区内存的使用情况

    Swap: 
    192772k total    交换区总量
    0k used    使用的交换区总量
    192772k free    空闲交换区总量
    123988k cached    缓冲的交换区总量,内存中的内容被换出到交换区,而后又被换入到内存,但使用过的交换区尚未被覆盖,该数值即为这些内容已存在于内存中的交换区的大小,相应的内存再次被换出时可不必再对交换区写入。
    
    1
    2
    3
    4
    5

  • # 第六行 进程信息区详情

    #进程信息区统计信息区域的下方显示了各个进程的详细信息:
    a    	PID     	进程id
    b    	PPID    	父进程id
    c    	RUSER   	Real user name
    d    	UID     	进程所有者的用户id
    e    	USER    	进程所有者的用户名
    f    	GROUP   	进程所有者的组名
    g    	TTY     	启动进程的终端名。不是从终端启动的进程则显示为 ?
    h    	PR      	优先级
    i    	NI      	nice值。负值表示高优先级,正值表示低优先级
    j    	P       	最后使用的CPU,仅在多CPU环境下有意义
    k    	%CPU    	上次更新到现在的CPU时间占用百分比
    l    	TIME    	进程使用的CPU时间总计,单位秒
    m    	TIME+   	进程使用的CPU时间总计,单位1/100秒
    n    	%MEM    	进程使用的物理内存百分比
    o    	VIRT    	进程使用的虚拟内存总量,单位kb。VIRT=SWAP+RES
    p    	SWAP    	进程使用的虚拟内存中,被换出的大小,单位kb。
    q    	RES     	进程使用的、未被换出的物理内存大小,单位kb。RES=CODE+DATA
    r    	CODE    	可执行代码占用的物理内存大小,单位kb
    s    	DATA    	可执行代码以外的部分(数据段+栈)占用的物理内存大小,单位kb
    t    	SHR     	共享内存大小,单位kb
    u    	nFLT    	页面错误次数
    v    	nDRT    	最后一次写入到现在,被修改过的页面数。
    w    	S       	进程状态(D=不可中断的睡眠状态,R=运行,S=睡眠,T=跟踪/停止,Z=僵尸进程)
    x    	COMMAND 	命令名/命令行
    y    	WCHAN   	若该进程在睡眠,则显示睡眠中的系统函数名
    z    	Flags   	任务标志,参考 sched.h
    
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27

# 2. Top交互操作

  • 常用交互操作

    切换内存信息:m 
    
    切换名字和路径:c
    
    切换显示进程和CPU状态信息:t
    
    翻页:Shift+<  上翻    , Shift+> 下翻
    
    1
    2
    3
    4
    5
    6
    7
  • 其他实用交互操作

k        终止一个进程。系统将提示用户输入需要终止的进程PID,以及需要发送给该进程什么样的信号。一般的终止进程可以使用15信号;如果不能正常结束那就使用信号9强制结束该进程。默认值是信号15。在安全模式中此命令被屏蔽。 
i 		 忽略闲置和僵死进程。这是一个开关式命令。 
q 		 退出程序。 
r 		 重新安排一个进程的优先级别。系统提示用户输入需要改变的进程PID以及需要设置的进程优先级值。输入一个正值将使优先级降低,反之则可以使该进程拥有更高的优先权。默认值是10。 
S 		 切换到累计模式。 
s 		 改变两次刷新之间的延迟时间。系统将提示用户输入新的时间,单位为s。如果有小数,就换算成m s。输入0值则系统将不断刷新,默认值是5 s。需要注意的是如果设置太小的时间,很可能会引起不断刷新,从而根本来不及看清显示的情况,而且系统负载也会大大增加。 
f或者F 	从当前显示中添加或者删除项目。 
o或者O 	改变显示项目的顺序。 
l 		 切换显示平均负载和启动时间信息。 
m 		 切换显示内存信息。 
t 		 切换显示进程和CPU状态信息。 
c 		 切换显示命令名称和完整命令行。 
M 		 根据驻留内存大小进行排序。 
P 		 根据CPU使用百分比大小进行排序。 
T 		 根据时间/累计时间进行排序。 
W 		 将当前设置写入~/.toprc文件中。这是写top配置文件的推荐方法。
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
  • 更改显示项目

    默认情况下仅显示比较重要的 PID、USER、PR、NI、VIRT、RES、SHR、S、%CPU、%MEM、TIME+、COMMAND 列。可以通过下面的快捷键来更改显示内容
    
    更改显示内容:
    1、通过f键可以选择显示的内容
    2、按方向键来选择项目
    3、按d选择或者取消显示项目(被选择的会显示*号)
    4、按ESC退出
    
    1
    2
    3
    4
    5
    6
    7
  • 更改排序顺序

    1、按指定字段排序:top -o 字段名字,如:
    	按照内存排序:top -o %MEM 或者执行完top后,输入大写M
     	按照内存排序:top -o %CPU 或者执行完top后,输入大写P
    	按照内存排序:执行完top后,输入大写T
    默认从大到小,大写R更改为从小到大排序
    
    2、使用<>:
    	shift+>:向右移动一列排序,比如现在是以CPU排序,那么输入>后就按照内存排序,输入R更改排序顺序,向右移动不了了,就表示以最右边的列排序。
    
       shift+<:向左移动一列排序
    
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
  • 过滤

    1、过滤字符串
    	top -bc |grep name_of_process   #过滤含字符串“name_of_process”的
    
    2、过滤用户
    	执行top 指令,按下“u”,顶端出现:Which user (blank for all),输入要过滤的用户名即可
    	
    3、其他过滤 (表达式)
    	执行top  指令,按下“o”,顶端出现:add filter #1 (ignoring case) as: [!]FLD?VAL :
    	过滤用户则输入:USER=ceph
    	过滤command则输入:COMMAND=/opt/h3c/bin/python
    	过滤PID则输入:PID=3289848
    
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11

# 3. top使用格式

  • top使用格式:

    top [-] [d] [p] [q] [c] [C] [S] [s] [n]
    
    1
  • 参数说明

    d 	指定每两次屏幕信息刷新之间的时间间隔。当然用户可以使用s交互命令来改变之。 
    p 	通过指定监控进程ID来仅仅监控某个进程的状态。 
    q 	该选项将使top没有任何延迟的进行刷新。如果调用程序有超级用户权限,那么top将以尽可能高的优先级运行。 
    S 	指定累计模式 
    s 	使top命令在安全模式中运行。这将去除交互命令所带来的潜在危险。 
    i 	使top不显示任何闲置或者僵死进程。 
    c 	显示整个命令行而不只是显示命令名 
    
    1
    2
    3
    4
    5
    6
    7

# 4. 设置top执行几次|top信息写入文件

top -n 1 -b,-n表示执行多少次,-b表示可以重定向到文件中

top命令监控程序的输出信息和时间信息导入到文件中

#!/bin/bash
while [ 1 ]
do

        top_print=`top -n 1 -b|grep mgc`
        time=`date`
        space="  "
        print_str=$time$space$top_print
        echo $print_str >> ./date.txt
        sleep 3
done

# 其中top_print参数中使用grep,可以通过这个grep来过滤自己关心的程序信息记录下来
# top -n 1 -b,-n表示执行多少次,-b表示可以重定向到文件中
1
2
3
4
5
6
7
8
9
10
11
12
13
14

# sysstat系统性能监控

Linux Sysstat是linux系统免费提供用于收集主机性能的一个软件包,不是默认安装的,需要自己安装。

sysstat 是 Linux 系统中的常用工具包。它的主要用途是观察服务负载,比如CPU和内存的占用率、网络的使用率以及磁盘写入和读取速度等。

sysstat 工具包中包含两类工具:

即时查看工具:iostat、mpstat、sar

累计统计工具:sar

也就是说,sar 具有这两种功能。因此,sar 是 sysstat 中的核心工具

# 1. 包含的工具

工具名 作用
iostat 输出CPU的统计信息和所有I/O设备的输入输出(I/O)统计信息
mpstat 关于CPU的详细信息(单独输出或者分组输出)
pidstat 关于运行中的进程/任务、CPU、内存等的统计信息
sar 保存并输出不同系统资源(CPU、内存、IO、网络、内核等)的详细信息
sadc 系统活动数据收集器,用于收集sar工具的后端数据
sa1 系统收集并存储sadc数据文件的二进制数据,与sadc工具配合使用
sa2 配合sar工具使用,产生每日的摘要报告
sadf 用于以不同的数据格式(CVS或者XML)来格式化sar工具的输出
sysstat sysstat 工具包的 man 帮助页面。
nfsiostat NFS(Network File System)的I/O统计信息
cifsiostat CIFS(Co

# 2. 安装sysstat

  • CentOS

    # 通过yum安装
    yum install sysstat
    
    
    # 通过rpm包安装-推荐rpm包方式安装,因为能随时安装最新版本
    wget -c http://pagesperso-orange.fr/sebastien.godard/sysstat-11.7.3-1.x86_64.rpm
    sudo rpm -Uvh sysstat-11.7.3-1.x86_64.rpm
    # Ubuntu
    
    
    1
    2
    3
    4
    5
    6
    7
    8
    9
  • Ubuntu

    apt-get install sysstat
    
    1
  • 查看是否安装成功

    #查看是否安装成功
    mpstat -V
    
    sysstat version 9.0.4
    (C) Sebastien Godard (sysstat <at> orange.fr)
    
    1
    2
    3
    4
    5

# 3. sar 命令

sar 命令是分析系统瓶颈的神器,可以用来查看 CPU 、内存、磁盘、网络等性能

具体详情:https://blog.csdn.net/bandaoyu/article/details/121169011

sar 命令的输出能够用于识别服务器瓶颈。但是,分析 sar 命令提供的信息可能比较困难,所以要使用 kSar 工具。kSar 工具可以将 sar 命令的输出绘制成基于时间周期的、易于理解的图表。

官网介绍:https://github.com/vlsi/ksar

sar 命令查看当前磁盘性能的命令为:sar -d -p 1 2

# 参数说明
-d 		参数代表查看磁盘性能
-p		参数代表将 dev 设备按照 sda,sdb……名称显示
1		代表每隔1s采取一次数值
2		代表总共采取2次数值。

await 	平均每次设备 I/O 操作的等待时间(以毫秒为单位)。 
svctm 	平均每次设备 I/O 操作的服务时间(以毫秒为单位)。
%util 	一秒中有百分之几的时间用于 I/O 操作。 
1
2
3
4
5
6
7
8
9

下面是命令执行的示例:

Linux 4.18.0-147.el8.x86_64 (ZHCP-jk) 	05/13/2024 	_x86_64_	(8 CPU)

11:02:42 AM       DEV       tps     rkB/s     wkB/s   areq-sz    aqu-sz     await     svctm     %util
11:02:43 AM       vda      0.00      0.00      0.00      0.00      0.00      0.00      0.00      0.00
11:02:43 AM       vdb      1.00      0.00     16.00     16.00      4.24   4239.00      1.00      0.10
11:02:43 AM       sr0      0.00      0.00      0.00      0.00      0.00      0.00      0.00      0.00

11:02:43 AM       DEV       tps     rkB/s     wkB/s   areq-sz    aqu-sz     await     svctm     %util
11:02:44 AM       vda      0.00      0.00      0.00      0.00      0.00      0.00      0.00      0.00
11:02:44 AM       vdb      1.00      0.00     16.00     16.00      5.24   5239.00      1.00      0.10
11:02:44 AM       sr0      0.00      0.00      0.00      0.00      0.00      0.00      0.00      0.00

Average:          DEV       tps     rkB/s     wkB/s   areq-sz    aqu-sz     await     svctm     %util
Average:          vda      0.00      0.00      0.00      0.00      0.00      0.00      0.00      0.00
Average:          vdb      1.00      0.00     16.00     16.00      4.74   4739.00      1.00      0.10
Average:          sr0      0.00      0.00      0.00      0.00      0.00      0.00      0.00      0.00
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16

对于磁盘 IO 性能,一般有如下评判标准

  • 正常情况下 svctm 应该是小于 await 值的,而 svctm 的大小和磁盘性能有关,CPU 、内存的负荷也会对 svctm 值造成影响,过多的请求也会间接的导致 svctm 值的增加。

  • await 值的大小一般取决与 svctm 的值和 I/O 队列长度以 及I/O 请求模式,如果 svctm 的值与 await 很接近,表示几乎没有 I/O 等待,磁盘性能很好,如果 await 的值远高于 svctm 的值,则表示 I/O 队列等待太长,系统上运行的应用程序将变慢,此时可以通过更换更快的硬盘来解决问题。

  • %util 项的值也是衡量磁盘 I/O 的一个重要指标,如果 %util 接近 100% ,表示磁盘产生的 I/O 请求太多,I/O 系统已经满负荷的在工作,该磁盘可能存在瓶颈。长期下去,势必影响系统的性能,可以通过优化程序或者通过更换更高、更快的磁盘来解决此问题。

默认情况下,sar从最近的0点0分开始显示数据;如果想继续查看一天前的报告;可以查看保存在/var/log/sa/下的sar日志:

[root@server-68.2.stage.polex.io var ]$ sar -d -p -f  /var/log/sa/sa11  | more

Linux 4.18.0-147.el8.x86_64 (ZHCP-jk) 	05/11/2024 	_x86_64_	(8 CPU)

12:00:10 AM       DEV       tps     rkB/s     wkB/s   areq-sz    aqu-sz     await     svctm     %util
12:10:11 AM       vda      0.25      0.00      3.13     12.37      0.00      5.51      0.68      0.02
12:10:11 AM       vdb      6.90      0.81     65.27      9.58      0.00      0.82      0.60      0.41
12:10:11 AM       sr0      0.00      0.00      0.00      0.00      0.00      0.00      0.00      0.00
12:20:11 AM       vda      0.15      0.00      1.04      6.84      0.00      1.02      0.88      0.01
12:20:11 AM       vdb      6.47      0.81     58.58      9.18      0.00      0.68      0.60      0.39
12:20:11 AM       sr0      0.00      0.00      0.00      0.00      0.00      0.00      0.00      0.00
12:30:11 AM       vda      0.15      0.00      1.02      6.89      0.00      1.04      0.88      0.01
12:30:11 AM       vdb      6.66      0.81     61.33      9.34      0.00      0.68      0.59      0.40
12:30:11 AM       sr0      0.00      0.00      0.00      0.00      0.00      0.00      0.00      0.00
12:40:11 AM       vda      0.16      0.00      1.12      6.93      0.00      1.21      0.81      0.01
12:40:11 AM       vdb      6.57      0.81     61.11      9.42      0.00      0.68      0.60      0.39
12:40:11 AM       sr0      0.00      0.00      0.00      0.00      0.00      0.00      0.00      0.00
12:50:11 AM       vda      0.25      0.00      1.71      6.92      0.00      1.03      0.61      0.02
12:50:11 AM       vdb      6.50      0.81     58.35      9.10      0.00      0.67      0.60      0.39
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19

# 4. iostat 命令

iostat主要用于监控系统设备的 IO 负载情况,iostat 首次运行时显示自系统启动开始的各项统计信息,之后运行 iostat 将显示自上次运行该命令以后的统计信息。用户可以通过指定统计的次数和时间来获得所需的统计信息。

具体详情:https://blog.csdn.net/bandaoyu/article/details/121126446

  • 命令格式

    iostat [ -c | -d ] [ -k | -m ] [ -t ] [ -V ] [ -x ] [ device [ ... ]  | ALL ] 
      [ -p [ device | ALL ] ] [ interval [ count ] ]
    
    1
    2
  • 常用选项

    选项 说明
    -c 仅显示CPU统计信息。与-d选项互斥
    -d 仅显示磁盘统计信息。与-c选项互斥
    -k 以KB为单位显示每秒的磁盘请求数。默认单位块
    -m 以MB为单位显示每秒的磁盘请求数。默认单位块
    -p {deviceALL} 用于显示块设备及系统分区的统计信息。与-x选项互斥
    -t 在输出数据时,打印搜集数据的时间。
    -V 打印版本号信息。
    -x 输出扩展信息。
    interval 为取样时间间隔
    count 为输出次数,若指定了取样时间间隔且省略此项,将不断产生统计信息
  • 常用命令

    # 每隔5秒显示一次设备吞吐率的统计信息(单位为 块/s)
     iostat -d 5
     
    # 每隔5秒显示一次设备吞吐率的统计信息(单位为 KB/s),共输出3次
     iostat -dk 5 3
     
    # 每隔2秒显示一次 sda 及上面所有分区的统计信息,共输出5次
     iostat -p sda 2 5
     
    # 每隔2秒显示一次 sda 和 sdb 两个设备的扩展统计信息,共输出6次
     iostat -x sda sdb 2 6
    
    # -t是输出时间和日期,5是代表5秒一次,-x是详细情况都输出
    iostat -t 5 -x > iostat.out
    
    # 查看磁盘压力
    iostat -d -x
    
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
  • 示例

    [root@ZHCP-jk ~]# iostat -x sda sdb 2 6
    Linux 2.6.18-53.el5 (cnetos5)   01/21/2008
    
    avg-cpu:  %user   %nice %system %iowait  %steal   %idle
               0.10    0.04    0.37    0.07    0.00   99.42
    
    Device:     rrqm/s   wrqm/s   r/s   w/s   rsec/s   wsec/s avgrq-sz avgqu-sz   await  svctm  %util
    sda           0.17     0.84  0.96  0.47    16.67    10.56    19.01     0.01    7.11   1.25   0.18
    sdb           0.00     0.00  0.01  0.00     0.07     0.00     5.16     0.00    0.22   0.19   0.00
    
    1
    2
    3
    4
    5
    6
    7
    8
    9
  • 输出说明

    • avg-cpu 部分输出项说明:

      字段 说明
      %user 在用户级别运行所使用的 CPU 的百分比。
      %nice nice 操作所使用的 CPU 的百分比。
      %system 在核心级别(kernel)运行所使用 CPU 的百分比。
      %iowait CPU 等待硬件 I/O 所占用 CPU 的百分比。
      %steal 当管理程序(hypervisor)为另一个虚拟进程提供服务而等待虚拟 CPU 的百分比。
      %idle CPU 空闲时间的百分比。
    • Device 部分基本输出项说明:

      字段 说明
      tps 每秒钟物理设备的 I/O 传输总量。
      Blk_read 读入的数据总量,单位为块。
      Blk_wrtn 写入的数据总量,单位为块。
      kB_read 读入的数据总量,单位为KB。
      kB_wrtn 写入的数据总量,单位为KB。
      MB_read 读入的数据总量,单位为MB。
      MB_wrtn 写入的数据总量,单位为MB。
      Blk_read/s 每秒从驱动器读入的数据量,单位为 块/s。
      Blk_wrtn/s 每秒向驱动器写入的数据量,单位为 块/s。
      kB_read/s 每秒从驱动器读入的数据量,单位为KB/s。
      kB_wrtn/s 每秒向驱动器写入的数据量,单位为KB/s。
      MB_read/s 每秒从驱动器读入的数据量,单位为MB/s。
      MB_wrtn/s 每秒向驱动器写入的数据量,单位为MB/s。
    • Device 部分扩展输出项说明:

      字段 说明
      rrqm/s 将读入请求合并后,每秒发送到设备的读入请求数。
      wrqm/s 将写入请求合并后,每秒发送到设备的写入请求数。
      r/s 每秒发送到设备的读入请求数。
      w/s 每秒发送到设备的写入请求数。
      rsec/s 每秒从设备读入的扇区数。
      wsec/s 每秒向设备写入的扇区数。
      rkB/s 每秒从设备读入的数据量,单位为 KB/s。
      wkB/s 每秒向设备写入的数据量,单位为 KB/s。
      rMB/s 每秒从设备读入的数据量,单位为 MB/s。
      wMB/s 每秒向设备写入的数据量,单位为 MB/s。
      avgrq-sz 发送到设备的请求的平均大小,单位为扇区。
      avgqu-sz 发送到设备的请求的平均队列长度。
      await I/O请求平均执行时间。包括发送请求和执行的时间。单位为毫秒。
      svctm 发送到设备的I/O请求的平均执行时间。单位为毫秒。
      %util 在I/O请求发送到设备期间,占用CPU时间的百分比。用于显示设备的带宽利用率。当这个值接近100%时,表示设备带宽已经占满。

# 5. mpstat 命令

mpstat 输出每一个 CPU 的运行状况,为多处理器系统中的 CPU 利用率提供统计信息。

  • 命令格式

    mpstat [ -P { cpu | ALL } ] [ -V ] [ interval [ count ] ]
    
    1
  • 常用选项

    选项 说明
    -P {cpu|ALL} 指定 CPU。用 CPU-ID 指定,CPU-ID 是从0开始的,即第一个CPU为0。ALL 表示所有CPU。
    -V 输出版本号信息。
    interval 为取样时间间隔。指定0则输出自系统启动后的一个统计信息
    count 为输出次数。若指定了取样时间间隔且省略此项,将不断产生统计信息
  • 常用示例

    # 输出所有 CPU 使用情况的统计信息。
    mpstat
    
    # 输出第一个 CPU 使用情况的统计信息。
    mpstat -P 0
    
    # 每隔2秒输出所有CPU的统计信息,共输出5次。
    mpstat 2 5
    
    # 每隔2秒输出一次所有CPU的统计信息,共输出5次。
    mpstat -P ALL 2 5
    
    # 每隔2秒输出一次第二个CPU的统计信息,共输出5次。
    mpstat -P 1 2 5
    
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
  • 示例

    [root@ZHCP-jk ~]# mpstat
    Linux 2.6.18-53.el5 (cnetos5)   01/21/2008
    
    10:39:06 AM  CPU   %user   %nice    %sys %iowait    %irq   %soft  %steal   %idle    intr/s
    10:39:06 AM  all    0.10    0.04    0.31    0.06    0.04    0.01    0.00   99.45   1012.99
    
    1
    2
    3
    4
    5
  • 输出项说明

    CPU 在多CPU系统里,每个CPU有一个ID号,第一个CPU为0。all表示统计信息为所有CPU的平均值。
    %user 显示在用户级别运行所占用CPU总时间的百分比。
    %nice 显示在用户级别,用于nice操作,所占用CPU总时间的百分比。
    %sys 显示在kernel级别运行所占用CPU总时间的百分比。注意:这个值并不包括服务中断和softirq。
    %iowait 显示用于等待I/O操作时,占用CPU总时间的百分比。
    %irq 显示用于中断操作,占用CPU总时间的百分比。
    %soft 显示用于softirq操作,占用CPU总时间的百分比。
    %steal 管理程序(hypervisor)为另一个虚拟进程提供服务而等待虚拟 CPU 的百分比。
    %idle 显示CPU在空闲状态,占用CPU总时间的百分比。
    intr/s 显示CPU每秒接收到的中断总数。

# 查看磁盘 IO 性能

注:除了上面的 sysstat 各种以外的命令

# 1. top 命令

top 命令通过查看 CPU 的 wa% 值来判断当前磁盘 IO 性能,如果这个数值过大,很可能是磁盘 IO 太高了,当然也可能是其他原因,例如网络 IO 过高等。

# 2. vmstat 命令

  • 语法

    vmstat [delay/count/d/D/t/w]
    
    1
  • 常用选项

    选项 说明
    delay 刷新时间间隔,单位是秒(如果没有指定,只显示一条结果)
    count 即输入刷新打印3次结果,如果没有指定刷新次数,但指定了刷新时间间隔,这时刷新次数就是不限制一直刷新直到手动停止。
    **-d ** 磁盘
    -D 磁盘总和
    -t 时间戳,将时间戳附加到每一行
    -w 宽输出模式,输出宽度大于80每行字符。
    -S 显示单位
    -V 版本信息
  • 示例

    [root@server-68.2.stage.polex.io var ]$ vmstat  2
    procs -----------memory---------- ---swap-- -----io---- -system-- ------cpu-----
     r  b   swpd   free   buff  cache   si   so    bi    bo   in   cs us sy id wa st
     3  0      0 93221488   4176 69117136    0    0     0     1    0    0  4  1 94  0  0
     2  0      0 93226048   4176 69117128    0    0     0     0 33326 36671 18  2 80  0  0
     1  0      0 93218776   4176 69117104    0    0     0     9 26225 21588 18  2 80  0  0
     1  0      0 93226072   4176 69117072    0    0     0     0 13271 25857  5  0 94  0  0
     0  0      0 93223984   4176 69117040    0    0     0     5 34637 24444 20  2 78  0  0
    11  0      0 93219248   4176 69117184    0    0     0     0 30736 20671  8  2 90  0  0
    
    1
    2
    3
    4
    5
    6
    7
    8
    9
  • 输出说明

    字段 说明
    r 可运行进程数(正在运行或等待运行时), 也就是说有真正分配给cpu的进程,如果r值大于cpu核数,出现cpu负载,就会有可能出现cpu瓶颈
    b 阻塞等待I/O完成的进程数,当b大于0时,出现阻塞,一旦出现阻塞的话tps就不会很大,这个可以使用工具sar来查看tps实时值
    swpd: 使用的交换内存量,当swpd值大于0时,说明服务器的物理内存不足,需要查看程序是否存在内存泄漏,如果确定不是的话需要增加服务器的物理内存
    free 空闲内存量
    buff 用作缓冲区的内存量
    cache: 活动内存的数量
    si(kb/秒) 从磁盘交换到内存的交换页数量(kb/秒),如果si值大于0,则表示物理内存不足或是内存泄漏
    so(kb/秒) 从内存交换到磁盘的交换页数据(kb/秒),与si值一样,如果so值大于0,则表示物理内存不足或是内存泄漏
    bi 块设备每秒接收的块数量,这里的块设备是指系统上所有的磁盘和其他块设备,默认块大小是 1024 byte
    bo 块设备每秒发送的块数量,例如我们读取文件,bo 就要大于0。bi 和 bo 一般都要接近 0,不然就是 IO 过于频繁,需要调整
    in 每秒的中断次数,包括时钟
    cs 每秒上下文切换的次数,如调用系统函数,或是线程切换等都会引起上下文切换

# 测试磁盘 IO 性能

# 1. hdparm 命令

hdparm 命令提供了一个命令行的接口用于读取和设置IDE或SCSI硬盘参数,注意该命令只能测试磁盘的读取速率。

测试 sda 磁盘的读取速率:

[root@server-68.2.stage.polex.io var ]$ hdparm -Tt /dev/polex_pv/varvol
 
/dev/polex_pv/varvol:
 Timing cached reads:   15588 MB in  2.00 seconds = 7803.05 MB/sec
 Timing buffered disk reads: 1128 MB in  3.01 seconds = 374.90 MB/sec
 
#从测试结果看出,带有缓存的读取速率为:7803.05MB/s ,磁盘的实际读取速率为:374.90 MB/s
1
2
3
4
5
6
7

# 2. dd 命令

Linux dd 命令用于读取、转换并输出数据。dd 可从标准输入或文件中读取数据,根据指定的格式来转换数据,再输出到文件、设备或标准输出。

我们可以利用 dd 命令的复制功能,测试某个磁盘的 IO 性能,须要注意的是 dd 命令只能大致测出磁盘的 IO 性能,不是非常准确

  • 测试写性能命令:

    [root@server-68.2.stage.polex.io var ]$ time dd if=/dev/zero of=test.file bs=1G count=2 oflag=direct
    2+0 records in
    2+0 records out
    2147483648 bytes (2.1 GB) copied, 13.5487 s, 159 MB/s
     
    real    0m13.556s
    user    0m0.000s
    sys    0m0.888s 
    
    1
    2
    3
    4
    5
    6
    7
    8

    可以看到,该分区磁盘写入速率为 159M/s,其中:

    • /dev/zero 伪设备,会产生空字符流,对它不会产生 IO 。

    • if 参数用来指定 dd 命令读取的文件。

    • of 参数用来指定 dd 命令写入的文件。

    • bs 参数代表每次写入的块的大小。

    • count 参数用来指定写入的块的个数。

    • offlag=direc 参数测试 IO 时必须指定,代表直接写如磁盘,不使用 cache 。

  • 测试读性能命令:

    [root@server-68.2.stage.polex.io var ]$ dd if=test.file of=/dev/null  iflag=direct
    4194304+0 records in
    4194304+0 records out
    2147483648 bytes (2.1 GB) copied, 4.87976 s, 440 MB/s
    
    1
    2
    3
    4

    看到,该分区的读取速率为 440MB/s

# 3. fio 命令

fio 命令是专门测试 iops 的命令,比 dd 命令准确,fio 命令的参数很多

详情:https://blog.csdn.net/bandaoyu/article/details/113190057

# 顺序读:
fio -filename=/var/test.file -direct=1 -iodepth 1 -thread -rw=read -ioengine=psync -bs=16k -size=2G -numjobs=10 -runtime=60 -group_reporting -name=test_r

# 随机写:
fio -filename=/var/test.file -direct=1 -iodepth 1 -thread -rw=randwrite -ioengine=psync -bs=16k -size=2G -numjobs=10 -runtime=60 -group_reporting -name=test_randw

# 顺序写:
fio -filename=/var/test.file -direct=1 -iodepth 1 -thread -rw=write -ioengine=psync -bs=16k -size=2G -numjobs=10 -runtime=60 -group_reporting -name=test_w

# 混合随机读写: 
fio -filename=/var/test.file -direct=1 -iodepth 1 -thread -rw=randrw -rwmixread=70 -ioengine=psync -bs=16k -size=2G -numjobs=10 -runtime=60 -group_reporting -name=test_r_w -ioscheduler=noop
1
2
3
4
5
6
7
8
9
10
11