Linux系统IO监控

时间:2020-03-21 11:46:07  来源:igfitidea点击:

“每一件事都是文件”,是非常著名的Linux哲学。
这种哲学之所以出名是有原因的。
造成这种情况的主要原因是Linux操作系统本身以相同的原理工作。

我们可能会认为操作系统如何在“一切都是文件”之类的哲学上工作。

这是因为,Linux操作系统以与我们打开和关闭文件相同的方式考虑并使用以下设备。

  • 块设备(硬盘,光盘,软盘,闪存)
  • 字符设备或者串行设备(鼠标,键盘)
  • 网络设备

用户可以在这些设备上执行操作,就像在文件上执行操作一样。

块设备的主要优点是可以随机读取它们。
但是,串行设备只能串行操作(只能按顺序访问串行设备中的数据,而不能随机访问。

使用块设备的主要优点是,如果允许访问设备上的随机位置。
并且以固定的块大小读取设备中的数据。

输入和输出到块设备的算法称为“电梯算法”

缓冲区高速缓存是内核减少主要页面错误(较慢)并增加次要页面错误(较快,因为所有都在内存中)的一种机制。

等待I/O是当大量应用程序在等待其I/O操作完成时对处理器造成的一种情况。
在这种情况下,CPU等待输入/输出请求完成时变为空闲状态。

换句话说,某些或者其他应用程序可能正在执行大量的“主要页面错误”(这导致其他应用程序等待其“主要页面错误”完成)。

让我们看看如何借助linux中的vmstat命令监视“等待I/O”。

[root@theitroad1 ~]# 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
 0  0      0  73588 110056 277556    0    0    72     8 1015   30  1  1 98  0  0
 0  0      0  73588 110056 277556    0    0     0     0 1013   20  0  0 100  0  0
 0  0      0  73588 110056 277556    0    0     0     0 1014   26  0  1 100  0  0
 0  0      0  73588 110056 277556    0    0     0    14 1015   23  0  0 100  0  0

在上面显示的vmstat命令的输出中,请注意最后一列“ CPU”。
此列告诉处理器处理器在用户,系统,空闲和等待io上花费的时间(在io上的等待由输出的cpu部分中的“ wa”列显示。

在上面的输出“ wa”中,它为零,并且空闲时间为100%。
这意味着系统上没有任何运行。

如果存在“ wa”显示较高值的情况,则表示存在IO瓶颈。
较高的io等待时间意味着,cpu正在等待不同应用程序的I/O请求完成。

vmstat输出中的“ bi”列显示了从磁盘读入内存的块。
如果随“ wa”一起变大,则可以确保从磁盘将大数据读入内存,这会导致io等待。

linux中的SAR(系统积极性报告程序)命令,也可用于确定“在io上等待”

[root@myvm1 ~]# sar 1 7
09:31:17 PM       CPU     %user     %nice   %system   %iowait    %steal     %idle
09:31:18 PM       all      0.99      0.00      0.00     72.28      0.00     26.73
09:31:19 PM       all      0.00      0.00      2.00     52.00      0.00     46.00
09:31:20 PM       all      0.00      0.00      0.00      0.00      0.00    100.00
09:31:21 PM       all      0.00      0.00      1.00      0.00      0.00     99.00
09:31:22 PM       all      0.00      0.00      0.00      0.00      0.00    100.00
09:31:23 PM       all      0.00      0.00      1.00      0.00      0.00     99.00
09:31:24 PM       all      0.00      0.00      0.99      0.00      0.00     99.01
Average:          all      0.14      0.00      0.71     17.83      0.00     81.31
[root@myvm1 ~]#

现在,在上面的命令中,我要求sar每1秒填充一次系统统计数据的输出,共7次。

%iowait将告诉我们系统每秒的iowait时间。
运行此命令还将使我们知道系统的IO状态。

如何确定哪个进程在Linux中占用大量IO?

为了获得进程概述并了解有关Linux中进程的一些有趣事实,我建议阅读以下文章。

阅读:Linux中的进程

我们可以借助top命令来识别。
通过按“页面错误计数”对输出进行排序,可以按“ F”,然后按“ u”以根据top命令中的页面错误对输出进行排序。

top - 21:43:58 up  3:45,  2 users,  load average: 0.15, 0.11, 0.06
Tasks:  87 total,   1 running,  86 sleeping,   0 stopped,   0 zombie
Cpu(s):  0.0%us,  0.0%sy,  0.0%ni, 99.0%id,  0.0%wa,  0.0%hi,  1.0%si,  0.0%st
Mem:    515444k total,   466932k used,    48512k free,   300748k buffers
Swap:  1044184k total,      108k used,  1044076k free,   106780k cached
 PID USER      PR  NI  VIRT  RES  SHR S %CPU %MEM    TIME+  nFLT COMMAND
 4413 root      15   0 23596 7424 4308 S  0.0  1.4   0:00.26   59 httpd
 4293 mysql     15   0  129m  20m 3200 S  0.0  4.1   0:01.64   54 mysqld
    1 root      15   0  2064  624  536 S  0.0  0.1   0:02.49   19 init
16490 root      15   0 10148 3176 2616 S  0.0  0.6   0:00.90   18 sshd
 3180 root      15   0 10064 2832 2084 S  0.0  0.5   0:00.11   10 cupsd
 3184 root      15   0   780  240  204 S  0.0  0.0   0:00.02    6 tpvmlp

上面的输出显示,httpd和mysql正在占用大量的“页面错误计数”

iostat命令还提供了有关Linux系统中io使用情况的一些详细信息。

iostat将在其输出中提供顺序io以及随机IO。
顺序IO是系统读取写入大量顺序数据的能力(这也取决于文件系统的块大小)。

[root@myvm1 ~]# iostat -xk
Device:         rrqm/s   wrqm/s   r/s   w/s    rkB/s    wkB/s avgrq-sz avgqu-sz   await  svctm  %util
sda              14.21     3.59 165.10  1.20   449.42    19.13     5.64     0.05    0.33   0.15   2.56
sda1              0.09     0.00  0.08  0.00     0.10     0.00     2.60     0.00    0.62   0.50   0.00
sda2              1.33     3.58  6.09  1.19    57.65    19.08    21.08     0.04    5.83   1.93   1.41
sda3             12.71     0.01 158.89  0.01   391.59     0.04     4.93     0.01    0.08   0.08   1.19
sda4              0.00     0.00  0.00  0.00     0.00     0.00     2.00     0.00    5.20   5.20   0.00
sda5              0.08     0.00  0.04  0.00     0.07     0.01     3.44     0.00    0.72   0.56   0.00

iostat将向我们显示每个磁盘分区的详细信息,如上所示。

将readkb/sec设置为read/sec,将wkB/s设置为w/s,以获取设备的IO性能。

另一个需要考虑的重要情况是,当内存用完时。
在这种情况下,系统将开始使用交换空间。
由于交换空间只不过是硬盘空间,因此IO速度将非常慢。

而且,如果交换空间位于系统正在为其他应用程序访问IO的同一文件系统分区中,那么系统将遇到非常严重的减速。

有时,在上述情况下,系统会遇到内核崩溃或者系统崩溃的情况。