linux通过top和iostat查找io性能瓶颈

有时我们希望程序最大程度地提高性能,比如在进行性能测试,或者需要大量数据需要处理的时候,可是程序性能到一定程度以后,就无法提升了,这时我们想知道主要是什么瓶颈造成了性能提升的限制。

1. top命令

top命令可以从整体上了解性能情况。以下是一台繁忙的机器的top部分输出信息:

# top

top - 10:12:51 up 25 days, 17:54,  1 user,  load average: 3.18, 3.27, 3.44
Tasks: 159 total,   1 running, 158 sleeping,   0 stopped,   0 zombie
%Cpu(s): 23.3 us,  0.9 sy,  0.0 ni, 42.7 id, 33.1 wa,  0.0 hi,  0.0 si,  0.0 st
KiB Mem : 16213768 total,    91924 free,  7002264 used,  9119580 buff/cache
KiB Swap:        0 total,        0 free,        0 used.  8360968 avail Mem 

以下是一台空闲的机器的top部分输出信息:

# top

top - 10:14:26 up 46 days, 23:43,  3 users,  load average: 0.33, 0.24, 0.19
Tasks: 198 total,   1 running, 197 sleeping,   0 stopped,   0 zombie
%Cpu(s):  1.1 us,  0.8 sy,  0.0 ni, 96.8 id,  1.3 wa,  0.0 hi,  0.0 si,  0.0 st
KiB Mem : 16181972 total,   223576 free,  4941164 used, 11017232 buff/cache
KiB Swap:        0 total,        0 free,        0 used. 10424216 avail Mem

us:用户态使用的cpu时间比

sy:系统态使用的cpu时间比

id:空闲的cpu时间比

wa:cpu等待磁盘写入完成时间

1.1 load比较

从load值来看,繁忙机器的数值大概是空闲机器的10倍左右。

1.2 id比较

繁忙机器的空闲cpu为42.7,空闲机器的空闲cpu为96.8。

1.3 wa比较

可以看到繁忙机器的等待时间是33.1,空闲机器的等待时间是1.3,一般来说等待时间小于5是比较正常的,这里达到33了,需要进一步查找原因。借助于iostat命令进行分析。

2. iostat命令

如果提示没有该命令,可以使用yum进行安装。

yum install sysstat

2.1 基本用法

相对繁忙的机器上直接执行命令iostat:

# iostat
Linux 3.10.0-1160.62.1.el7.x86_64 (node-1)      2022年07月02日  _x86_64_        (4 CPU)

avg-cpu:  %user   %nice %system %iowait  %steal   %idle
           0.83    0.00    0.49   12.36    0.00   86.32

Device:            tps    kB_read/s    kB_wrtn/s    kB_read    kB_wrtn
sdd               1.11         0.01        18.49      16313   41157384
sdc              51.03       352.28      1533.06  783968117 3411747088

相对空闲的机器上执行iostat:

# iostat
Linux 3.10.0-1160.25.1.el7.x86_64 (k8s-master)  2022年07月02日  _x86_64_        (4 CPU)

avg-cpu:  %user   %nice %system %iowait  %steal   %idle
           1.50    0.00    1.00    1.35    0.00   96.15

Device:            tps    kB_read/s    kB_wrtn/s    kB_read    kB_wrtn
sda              13.18         0.53        55.28    2149925  224482936
dm-0             13.24         0.41        56.61    1647420  229878556

从tps来看,51的tps明显高于13,从kB_read/s(每秒从设备读取的数据量)对比就更明显了,kB_wrtn/s(每秒向设备写入的数据量)也是区分明显。

2.2 持续查看

# iostat -d -k 2
Linux 3.10.0-1160.62.1.el7.x86_64 (node-1)      2022年07月02日  _x86_64_        (4 CPU)

Device:            tps    kB_read/s    kB_wrtn/s    kB_read    kB_wrtn
sdd               1.11         0.01        18.51      16313   41210464
sdc              51.08       353.59      1533.74  787167641 3414475360
sda               0.36         6.49        12.75   14457942   28377408
sdb               0.04         0.10         2.11     220961    4704120
dm-0              0.25         0.76         4.28    1683335    9530436
dm-1              0.00         0.00         0.00       2072          0
dm-2              0.12         5.73         8.46   12755772   18831532

-k某些使用block为单位的列强制使用Kilobytes为单位;2表示,数据显示每隔2秒刷新一次。

 2.3 扩展参数

# iostat -d -x -k 1 3
Linux 3.10.0-1160.62.1.el7.x86_64 (node-1)      2022年07月02日  _x86_64_        (4 CPU)

Device:         rrqm/s   wrqm/s     r/s     w/s    rkB/s    wkB/s avgrq-sz avgqu-sz   await r_await w_await  svctm  %util
sdd               0.00     0.83    0.00    1.11     0.01    18.52    33.28     0.04   31.91   10.02   31.92   6.54   0.73
sdc               0.00    10.05   10.31   40.78   354.05  1533.96    73.91     0.52   10.20   21.38    7.38   6.57  33.59
sda               0.00     0.01    0.09    0.27     6.49    12.75   105.70     0.01   23.80    2.65   30.72   3.39   0.12

 相关参数说明如下:

rrqm/s:每秒进行 merge 的读操作数目
wrqm/s:每秒进行 merge 的写操作数目
r/s: 每秒完成的读 I/O 设备次数,即 delta(rio)/s 。
w/s: 每秒完成的写 I/O 设备次数,即 delta(wio)/s 。
rKB/s:每秒读K字节数
wKB/s:每秒写K字节数
avgrq-sz: 平均每次设备I/O操作的数据大小 (扇区),即elta(rsect+wsect)/delta(rio+wio)。
avgqu-sz 是平均请求队列的长度。毫无疑问,队列长度越短越好。
await:平均每次设备I/O操作的等待时间 (毫秒),即 delta(ruse+wuse)/delta(rio+wio)。这里可以理解为IO的响应时间,一般地系统IO响应时间应该低于5ms,如果大于10ms就比较大了。
svctm    表示平均每次设备I/O操作的服务时间(以毫秒为单位)。
%util:代表磁盘繁忙程度。100% 表示磁盘繁忙, 0%表示磁盘空闲。

繁忙机器的性能参数:

# iostat -d -x -k 1 3
Linux 3.10.0-1160.62.1.el7.x86_64 (node-1)      2022年07月02日  _x86_64_        (4 CPU)

Device:         rrqm/s   wrqm/s     r/s     w/s    rkB/s    wkB/s avgrq-sz avgqu-sz   await r_await w_await  svctm  %util
sdd               0.00     0.00    0.00    0.00     0.00     0.00     0.00     0.00    0.00    0.00    0.00   0.00   0.00
sdc               0.00     6.00   90.00  100.00  2992.00  5612.00    90.57    10.55   54.09   26.28   79.12   5.25  99.80
sda               0.00     0.00    0.00    0.00     0.00     0.00     0.00     0.00    0.00    0.00    0.00   0.00   0.00

空闲机器的性能参数:

# iostat -d -x -k 1 3
Linux 3.10.0-1160.25.1.el7.x86_64 (k8s-master)  2022年07月02日  _x86_64_        (4 CPU)

Device:         rrqm/s   wrqm/s     r/s     w/s    rkB/s    wkB/s avgrq-sz avgqu-sz   await r_await w_await  svctm  %util
sda               0.00     0.00    0.00   18.00     0.00    52.00     5.78     0.08    4.33    0.00    4.33   4.33   7.80
dm-0              0.00     0.00    0.00   18.00     0.00    52.00     5.78     0.08    4.33    0.00    4.33   4.33   7.80
dm-1              0.00     0.00    0.00    0.00     0.00     0.00     0.00     0.00    0.00    0.00    0.00   0.00   0.00
dm-2              0.00     0.00    0.00    0.00     0.00     0.00     0.00     0.00    0.00    0.00    0.00   0.00   0.00

主要可以从avgqu-sz(10.55比0.08)、await(54.09比4.33)和%util(99.8比7.8)的对比中,可以看到性能对比参数。

  • 0
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值