成人免费xxxxx在线视频软件_久久精品久久久_亚洲国产精品久久久_天天色天天色_亚洲人成一区_欧美一级欧美三级在线观看

如何監測Linux進程的實時IO讀寫情況

運維 系統運維
怎樣實時查看Linux進程的實時IO讀寫情況?Linux Kernel 2.6.20 以上的內核支持進程 IO 統計,可以用類似 iotop 這樣的工具來監測每個進程對 IO 操作的情況。對于2.6.20以下的內核,本文提供了一個簡單的Python腳本。

Linux Kernel 2.6.20 以上的內核支持進程 IO 統計,可以用類似 iotop 這樣的工具來監測每個進程對 IO 操作的情況,就像用 top 來實時查看進程內存、CPU 等占用情況那樣。但是對于 2.6.20 以下的 Linux 內核版本就沒那么幸運了。筆者寫了一個簡單的 Python 腳本用來在 linux kernel < 2.6.20 下打印進程 IO 狀況。

Kernel < 2.6.20

這個腳本的想法很簡單,把 dmesg 的結果重定向到一個文件后再解析出來,每隔1秒鐘打印一次進程 IO 讀寫的統計信息,執行這個腳本需要 root:

  1. #!/usr/bin/python  
  2. # Monitoring per-process disk I/O activity  
  3. # written by http://www.vpsee.com   
  4.  
  5. import sys, os, time, signal, re  
  6.  
  7. class DiskIO:  
  8.     def __init__(self, pname=None, pid=None, reads=0, writes=0):  
  9.         self.pname = pname  
  10.         self.pid = pid  
  11.         self.reads = 0 
  12.         self.writes = 0 
  13.  
  14. def main():  
  15.     argc = len(sys.argv)  
  16.     if argc != 1:  
  17.         print "usage: ./iotop" 
  18.         sys.exit(0)  
  19.  
  20.     if os.getuid() != 0:  
  21.         print "must be run as root" 
  22.         sys.exit(0)  
  23.  
  24.     signal.signal(signal.SIGINT, signal_handler)  
  25.     os.system('echo 1 > /proc/sys/vm/block_dump')  
  26.     print "TASK              PID       READ      WRITE" 
  27.     while True:  
  28.         os.system('dmesg -c > /tmp/diskio.log')  
  29.         l = []  
  30.         f = open('/tmp/diskio.log''r')  
  31.         line = f.readline()  
  32.         while line:  
  33.             m = re.match(\  
  34.                 '^(\S+)\((\d+)\): (READ|WRITE) block (\d+) on (\S+)', line)  
  35.             if m != None:  
  36.                 if not l:  
  37.                     l.append(DiskIO(m.group(1), m.group(2)))  
  38.                     line = f.readline()  
  39.                     continue 
  40.                 found = False 
  41.                 for item in l:  
  42.                     if item.pid == m.group(2):  
  43.                         found = True 
  44.                         if m.group(3) == "READ":  
  45.                             item.reads = item.reads + 1 
  46.                         elif m.group(3) == "WRITE":  
  47.                             item.writes = item.writes + 1 
  48.                 if not found:  
  49.                     l.append(DiskIO(m.group(1), m.group(2)))  
  50.             line = f.readline()  
  51.         time.sleep(1)  
  52.         for item in l:  
  53.             print "%-10s %10s %10d %10d" % \  
  54.                 (item.pname, item.pid, item.reads, item.writes)  
  55.  
  56. def signal_handler(signal, frame):  
  57.     os.system('echo 0 > /proc/sys/vm/block_dump')  
  58.     sys.exit(0)  
  59.  
  60. if __name__=="__main__":  
  61.     main()  
  62.  

Kernel >= 2.6.20

如果想用 iotop 來實時查看進程 IO 活動狀況的話,需要下載和升級新內核(2.6.20 或以上版本)。編譯新內核時需要打開 TASK_DELAY_ACCT 和 TASK_IO_ACCOUNTING 選項。解壓內核后進入配置界面:

# tar jxvf linux-2.6.30.5.tar.bz2
# mv linux-2.6.30.5 /usr/src/
# cd /usr/src/linux-2.6.30.5

# make menuconfig

選擇 Kernel hacking –> Collect scheduler debugging info 和 Collect scheduler statistics,保存內核后編譯內核:

# make; make modules; make modules_install; make install

修改 grub,確認能正確啟動新內核:

# vi /boot/grub/menu.lst

出了新內核外,iotop 還需要 Python 2.5 或以上才能運行,所以如果當前 Python 是 2.4 的話需要下載和安裝最新的 Python 包。這里使用源代碼編譯安裝:

# tar jxvf Python-2.6.2.tar.bz2
# cd Python-2.6.2
# ./configure
# make; make install

別忘了下載 setuptools:

# mv setuptools-0.6c9-py2.6.egg.sh setuptools-0.6c9-py2.6.egg
# sh setuptools-0.6c9-py2.6.egg

有網友對以上腳本提出問題,問到 WRITE 為什么會出現是 0 的情況,這是個好問題,筆者在這里好好解釋一下。首先看看我們怎么樣才能實時監測不同進程的 IO 活動狀況。

block_dump

Linux 內核里提供了一個 block_dump 參數用來把 block 讀寫(WRITE/READ)狀況 dump 到日志里,這樣可以通過 dmesg 命令來查看,具體操作步驟是:

# sysctl vm.block_dump=1
or
# echo 1 > /proc/sys/vm/block_dump

然后就可以通過 dmesg 就可以觀察到各個進程 IO 活動的狀況了:

# dmesg -c
kjournald(542): WRITE block 222528 on dm-0
kjournald(542): WRITE block 222552 on dm-0
bash(18498): dirtied inode 5892488 (ld-linux-x86-64.so.2) on dm-0
bash(18498): dirtied inode 5892482 (ld-2.5.so) on dm-0
dmesg(18498): dirtied inode 11262038 (ld.so.cache) on dm-0
dmesg(18498): dirtied inode 5892496 (libc.so.6) on dm-0
dmesg(18498): dirtied inode 5892489 (libc-2.5.so) on dm-0

問題

一位細心的網友提到這樣一個問題:為什么會有 WRITE block 0 的情況出現呢?筆者跟蹤了一段時間,發現確實有 WRITE 0 的情況出現,比如:

# dmesg -c
...
pdflush(23123): WRITE block 0 on sdb1
pdflush(23123): WRITE block 16 on sdb1
pdflush(23123): WRITE block 104 on sdb1
pdflush(23123): WRITE block 40884480 on sdb1
...

答案

原來我們把 WRITE block 0,WRITE block 16, WRITE block 104 這里面包含的數字理解錯了,這些數字不是代表寫了多少 blocks,是代表寫到哪個 block,為了尋找真相,筆者追到 Linux 2.6.18 內核代碼里,在 ll_rw_blk.c 里找到了答案:

$ vi linux-2.6.18/block/ll_rw_blk.c

  1. void submit_bio(int rw, struct bio *bio)  
  2. {  
  3.         int count = bio_sectors(bio);  
  4.  
  5.         BIO_BUG_ON(!bio->bi_size);  
  6.         BIO_BUG_ON(!bio->bi_io_vec);  
  7.         bio->bi_rw |= rw;  
  8.         if (rw & WRITE)  
  9.                 count_vm_events(PGPGOUT, count);  
  10.         else 
  11.                 count_vm_events(PGPGIN, count);  
  12.  
  13.         if (unlikely(block_dump)) {  
  14.                 char b[BDEVNAME_SIZE];  
  15.                 printk(KERN_DEBUG "%s(%d): %s block %Lu on %s\n",  
  16.                         current->comm, current->pid,  
  17.                         (rw & WRITE) ? "WRITE" : "READ",  
  18.                         (unsigned long long)bio->bi_sector,  
  19.                         bdevname(bio->bi_bdev,b));  
  20.         }  
  21.  
  22.         generic_make_request(bio);  
  23. }  

很明顯從上面代碼可以看出 WRITE block 0 on sdb1,這里的 0 是 bio->bi_sector,是寫到哪個 sector,不是 WRITE 了多少 blocks 的意思。還有,如果 block 設備被分成多個區的話,這個 bi_sector(sector number)是從這個分區開始計數,比如 block 0 on sdb1 就是 sdb1 分區上的第0個 sector 開始。

原文地址:http://www.vpsee.com/2010/07/monitoring-process-io-activity-on-linux-with-block_dump/

【編輯推薦】

  1. Linux技巧:多核下綁定硬件/進程到不同CPU
  2. 重置CentOS-root密碼的簡便方法
  3. Linux定時執行任務命令概述:at和crontab
責任編輯:yangsai 來源: vpsee.com
相關推薦

2011-11-08 21:51:43

Linux 監控 IO

2010-12-22 13:17:47

Linux性能監測磁盤IO

2023-08-21 14:18:48

操作系統Linux

2019-08-15 15:00:29

監測Linux性能NetData

2017-01-18 21:57:14

2010-06-02 11:06:15

Linux 內存監控

2018-08-27 11:18:01

存儲

2018-11-01 10:59:52

Linux內存進程

2021-11-29 20:44:31

Linux內存進程

2015-10-13 08:59:59

合作組織實時Linux

2022-04-23 16:30:22

Linux磁盤性能

2020-12-01 08:00:00

Linux服務器系統

2012-03-31 13:55:15

Java

2015-06-25 12:41:53

實時 Node應用性能監測

2020-04-29 15:10:16

Linux命令進程

2011-09-08 09:24:34

Mac Widget監測系統iStatpro

2024-12-10 13:17:41

2019-06-05 09:14:28

LinuxIO監控分析

2021-08-11 10:41:50

博睿數據IT運維

2013-11-14 10:32:40

Linux系統監測系統溫度
點贊
收藏

51CTO技術棧公眾號

主站蜘蛛池模板: 亚洲天堂二区 | 国产高清在线 | 亚洲国产一区视频 | 久久精品青青大伊人av | 日韩精品1区2区3区 成人黄页在线观看 | 农夫在线精品视频免费观看 | 国产激情视频网 | 国产精品视频免费播放 | 国产日韩欧美在线观看 | 新av在线| 国产精品一区三区 | 欧美精品一区二区三区在线播放 | 国产精品久久九九 | 亚洲精品视频免费 | 四虎成人精品永久免费av九九 | 91精品综合久久久久久五月天 | 天天操操| 国产69久久精品成人看动漫 | 91在线一区二区三区 | 国产专区视频 | 欧美久久久网站 | 国产91视频一区二区 | 精品一区二区三区在线观看 | 国产精品久久一区二区三区 | 中文在线日韩 | 日韩中文字幕一区二区 | 精品一区二区三区在线观看国产 | 羞羞视频网站免费看 | 综合色影院 | 91精品国产91久久综合桃花 | 中文字幕在线二区 | 久久久久久久久久久久亚洲 | 日韩国产免费 | 成人精品免费视频 | 亚洲色欧美另类 | 国产精品久久久乱弄 | 一级黄色片在线免费观看 | 狠狠插天天干 | 一区在线观看 | 99在线资源 | 亚洲人成免费 |