聊聊监控工具Linux iotop,


本文转载自微信公众号「DBA闲思杂想录」,作者潇湘隐者。转载本文请联系DBA闲思杂想录公众号。

iotop的简介:

iotop是一款开源、免费的用来监控磁盘I/O使用状况的类似top命令的工具,iotop可以监控进程的I/O信息。它是Python语言编写的,与iostat工具比较,iostat是系统级别的IO监控,而iotop是进程级别IO监控。目前最新的版本为iotop 0.6。其官方网址http://guichaz.free.fr/iotop/[1]

iotop的安装:

注意,iotop的安装有前提条件(如果操作系统不满足这些条件,iotop无法正确安装):

1:内核版本为2.6.20或更高版本

2:Python 2.7或更高的版本

官方文档的详细介绍如下:

  • Linux has always been able to show how much I/O was going on (the bi and bo columns of the vmstat 1 command).
  • Iotop is a Python program with a top like UI used to show of behalf of which process is the I/O going on. It requires Python ≥ 2.7 and a Linux kernel ≥ 2.6.20 with the TASK_DELAY_ACCT CONFIG_TASKSTATS, TASK_IO_ACCOUNTING and CONFIG_VM_EVENT_COUNTERS options on.

iotop的yum安装

yum安装是最简单、快捷的。前提条件是你有配置yum的源配置。

  1. [root@DB-Server ~]# python -V 
  2. Python 2.7.5 
  3. [root@DB-Server ~]# uname -a 
  4. Linux DB-Server 3.10.0-862.el7.x86_64 #1 SMP Fri Apr 20 16:44:24 UTC 2018 x86_64 x86_64 x86_64 GNU/Linux 
  5. [root@DB-Server ~]#  
  6.   
  7.   
  8. [root@DB-Server ~]# yum -y install iotop 

iotop的源码安装

  1. wget http://guichaz.free.fr/iotop/files/iotop-0.6.tar.bz2 
  2. tar -xvf iotop-0.6.tar.gz  
  3. cd iotop-0.6 
  4. python setup.py build 
  5. python setup.py install 

iotop的参数

  1. # iotop --help 
  2. Usage: /usr/local/sbin/iotop [OPTIONS] 
  3.   
  4. DISK READ and DISK WRITE are the block I/O bandwidth used during the sampling 
  5. period. SWAPIN and IO are the percentages of time the thread spent respectively 
  6. while swapping in and waiting on I/O more generally. PRIO is the I/O priority at 
  7. which the thread is running (set using the ionice command). 
  8.   
  9. Controls: left and right arrows to change the sorting column, r to invert the 
  10. sorting order, o to toggle the --only option, p to toggle the --processes 
  11. option, a to toggle the --accumulated option, i to change I/O priority, q to 
  12. quit, any other key to force a refresh. 
  13.   
  14. Options: 
  15.   --version             show program's version number and exit 
  16.   -h, --help            show this help message and exit 
  17.   -o, --only            only show processes or threads actually doing I/O 
  18.   -b, --batch           non-interactive mode 
  19.   -n NUM, --iter=NUM    number of iterations before ending [infinite] 
  20.   -d SEC, --delay=SEC   delay between iterations [1 second] 
  21.   -p PID, --pid=PID     processes/threads to monitor [all] 
  22.   -u USER, --user=USER  users to monitor [all] 
  23.   -P, --processes       only show processes, not all threads 
  24.   -a, --accumulated     show accumulated I/O instead of bandwidth 
  25.   -k, --kilobytes       use kilobytes instead of a human friendly unit 
  26.   -t, --time            add a timestamp on each line (implies --batch) 
  27.   -q, --quiet           suppress some lines of header (implies --batch) 

iotop的快捷键

r:反向排序,

o:切换至选项--only,

p:切换至--processes选项,

a:切换至--accumulated选项

q:退出

i:改变线程的优先级

iotop的例子

1:只显示正在产生I/O的进程

  1. # iotop -o 

2:使用非交互模式将iotop命令输出信息写入日志

  1. #nohup iotop -b -o -n 10 -d 5 -t  > /tmp/iotop.log & 

3:借助iotop命令找到消耗I/O最高的进程,然后通过进程找到其正在执行的SQL语句

  1. # iotop -oP 
  2.  
  3.  PID  PRIO  USER     DISK READ  DISK WRITE  SWAPIN     IO>    COMMAND                                                                                                                      
  4.  
  5. 11741 be/4 oracle      4.70 M/s    0.00 B/s  0.00 % 98.60 % ora_s004_SCM2 
  6.  
  7. 11739 be/4 oracle     66.99 M/s    0.00 B/s  0.00 % 93.30 % ora_s005_SCM2 
  8.  
  9. 11741 be/4 oracle     21.76 M/s    0.00 B/s  0.00 % 91.78 % ora_s006_SCM2 
  10.  
  11. 11743 be/4 oracle      4.87 M/s    3.78 M/s  0.00 % 27.74 % ora_s007_SCM2 
  12.  
  13. 11745 be/4 oracle     62.39 K/s    0.00 B/s  0.00 %  2.88 % ora_s008_SCM2 
  14.  
  15. 11733 be/4 oracle     39.00 K/s    0.00 B/s  0.00 %  2.08 % ora_s002_SCM2                 
  16.  
  17. 11697 be/4 oracle      0.00 B/s 1879.61 K/s  0.00 %  0.30 % ora_dbw0_SCM2 
  18.  
  19. 11699 be/4 oracle      0.00 B/s  102.36 K/s  0.00 %  0.20 % ora_lgwr_SCM2 

在找到消耗I/O最大的进程后,找出ORACLE进程正在执行的SQL语句

  1. SQL> @getsql_by_spid.sql 
  2.  
  3. Enter value for pid: 11741 
  4.  
  5. old  13:                                WHERE c.spid = '&pid')) 
  6.  
  7. new  13:                                WHERE c.spid = '11741')) 
  8.  
  9.   
  10.  
  11. SQL_TEXT 
  12.  
  13. -------------------------------------------- 
  14.  
  15. ...............................(实际环境中,这里会输出SQL语句) 

getsql_by_spid.sql脚本如下所示:

  1. SELECT   /*+ ORDERED */ 
  2.          sql_text 
  3.     FROM v$sqltext a 
  4.    WHERE (a.hash_value, a.address) IN ( 
  5.             SELECT DECODE (sql_hash_value, 
  6.                            0, prev_hash_value, 
  7.                            sql_hash_value 
  8.                           ), 
  9.                    DECODE (sql_hash_value, 0, prev_sql_addr, sql_address) 
  10.               FROM v$session b 
  11.              WHERE b.paddr = (SELECT addr 
  12.                                 FROM v$process c 
  13.                                WHERE c.spid = '&pid')) 
  14. ORDER BY piece ASC 

这里只简单列了几个例子,因为iotop命令非常简单,了解iotop的参数和快捷方式后,基本上只需根据实际需求去获取进程或信息的I/O信息,剩下就是分析判断了。

参考资料

[1]iotop: http://guichaz.free.fr/iotop/

相关内容