歡迎來到Linux教程網
Linux教程網
Linux教程網
Linux教程網
Linux教程網 >> Linux基礎 >> Linux教程 >> Linux下快速獲取某個線程的IO讀寫情況

Linux下快速獲取某個線程的IO讀寫情況

日期:2017/2/27 16:01:36   编辑:Linux教程
最近線上發生Java進程瘋狂寫磁盤的杯具,雖然沒有造成大礙.由此可以想到如果在出現問題的時候能夠快速定位到相應的線程,然後通過其它工具確定該線程堆棧信息,就可以很大程度上解決問題.

每個進程,在/proc目錄下都對應一個子目錄(以該進程id命名),關於該目錄每個偽文件的內容,這裡不一一細說。而進程所有的線程,都在task子目錄下,目錄結構是:/proc/[pid]/task/[tid]。其中/proc/[pid]和/proc/[pid]/task/[tid]這兩個目錄下的文件名和格式基本上一致,主要是由於Linux不存在NT式的原生線程支持,線程也是以LWP(light weight processes)的方法運行。而這裡只關心其中一個即io這個文件,該文件的內容實際上就是進程的實時io信息,例如:


根據linux內核文檔(鏈接見末尾)說明,各個分量含義如下:
http://git.kernel.org/?p=linux/kernel/git/torvalds/linux-2.6.git;a=blob;f=Documentation/filesystems/proc.txt;hb=HEAD#l1305

rchar:讀計數器。所有傳送給read系統調用的count的和值,顯然,像輸出到控制台(printf)這種操作,也會被計入該計數器。注意read並不一定每次都會讀count指定的那麼多數據。
[read系統調用原型:ssize_t read(int fd, void *buf, size_t count);]

wchar:類似於rchar,只不過是寫操作
syscr:read系統調用被調用的次數;
syscw:write系統調用被調用的次數;
read_bytes:實際發生塊設備讀的字節數;
write_bytes:實際發生塊設備寫的字節數;
對於我們而言,最後兩個分量才是最有價值的,最能體現進程讀寫磁盤的情況。 
根據個人的研究,很多工具如dstat也是利用這個原理的。

一旦獲取了線程id,就可以很方便的再使用jstack來分析該線程的調用堆棧,看看它究竟在干啥了。

一個python腳本,可以輸出某個進程前10個讀寫最大的線程id。
http://code.google.com/p/sdkfz000/source/browse/trunk/tio/tio.py
Copyright © Linux教程網 All Rights Reserved