Linux-I-O 

iotop 实时显示I/O
   Options
iostat cpu及设备利用率报告
   CPU报告
   设备报告
   Options
   EXAMPLES
pidstat 报告Linux任务的统计信息
   Options
   EXAMPLES
总结

iotop 实时显示I/O

显示进程或线程的实时I/O,可正对单个进程查看。
$ iotop -h
DISK READ和DISK WRITE是采样周期内使用的块I/O带宽。
SWAPIN和IO是线程在更频繁地交换和等待I/O时分别花费的时间百分比。
PRIO是线程运行的I/O优先级(使用ionice命令设置)。
Controls: 控制:
 left and right arrows to change the sorting column, (左右)箭头更改排序列,
 r to invert the sorting order, (r)反转排序顺序,
 o to toggle the --only option, (o)切换--only选项,
 p to toggle the --processes option, (p)切换--processes选项,
 a to toggle the --accumulated option, (a)切换--accumulated选项,
 i to change I/O priority, (i)改变I/O优先级,
 q to quit, any other key to force a refresh. (q)退出,强制刷新的任何其他键。

Options:

--version show program's version number and exit 显示程序的版本号并退出
-h, --help show this help message and exit 显示此帮助消息并退出
-o, --only only show processes or threads actually doing I/O 仅显示实际执行I / O的进程或线程
-b, --batch non-interactive mode 非交互模式
-n NUM, --iter=NUM number of iterations before ending [infinite] 结束前的迭代次数[无限]
-d SEC, --delay=SEC delay between iterations [1 second] 迭代之间的延迟[1秒]
-p PID, --pid=PID processes/threads to monitor [all] 进程/线程监视[全部]
-u USER, --user=USER users to monitor [all] 用户监控[全部]
-P, --processes only show processes, not all threads 只显示进程,而不是所有线程
-a, --accumulated show accumulated I/O instead of bandwidth 显示累积的I / O而不是带宽
-k, --kilobytes use kilobytes instead of a human friendly unit 使用千字节代替人类友好单位
-t, --time add a timestamp on each line (implies --batch) 在每一行添加一个时间戳(暗示--batch)
-q, --quiet suppress some lines of header (implies --batch) 抑制一些标题行(暗示--batch)

iostat cpu及设备利用率报告

iostat命令用于通过观察设备相对于其平均传输速率的活动时间来监视系统输入/输出设备负载。
iostat命令生成可用于更改系统配置的报告,以更好地平衡物理磁盘之间的输入/输出负载。

interval参数指定每个报告之间的时间量(以秒为单位)。
count参数可以与interval参数一起指定。
如果指定了count参数,则count的值将确定以间隔秒间隔生成的报告数。
如果指定了interval参数而没有count参数,则iostat命令会连续生成报告。

REPORTS
iostat命令生成两种类型的报告,即CPU利用率报告和“设备利用率”报告。

CPU Utilization Report CPU利用率报告

  •  %user 显示在用户级别(应用程序)执行时发生的CPU利用率百分比。
  •  %nice 显示在具有良好优先级的用户级别执行时发生的CPU利用率百分比。
  •  %system 显示在系统级别(内核)执行时发生的CPU利用率百分比。
  •  %iowait 显示系统具有未完成的磁盘I/O请求的CPU或CPU空闲的时间百分比。
  •  %steal 显示虚拟机管理程序为另一个虚拟处理器提供服务时虚拟CPU或CPU在非自愿等待中花费的时间百分比。
  •  %idle 显示CPU或CPU空闲的时间百分比,并且系统没有未完成的磁盘I/O请求。

Device Utilization Report 是设备利用率报告。

设备报告默认显示如下8个字段列
  •  Device: 此列提供/ dev目录中列出的设备(或分区)名称。
  •  tps   指示发出给设备的​​每秒传输次数。传输是对设备的I/O请求。可以将多个逻辑请求组合到设备的单个I/O请求中。转移的大小不确定。
  •  Blk_read/s (kB_read/s, MB_read/s) 表示从设备读取的数据量,以每秒的块数(千字节,兆字节)表示。 块等同于扇区,因此具有512字节的大小。
  •  Blk_wrtn/s (kB_wrtn/s, MB_wrtn/s) 指示写入设备的数据量,以每秒的块数(千字节,兆字节)表示。
  •  Blk_dscd/s (kB_dscd/s, MB_dscd/s) 指示设备丢弃的数据量,以每秒的块数(千字节,兆字节)表示。
  •  Blk_read (kB_read, MB_read) 读取的块总数(千字节,兆字节)。
  •  Blk_wrtn (kB_wrtn, MB_wrtn) 写入的块总数(千字节,兆字节)。
  •  Blk_dscd (kB_dscd, MB_dscd)  丢弃的块总数(千字节,兆字节)。
使用-x选项,将显示如下所有字段统计信息。
  •  r/s  设备每秒完成的读取请求数(合并后)。
  •  w/s  每秒为设备完成的写请求数(合并后)。
  •  d/s  设备每秒完成的丢弃请求数量(合并后)。
  • sec/s (kB/s, MB/s)  每秒从设备读取,写入或丢弃的扇区数(千字节,兆字节)。
  •  rsec/s (rkB/s, rMB/s)  每秒从设备读取的扇区数(千字节,兆字节)。
  •  wsec/s (wkB/s, wMB/s)  每秒写入设备的扇区数(千字节,兆字节)。
  •  dsec/s (dkB/s, dMB/s)  每秒丢弃设备的扇区数(千字节,兆字节)。
  • rqm/s  每秒合并到队列到设备的I/O请求数。
  •  rrqm/s 每秒合并到队列到设备的读取请求数
  •  wrqm/s  每秒合并的写入请求数,这些写入请求已排队到设备。
  •  drqm/s  每秒合并到队列到设备的丢弃请求数。
  •  %rrqm  在发送到设备之前,读取请求的百分比合并在一起。
  •  %wrqm  写入请求的百分比在发送到设备之前合并在一起。
  •  %drqm  丢弃请求在发送到设备之前合并在一起的百分比。
  • areq-sz  发布到设备的I/O请求的平均大小(以千字节为单位)。 注意:在以前的版本中,此字段称为avgrq-sz,并以扇区表示。
  •  rareq-sz  发布到设备的读取请求的平均大小(以千字节为单位)。
  •  wareq-sz  发布到设备的写入请求的平均大小(以千字节为单位)。
  •  dareq-sz  发给设备的丢弃请求的平均大小(以千字节为单位)。
  • await  发送给要提供的设备的I/O请求的平均时间(以毫秒为单位)。这包括队列中的请求所花费的时间以及为其提供服务所花费的时间。
  •  r_await  发送给要提供的设备的读取请求的平均时间(以毫秒为单位)。这包括队列中的请求所花费的时间以及为其提供服务所花费的时间。
  •  w_await  发送给要提供的设备的写请求的平均时间(以毫秒为单位)。这包括队列中的请求所花费的时间以及为其提供服务所花费的时间。
  •  d_await  发送给要提供的设备的丢弃请求的平均时间(以毫秒为单位)。这包括队列中的请求所花费的时间以及为其提供服务所花费的时间。
  •  aqu-sz  发给设备的请求的平均队列长度。 注意:在以前的版本中,此字段称为avgqu-sz。
  •  %util  向设备发出I/O请求所经过的时间百分比(设备的带宽利用率)。对于按顺序提供请求的设备,此值接近100%时,会发生设备饱和。但对于并行处理请求的设备,例如RAID阵列和现代SSD,此数字并不反映其性能限制。

OPTIONS

 -c Display the CPU utilization report. 显示CPU利用率报告。
 -d Display the device utilization report. 显示设备利用率报告。
 --dec={ 0 | 1 | 2 } 指定要使用的小数位数(0到2,默认值为2)。
 -g group_name { device [...] | ALL }  显示一组设备的统计信息。
iostat命令报告列表中每个设备的统计信息,然后显示组的全局统计信息,显示为group_name,并由列表中的所有设备组成。ALL关键字表示系统定义的所有块设备都应包含在组中。
 -H 此选项必须与选项-g一起使用,并指示仅显示组的全局统计信息,而不显示组中各个设备的统计信息。
 -h 使人类更容易阅读设备利用率报告。  - 使用此选项隐式启用--human。
 --human  以人类可读格式(例如1.0k,1.2M等)打印大小。使用此选项显示的单位将取代与度量标准关联的任何其他默认单位(例如千字节,扇区......)。
 -j { ID | LABEL | PATH | UUID | ... } [ device [...] | ALL ] 显示持久性设备名称。
选项ID,LABEL等指定持久性名称的类型。 这些选项不受限制,只有先决条件是/dev/disk中存在具有所需持久性名称的目录。(可选)可以在所选的持久性名称类型中指定多个设备。 因为持久性设备名称通常很长,所以选项
 -k Display statistics in kilobytes per second. 以千字节/秒为单位显示统计信息。
 -m Display statistics in megabytes per second. 以兆字节/秒为单位显示统计信息。
 -N 显示任何设备映射器设备的已注册设备映射器名称。 用于查看LVM2统计信息。
 -o JSON  以JSON(Javascript Object Notation)格式显示统计信息。 JSON输出字段顺序未定义,并且将来可能会添加新字段。
 -p [ { device [,...] | ALL } ]  -p选项显示块设备及其系统使用的所有分区的统计信息。
如果在命令行上输入了设备名称,则会显示其及其所有分区的统计信息。最后,ALL关键字表示必须为系统定义的所有块设备和分区显示统计信息,包括从未使用过的那些。如果在此选项之前定义了选项-j,则可以使用所选的持久性名称类型指定在命令行上输入的设备。
 -s 显示应该适合80个字符宽屏幕的报告的短(窄)版本。
 -t 打印显示的每个报告的时间。 时间戳格式可能取决于S_TIME_FORMAT环境变量的值(参见下文)。
 -V 打印版本号然后退出。
 -x 显示扩展统计信息。
 -y 如果以给定间隔显示多个记录,则在系统引导后忽略包含统计信息的第一个报告。
 -z 告诉iostat省略在采样期间没有活动的任何设备的输出。

EXAMPLES

 iostat
 Display a single history since boot report for all CPU and Devices.

 iostat -d 2
 Display a continuous device report at two second intervals.

 iostat -d 2 6
 Display six reports at two second intervals for all devices.

 iostat -x sda sdb 2 6
 Display six reports of extended statistics at two second intervals for devices sda and sdb.

 iostat -p sda 2 6
 Display six reports at two second intervals for device sda and all its partitions (sda1, etc.)

iostat -cd //default
iostat -h -g {sda10,sdb6,sdb7}
iostat -hx -g {sda10,sdb6,sdb7}
iostat -x {sda10,sdb6,sdb7}

pidstat 报告Linux任务的统计信息

pidstat命令用于监视当前由Linux内核管理的各个任务。
如果使用选项-p ALL,它会为使用选项-p选择的每个任务或Linux内核管理的每个任务写入标准输出活动。
不选择任何任务等同于指定-p ALL,但只有活动任务(具有非零统计值的任务)才会显示在报告中。

interval参数指定每个报告之间的时间量(以秒为单位)。
值0(或根本没有参数)表示自系统启动(引导)以来报告任务统计信息的时间。
如果此参数未设置为零,则可以与interval参数一起指定count参数。
count的值确定以间隔秒间隔生成的报告数。
如果指定了interval参数而没有count参数,则pidstat命令会连续生成报告。

您可以使用标志选择有关特定任务活动的信息。 不指定任何标志仅选择CPU活动。

OPTIONS

 -T { TASK | CHILD | ALL } 此选项指定pidstat命令必须监视的内容。
TASK关键字表示要为各个任务报告统计信息(这是默认选项),
CHILD关键字表示要为所选任务及其所有子任务全局报告统计信息。
ALL关键字表示要为各个任务报告统计信息,并为所选任务及其子任务全局报告统计信息。
注意:pidstat的所有选项都不能使用任务及其所有子项的全局统计信息。
此外,这些统计数据不一定与当前时间间隔相关:子进程的统计信息仅在完成或被杀死时收集。

 -C comm   仅显示其命令名称包含字符串comm的任务。该字符串可以是正则表达式。
 --dec={ 0 | 1 | 2 } 指定要使用的小数位数(0到2,默认值为2)。
 -e program args 使用给定的参数args执行程序并使用pidstat监视它。当程序终止时,pidstat停止。
 -G process_name 仅显示其命令名称包含字符串process_name的进程。该字符串可以是正则表达式。如果选项-t与选项-G一起使用,则还会显示属于该进程的线程(即使它们的命令名称不包含字符串process_name)。
 -H 显示自纪元以来的秒数。
 -h 在一行上水平显示所有活动,报告末尾没有平均统计信息。这旨在使其他程序更容易解析。
 --human 以人类可读格式(例如1.0k,1.2M等)打印大小。使用此选项显示的单位将取代与度量标准关联的任何其他默认单位(例如千字节,扇区......)。
 -I 在SMP环境中,指示任务CPU使用率(由选项-u显示)应除以处理器总数。
 -l 显示进程命令名称及其所有参数。
 -p { pid [,...] | SELF | ALL } 选择要报告统计信息的任务(进程)。pid是进程标识号。SELF关键字表示要为pidstat进程本身报告统计信息,而ALL关键字表示要为系统管理的所有任务报告统计信息。
 -U [ username ] 显示正在监视的任务的实际用户名,而不是UID。 如果指定了username,则仅显示属于指定用户的任务。
 -V 打印版本号然后退出。

 -t 还显示与所选任务关联的线程的统计信息。 此选项将以下值添加到报告中:
  •  TGID 线程组领导者的标识号。
  •  TID 正在监视的线程的标识号。
  -d 报告I/O统计信息(仅内核2.6.20及更高版本)。可能会显示以下值:
  • kB_rd/s   每秒从磁盘读取任务所导致的千字节数。
  • kB_wr/s   任务导致或将导致每秒写入磁盘的千字节数
  • kB_ccwr/s   写入磁盘的任务已取消的千字节数。当任务截断一些脏pagecache时,可能会发生这种情况。在这种情况下,将会发生一些已经考虑了另一个任务的IO。
  • iodelay   阻止正在监视的任务的I/O延迟,以时钟周期测量。该指标包括等待同步块I/O完成和swapin块I/O完成所花费的延迟。
  -R 报告实时优先级和调度策略信息。 可能会显示以下值:
  • prio   被监控任务的实时优先级。
  • policy   正在监视的任务的调度策略。
  -s 报告堆栈利用率。可能会显示以下值:
  • StkSize   以堆栈形式保留的任务的内存量(以千字节为单位),但不一定使用。
  • StkRef   作为堆栈使用的以千字节为单位的内存量,由任务引用。
  -v 报告某些内核表的值。可能会显示以下值:
  • threads   与当前任务关联的线程数。
  • fd-nr   与当前任务关联的文件描述符数。
  -w 报告任务切换活动(仅内核2.6.23及更高版本)。可能会显示以下值:
  • cswch/s   每秒任务所做的自愿上下文切换的总数。当任务阻塞时会发生自愿上下文切换,因为它需要一个不可用的资源。
  • nvcswch/s   每秒任务所做的非自愿上下文切换的总数。当任务在其时间片的持续时间内执行时,发生非自愿的上下文切换,然后被迫放弃处理器。
  -r 报告页面错误和内存利用率。 报告单个任务的统计信息时,可能会显示以下值:
  • minflt/s   每秒任务所产生的次要故障总数,即不需要从磁盘加载内存页的故障总数。
  • majflt/s   任务每秒发生的主要故障总数,即需要从磁盘加载内存页面的主要故障总数。
  • VSZ   虚拟大小:整个任务的虚拟内存使用量,以千字节为单位。
  • RSS   驻留集大小:任务使用的非交换物理内存,以千字节为单位。
  • %MEM   任务当前使用的可用物理内存份额。
 -r -T CHILD 报告任务及其所有子项的全局统计信息时,可能会显示以下值:
  • minflt-nr   任务及其所有子项所产生的次要故障总数,并在该时间间隔内收集。
  • majflt-nr   任务及其所有子项发生的主要故障总数,并在该时间间隔内收集。
  -u 报告CPU利用率。报告单个任务的统计信息时,可能会显示以下值:
  • %usr   在用户级别(应用程序)执行时任务使用的CPU百分比,有或没有优先级。 请注意,此字段不包括运行虚拟处理器所花费的时间。
  • %system   在系统级别(内核)执行时任务使用的CPU百分比。
  • %guest   任务在虚拟机(运行虚拟处理器)中花费的CPU百分比。
  • %wait   等待运行时任务花费的CPU百分比。
  • %CPU   任务使用的CPU时间总百分比。在SMP环境中,如果在命令行中输入了选项-I,则任务的CPU使用率将除以CPU的总数。
  • CPU   任务附加到的处理器编号
  -u -T CHILD 报告任务及其所有子项的全局统计信息时,可能会显示以下值:
  • usr-ms   在用户级别(应用程序)执行时,任务及其所有子节点在有或没有优先级的情况下花费的总毫秒数,并在时间间隔内收集。请注意,此字段不包括运行虚拟处理器所花费的时间。
  • system-ms   在系统级别(内核)执行时,任务及其所有子节点在该时间间隔内收集的总毫秒数。
  • guest-ms   任务及其所有子节点在虚拟机(运行虚拟处理器)中花费的总毫秒数。
 -u(CPU利用率), -r(页面错误和内存利用率), -w(任务切换活动), -v(某些内核表的值), -s(堆栈利用率), -R(实时优先级和调度策略), -d(I/O统计), 都会有的字段:
  •  UID 正在监视的任务的真实用户标识号。
  •  USER 拥有被监控任务的真实用户的名称。
  •  PID 正在监视的任务的标识号。
  •  Command 任务的命令名称。
 -u(CPU利用率), -r(页面错误和内存利用率), 在包含子项[-T CHILD]时会有如下字段:
  •  UID  与其子项一起监视的任务的真实用户标识号。
  •  USER  拥有正在与其子节点一起监视的任务的真实用户的名称。
  •  PID  与其子女一起监控的任务的标识号。
  •  Command  正在与其子项一起监视的任务的命令名称。

EXAMPLES

 pidstat 2 5
 Display five reports of CPU statistics for every active task in the system at two second intervals.

 pidstat -r -p 1643 2 5
 Display five reports of page faults and memory statistics for PID 1643 at two second intervals.

 pidstat -C "fox|bird" -r -p ALL
 Display global page faults and memory statistics for all the processes whose command name includes the string "fox" or "bird".

 pidstat -T CHILD -r 2 5
 Display five reports of page faults statistics at two second intervals for the child processes of all tasks in the system.
 Only child processes with non-zero statistics values are displayed.

总结

iotop 可以查询那些进程在进行I/O操作。
pidstat 可以查询到进程的统计信息。
lsof 可以查看文件被那些程序打开。
iostat 只有统计数据。就是看不到和那些具体进程的关系。

那么 iostat 有什么用呢?
以下总结来源:https://jaminzhang.github.io/os/Linux-IO-Monitoring-and-Deep-Analysis/
如果 %iowait 的值过高,表示磁盘存在 I/O 瓶颈。
如果 %util 接近 100%,说明产生的 I/O 请求太多,I/O 系统已经满负荷,该磁盘可能存在瓶颈。
如果 svctm 比较接近 await,说明 I/O 几乎没有等待时间;
如果 await 远大于 svctm,说明 I/O 队列太长,I/O 响应太慢,则需要进行必要优化。
如果 avgqu-sz 比较大,也表示有大量 IO 在等待。