IT貓撲網(wǎng):您身邊最放心的安全下載站! 最新更新|軟件分類|軟件專題|手機版|論壇轉(zhuǎn)貼|軟件發(fā)布

您當(dāng)前所在位置: 首頁操作系統(tǒng)LINUX → 監(jiān)測Linux進(jìn)程的實時IO情況

監(jiān)測Linux進(jìn)程的實時IO情況

時間:2015-06-28 00:00:00 來源:IT貓撲網(wǎng) 作者:網(wǎng)管聯(lián)盟 我要評論(1)

  作為系統(tǒng)管理員和 VPS 服務(wù)商,經(jīng)常會碰到服務(wù)器或者 VPS 磁盤 IO 繁忙的時候,VPSee 通常都會用一些工具來檢測,其中一個常用的工具就是自己寫的 iotop 腳本,可以很方便看到哪個進(jìn)程在頻繁 IO. 上周五收到一位網(wǎng)友的郵件和留言,問到這篇文章:如何查看進(jìn)程 IO 讀寫情況?里的 WRITE 為什么會出現(xiàn)是 0 的情況,這是個好問題,VPSee 在這里好好解釋一下。首先看看我們怎么樣才能實時監(jiān)測不同進(jìn)程的 IO 活動狀況。

  block_dump

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

  # sysctl vm.block_dump=1

  or

  # echo 1 > /proc/sys/vm/block_dump

  然后就可以通過 dmesg 就可以觀察到各個進(jìn)程 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

  問題

  一位細(xì)心的網(wǎng)友提到這樣一個問題:為什么會有 WRITE block 0 的情況出現(xiàn)呢?VPSee 跟蹤了一段時間,發(fā)現(xiàn)確實有 WRITE 0 的情況出現(xiàn),比如:

  # 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 這里面包含的數(shù)字理解錯了,這些數(shù)字不是代表寫了多少 blocks,是代表寫到哪個 block,為了尋找真相,VPSee 追到 Linux 2.6.18 內(nèi)核代碼里,在 ll_rw_blk.c 里找到了答案:

  $ vi linux-2.6.18/block/ll_rw_blk.c

  void submit_bio(int rw, struct bio *bio)

  {

  int count = bio_sectors(bio);

  BIO_BUG_ON(!bio->bi_size);

  BIO_BUG_ON(!bio->bi_io_vec);

  bio->bi_rw |= rw;

  if (rw & WRITE)

  count_vm_events(PGPGOUT, count);

  else

  count_vm_events(PGPGIN, count);

  if (unlikely(block_dump)) {

  char b[BDEVNAME_SIZE];

  printk(KERN_DEBUG "%s(%d): %s block %Lu on %s\n",

  current->comm, current->pid,

  (rw & WRITE) ? "WRITE" : "READ",

  (unsigned long long)bio->bi_sector,

  bdevname(bio->bi_bdev,b));

  }

  generic_make_request(bio);

  }

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

關(guān)鍵詞標(biāo)簽:Linux,進(jìn)程

相關(guān)閱讀

文章評論
發(fā)表評論

熱門文章 安裝紅帽子RedHat Linux9.0操作系統(tǒng)教程 安裝紅帽子RedHat Linux9.0操作系統(tǒng)教程 Tomcat9.0如何安裝_Tomcat9.0環(huán)境變量配置方法 Tomcat9.0如何安裝_Tomcat9.0環(huán)境變量配置方法 多種操作系統(tǒng)NTP客戶端配置 多種操作系統(tǒng)NTP客戶端配置 Linux操作系統(tǒng)修改IP Linux操作系統(tǒng)修改IP

相關(guān)下載

    人氣排行 Linux下獲取CPUID、硬盤序列號與MAC地址 dmidecode命令查看內(nèi)存型號 linux tc實現(xiàn)ip流量限制 安裝紅帽子RedHat Linux9.0操作系統(tǒng)教程 linux下解壓rar文件 lcx.exe、nc.exe、sc.exe入侵中的使用方法 Ubuntu linux 關(guān)機、重啟、注銷 命令 查看linux服務(wù)器硬盤IO讀寫負(fù)載