聊聊監(jiān)控工具Linux iotop
本文轉(zhuǎn)載自微信公眾號(hào)「DBA閑思雜想錄」,作者瀟湘隱者。轉(zhuǎn)載本文請(qǐng)聯(lián)系DBA閑思雜想錄公眾號(hào)。
iotop的簡(jiǎn)介:
iotop是一款開源、免費(fèi)的用來監(jiān)控磁盤I/O使用狀況的類似top命令的工具,iotop可以監(jiān)控進(jìn)程的I/O信息。它是Python語言編寫的,與iostat工具比較,iostat是系統(tǒng)級(jí)別的IO監(jiān)控,而iotop是進(jìn)程級(jí)別IO監(jiān)控。目前最新的版本為iotop 0.6。其官方網(wǎng)址http://guichaz.free.fr/iotop/[1]
iotop的安裝:
注意,iotop的安裝有前提條件(如果操作系統(tǒng)不滿足這些條件,iotop無法正確安裝):
1:內(nèi)核版本為2.6.20或更高版本
2:Python 2.7或更高的版本
官方文檔的詳細(xì)介紹如下:
- 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安裝是最簡(jiǎn)單、快捷的。前提條件是你有配置yum的源配置。
- [root@DB-Server ~]# python -V
- Python 2.7.5
- [root@DB-Server ~]# uname -a
- 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
- [root@DB-Server ~]#
- [root@DB-Server ~]# yum -y install iotop
iotop的源碼安裝
- wget http://guichaz.free.fr/iotop/files/iotop-0.6.tar.bz2
- tar -xvf iotop-0.6.tar.gz
- cd iotop-0.6
- python setup.py build
- python setup.py install
iotop的參數(shù)
- # iotop --help
- Usage: /usr/local/sbin/iotop [OPTIONS]
- DISK READ and DISK WRITE are the block I/O bandwidth used during the sampling
- period. SWAPIN and IO are the percentages of time the thread spent respectively
- while swapping in and waiting on I/O more generally. PRIO is the I/O priority at
- which the thread is running (set using the ionice command).
- Controls: left and right arrows to change the sorting column, r to invert the
- sorting order, o to toggle the --only option, p to toggle the --processes
- option, a to toggle the --accumulated option, i to change I/O priority, q to
- quit, any other key to force a refresh.
- 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
- -b, --batch non-interactive mode
- -n NUM, --iter=NUM number of iterations before ending [infinite]
- -d SEC, --delay=SEC delay between iterations [1 second]
- -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
- -k, --kilobytes use kilobytes instead of a human friendly unit
- -t, --time add a timestamp on each line (implies --batch)
- -q, --quiet suppress some lines of header (implies --batch)
iotop的快捷鍵
r:反向排序,
o:切換至選項(xiàng)--only,
p:切換至--processes選項(xiàng),
a:切換至--accumulated選項(xiàng)
q:退出
i:改變線程的優(yōu)先級(jí)
iotop的例子
1:只顯示正在產(chǎn)生I/O的進(jìn)程
- # iotop -o
2:使用非交互模式將iotop命令輸出信息寫入日志
- #nohup iotop -b -o -n 10 -d 5 -t > /tmp/iotop.log &
3:借助iotop命令找到消耗I/O最高的進(jìn)程,然后通過進(jìn)程找到其正在執(zhí)行的SQL語句
- # iotop -oP
- PID PRIO USER DISK READ DISK WRITE SWAPIN IO> COMMAND
- 11741 be/4 oracle 4.70 M/s 0.00 B/s 0.00 % 98.60 % ora_s004_SCM2
- 11739 be/4 oracle 66.99 M/s 0.00 B/s 0.00 % 93.30 % ora_s005_SCM2
- 11741 be/4 oracle 21.76 M/s 0.00 B/s 0.00 % 91.78 % ora_s006_SCM2
- 11743 be/4 oracle 4.87 M/s 3.78 M/s 0.00 % 27.74 % ora_s007_SCM2
- 11745 be/4 oracle 62.39 K/s 0.00 B/s 0.00 % 2.88 % ora_s008_SCM2
- 11733 be/4 oracle 39.00 K/s 0.00 B/s 0.00 % 2.08 % ora_s002_SCM2
- 11697 be/4 oracle 0.00 B/s 1879.61 K/s 0.00 % 0.30 % ora_dbw0_SCM2
- 11699 be/4 oracle 0.00 B/s 102.36 K/s 0.00 % 0.20 % ora_lgwr_SCM2
在找到消耗I/O最大的進(jìn)程后,找出ORACLE進(jìn)程正在執(zhí)行的SQL語句
- SQL> @getsql_by_spid.sql
- Enter value for pid: 11741
- old 13: WHERE c.spid = '&pid'))
- new 13: WHERE c.spid = '11741'))
- SQL_TEXT
- --------------------------------------------
- ...............................(實(shí)際環(huán)境中,這里會(huì)輸出SQL語句)
getsql_by_spid.sql腳本如下所示:
- SELECT /*+ ORDERED */
- sql_text
- FROM v$sqltext a
- WHERE (a.hash_value, a.address) IN (
- SELECT DECODE (sql_hash_value,
- 0, prev_hash_value,
- sql_hash_value
- ),
- DECODE (sql_hash_value, 0, prev_sql_addr, sql_address)
- FROM v$session b
- WHERE b.paddr = (SELECT addr
- FROM v$process c
- WHERE c.spid = '&pid'))
- ORDER BY piece ASC
- /
這里只簡(jiǎn)單列了幾個(gè)例子,因?yàn)閕otop命令非常簡(jiǎn)單,了解iotop的參數(shù)和快捷方式后,基本上只需根據(jù)實(shí)際需求去獲取進(jìn)程或信息的I/O信息,剩下就是分析判斷了。
參考資料
[1]iotop: http://guichaz.free.fr/iotop/