Linux对机器进行性能分析之IO篇

前言

IO 和 存储密切相关,存储可以概括为磁盘,内存,缓存,三者读写的性能差距非常大,磁盘读写是毫秒级的(一般 0.1-10ms),内存读写是微妙级的(一般
0.1-10us),cache 是纳秒级的(一般 1-10ns)。但这也是牺牲其他特性为代价的,速度快的,价格越贵,容量也越小。
IO 性能这块,我们更多关注的是读写磁盘的性能。首先,先了解下磁盘的基本信息。

磁盘基本信息

fdisk

查看磁盘信息,包括磁盘容量,扇区大小,IO 大小等信息,常用 fdisk -l查看:
在这里插入图片描述可以看到dev下有一个21.5G的固态,一共4k多万个扇区,每个扇区512字节,IO大小也是512字节。

df

查看磁盘使用情况,通常看磁盘使用率:

[root@master ~]# df
Filesystem            1K-blocks    Used Available Use% Mounted on
/dev/mapper/rhel-root  17811456 4438164  13373292  25% /
devtmpfs                 914540       0    914540   0% /dev
tmpfs                    931596     200    931396   1% /dev/shm
tmpfs                    931596   10644    920952   2% /run
tmpfs                    931596       0    931596   0% /sys/fs/cgroup
/dev/nvme0n1p1          1038336  182532    855804  18% /boot
tmpfs                    186320      28    186292   1% /run/user/0
/dev/sr0                4391278 4391278         0 100% /run/media/root/RHEL-7.6 Server.x86_64

磁盘性能分析

vmstat

第一个较为常用的还是这个万能的 vmstat:
在这里插入图片描述对于 IO,我们常关注三个部分:

  • b 值:表示因为 IO 阻塞排队的任务数
  • bi 和 bo 值:表示每秒读写磁盘的块数,bi(block in)是写磁盘,
    bo(block out)是读磁盘。
  • wa 值:表示因为 IO 等待(wait)而消耗的 CPU 比例。
    一般这几个值偏大,都意味着系统 IO 的消耗较大,对于读请求较大的服务器,b、bo、wa 的值偏大,而写请求较大的服务器,b、bi、wa 的值偏大。

iostat

vmstat 虽然万能,但是它分析的东西有限,iostat 是专业分析 IO 性能的工具,可以方便查看 CPU、网卡、tty 设备、磁盘、CD-ROM 等等设备的信息,非常强大,总结下来,共有以下几种用法:

  1. iostat -c 查看部分CPU使用情况:

     [root@master ~]# iostat -c
     Linux 3.10.0-957.el7.x86_64 (master) 	08/04/2020 	_x86_64_	(1 CPU)
     
     avg-cpu:  %user   %nice %system %iowait  %steal   %idle
                3.98    0.06    3.59    0.01    0.00   92.36
    

这里显示的是多个 CPU 的平均值,每个字段的含义我就不多解释了,我一般会重点关注 %iowait 和 %idle,分别表示 CPU 等待 IO 完成时间的百分比和 CPU空闲时间百分比。
如果 %iowait 较高,则表明磁盘存在 IO 瓶颈,如果 %idle 较高,则 CPU 比较空闲,如果两个值都比较高,则有可能 CPU 在等待分配内存,瓶颈在内存,此时
应该加大内存,如果 %idle 较低,则此时瓶颈在 CPU,应该增加 CPU 资源。

  1. iostat -d 查看磁盘使用情况,主要是显示 IOPS 和吞吐量信息(-k : 以KB 为单位显示,-m:以 M 为单位显示):
    在这里插入图片描述其中,几个参数分别解释如下:
  • tps:设备每秒的传输次数(transfers per second)也就是读写次
    数。
  • kB_read/s 和 kB_wrtn/s:每秒读写磁盘的数据量。
  • kB_read 和 kB_wrtn:读取磁盘的数据总量。
  1. iostat -x 查看磁盘详细信息:
    在这里插入图片描述其中,几个参数解释如下;
  • rrqm/s 和 wrqm/s:分别每秒进行合并的读操作数和写操作数,这是什么意思呢,合并就是说把多次 IO 请求合并成少量的几次,这样可以减小 IO 开销,buffer 存在的意义就是为了解决这个问题的。

  • r/s 和 w/s:每秒磁盘读写的次数。这两个值相加就是 tps。

  • rkB/s 和 wkB/s:每秒磁盘读写的数据量,这两个值和上面的kB_read/s、kB_wrnt/s 是一样的。

  • avgrq-sz:平均每次读写磁盘扇区的大小。

  • avgqu-sze:平均 IO 队列长度。队列长度越短越好。

  • await:平均每次磁盘读写的等待时间(ms)。

  • svctm:平均每次磁盘读写的服务时间(ms)。

  • %util:一秒钟有百分之多少的时间用于磁盘读写操作。
    以上这些参数太多了,我们并不需要每个都关注,可以重点关注两个:

  • %util:衡量 IO 的繁忙程度
    这个值越大,说明产生的 IO 请求较多,IO 压力较大,我们可以结合 %idle 参数
    来看,如果 %idle < 70% 就说明 IO 比较繁忙了。也可以结合 vmstat 的 b 参数
    (等待 IO 的进程数)和 wa 参数(IO 等待所占 CPU 时间百分比)来看,如果
    wa > 30% 也说明 IO 较为繁忙。

  • await:衡量 IO 的响应速度
    通俗理解,await 就像我们去医院看病排队等待的时间,这个值和医生的服务速
    度(svctm)和你前面排队的人数(avgqu-size)有关。如果 svctm 和 await 接
    近,说明磁盘 IO 响应时间较快,排队较少,如果 await 远大于 svctm,说明此
    时队列太长,响应较慢,这时可以考虑换性能更好的磁盘或升级 CPU。

  1. iostat 1 2 默认显示 cpu 和 吞吐量信息,1 定时 1s 显示,2 显示 2 条信息
    在这里插入图片描述

进程IO性能分析

有了以上两个命令,基本上能对磁盘 IO 的信息有个全方位的了解了。但如果要确定具体哪个进程的 IO 开销较大,这就得借助另外的工具了。

iotop

这个命令类似 top,可以显示每个进程的 IO 情况,有了这个命令,就可以定位具体哪个进程的 IO 开销比较大了。
在这里插入图片描述

后记

总结下,fdisk -l 和 df 查看磁盘基本信息,iostat -d 查看磁盘IOPS 和吞吐量,iostat -x 结合 vmstat 查看磁盘的繁忙程度和处理效率。

猜你喜欢

转载自blog.csdn.net/Thorne_lu/article/details/107760313