時(shí)間:2015/6/28來源:IT貓撲網(wǎng)作者:網(wǎng)管聯(lián)盟我要評(píng)論(0)
作為系統(tǒng)管理員和 VPS 服務(wù)商,經(jīng)常會(huì)碰到服務(wù)器或者 VPS 磁盤 IO 繁忙的時(shí)候,VPSee 通常都會(huì)用一些工具來檢測(cè),其中一個(gè)常用的工具就是自己寫的 iotop 腳本,可以很方便看到哪個(gè)進(jìn)程在頻繁 IO. 上周五收到一位網(wǎng)友的郵件和留言,問到這篇文章:如何查看進(jìn)程 IO 讀寫情況?里的 WRITE 為什么會(huì)出現(xiàn)是 0 的情況,這是個(gè)好問題,VPSee 在這里好好解釋一下。首先看看我們?cè)趺礃硬拍軐?shí)時(shí)監(jiān)測(cè)不同進(jìn)程的 IO 活動(dòng)狀況。
block_dump
Linux 內(nèi)核里提供了一個(gè) block_dump 參數(shù)用來把 block 讀寫(WRITE/READ)狀況 dump 到日志里,這樣可以通過 dmesg 命令來查看,具體操作步驟是:
# sysctl vm.block_dump=1
or
# echo 1 > /proc/sys/vm/block_dump
然后就可以通過 dmesg 就可以觀察到各個(gè)進(jìn)程 IO 活動(dòng)的狀況了:
# 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)友提到這樣一個(gè)問題:為什么會(huì)有 WRITE block 0 的情況出現(xiàn)呢?VPSee 跟蹤了一段時(shí)間,發(fā)現(xiàn)確實(shí)有 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ù)字理解錯(cuò)了,這些數(shù)字不是代表寫了多少 blocks,是代表寫到哪個(gè) 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,是寫到哪個(gè) sector,不是 WRITE 了多少 blocks 的意思。還有,如果 block 設(shè)備被分成多個(gè)區(qū)的話,這個(gè) bi_sector(sector number)是從這個(gè)分區(qū)開始計(jì)數(shù),比如 block 0 on sdb1 就是 sdb1 分區(qū)上的第0個(gè) sector 開始。
關(guān)鍵詞標(biāo)簽:Linux,進(jìn)程
相關(guān)閱讀
熱門文章 安裝紅帽子RedHat Linux9.0操作系統(tǒng)教程使用screen管理你的遠(yuǎn)程會(huì)話GNU/Linux安裝vmware如何登錄linux vps圖形界面 Linux遠(yuǎn)程桌面連
人氣排行 Linux下獲取CPUID、硬盤序列號(hào)與MAC地址linux tc實(shí)現(xiàn)ip流量限制dmidecode命令查看內(nèi)存型號(hào)linux下解壓rar文件安裝紅帽子RedHat Linux9.0操作系統(tǒng)教程Ubuntu linux 關(guān)機(jī)、重啟、注銷 命令lcx.exe、nc.exe、sc.exe入侵中的使用方法查看linux服務(wù)器硬盤IO讀寫負(fù)載