0%

Linux IO

I/O相关的应用通常用来处理大量数据,需要大量内存和存储,频繁I/O操作读、写数据


前言

IO 是运维过程中比较关注的点。阅读Linux性能监测:IO篇

实操

说到实际的,那就要说说实际运维工作中,如何发现IO性能瓶颈

iostat。通过这个神器,就可以监视具体的磁盘性能了。

iostat -x 1 20 每一秒显示一次详细信息,共显示20次。 -x 显示详细信息 / -d 显示磁盘使用情况

1
2
3
4
5
6
7
8
[user1@Test_Server ~]$ iostat -x
Linux 3.10.0-693.2.2.el7.x86_64 (jellythink) 01/05/2019 _x86_64_ (1 CPU)

avg-cpu: %user %nice %system %iowait %steal %idle
1.83 0.00 0.31 0.09 0.00 97.77

Device: rrqm/s wrqm/s r/s w/s rkB/s wkB/s avgrq-sz avgqu-sz await r_await w_await svctm %util
vda 0.03 0.78 0.24 1.38 12.64 20.67 41.01 0.02 10.98 55.50 3.17 0.71 0.12

具体解释详细请阅读Linux iostat命令详解

关注性能监控指标

  • %iowait: 如果该值较高,表示磁盘存在I/O瓶颈
  • await: 一般地,系统I/O响应时间应该低于5ms,如果大于10ms就比较大了。另一方面如果 svctm 比较接近 await,说明 I/O 几乎没有等待时间;如果 await 远大于 svctm,说明I/O 队列太长,io响应太慢,则需要进行必要优化。
  • %util: 一秒中有百分之多少的时间用于I/O操作,即被IO消耗的CPU百分比,一般地,如果该参数是100%表示设备已经接近满负荷运行了
  • avgqu-sz: 如果avgqu-sz比较大,也表示有当量io在等待。如果单块磁盘的队列长度持续超过2,一般认为该磁盘存在I/O性能问题。

但是,在实际运维工作中,都希望找到是哪个进程消耗了IO,所以终极目的是找到这个进程ID。可是通过 iostat 都没法达到目的。
所以,神器pidstat命令就登场了,通过这个命令,就可以知道是谁在后台偷用IO了。

pidstat 是 sysstat 工具的一个命令,如果服务器上没有现成的,不要着急。CentOS 使用yum install sysstat 安装

使用 -d 选项,可以查看进程IO的统计信息

1
2
3
4
5
6
7
8
9
10
11
12
13
[root@massive-dataset-new-002 ~]# pidstat -d 1
Linux 2.6.32-431.el6.x86_64 (massive-dataset-new-002) 08/28/2019 _x86_64_ (8 CPU)

03:28:50 PM PID kB_rd/s kB_wr/s kB_ccwr/s Command
03:28:51 PM 438 0.00 3.96 0.00 jbd2/dm-1-8
03:28:51 PM 21406 0.00 126.73 0.00 mysqld

03:28:51 PM PID kB_rd/s kB_wr/s kB_ccwr/s Command
03:28:52 PM 438 0.00 4.00 0.00 jbd2/dm-1-8
03:28:52 PM 969 0.00 4.00 0.00 flush-253:1
03:28:52 PM 14200 0.00 4.00 0.00 java
03:28:52 PM 21406 0.00 8.00 0.00 mysqld
03:28:52 PM 24608 0.00 8.00 0.00 java
1
2
3
kB_rd/s: 每秒进程从磁盘读取的数据量(以kB为单位)
kB_wr/s: 每秒进程向磁盘写的数据量(以kB为单位)
Command: 拉起进程对应的命令

具体解释详细请阅读Linux pidstat命令详解

现在定位到进程级别了,很多时候,需要知道这个进程到底打开了哪些文件,这个进程到底和哪些进程关联,这个时候就不得不提到lsof命令了。

lsof -p 20711 列出指定进程打开的文件列表

具体解释详细请阅读Linux lsof命令详解

总结

排查问题所使用的工具大而全的知识一时半会记不全。要多练习多思考