在Linux中,通過taskstats能過獲得per-task或者per-process的統計數據,這樣我們可以通過taskstats監控服務器的I/O.
了解taskstats的最初目的,是為了監控服務器的IO,防止jmeter因為受壓機異常,打印大量日志,把磁盤空間用光,后來發現,由于服務器內核版本比較低(2.6.19),所以沒法直接通過讀取proc里面的IO來獲取進程IO,但是也同樣是因為內核版本太低,taskstats結構中,也比新內核少了磁盤寫入和讀取的統計,只能獲取到磁盤延遲寫入塊數,所以還沒有實戰過.
關于taskstats,內核文檔有非常詳細的文檔和示例代碼,見:http://www.kernel.org/doc/Documentation/accounting/
首先說下taskstats結構,按張文檔的說法“Taskstats is a netlink-based interface for sending per-task and per-process statistics from the kernel to userspace.”注意這里說明了,通過taskstats能過獲得per-task或者per-process的統計數據,也就是內核的所謂pid和tgid的概念.
taskstats的優勢在于:
- efficiently provide statistics during lifetime of a task and on its exit
- unified interface for multiple accounting subsystems --Vevb.com
- extensibility for use by future accounting patches
第一點比較有用,可以注冊一個進程,當進程推出的時候收到taskstats消息,其他沒用到.
taskstats通過netlink和內核進行交互,也就是說交互是異步的,在創建了netlink的fd之后,所有的操作和普通的socket也差不多了,就是需要根據netlink判斷狀態,并且取出真正的payload,也就是taskstats結構。
taskstats的結構在linux/taskstats.h文件中可以看見,里面有幾個比較有用的成員,如:
cpu_count、cpu_delay_total,blkio_count、blkio_delay_total,swapin_count、swapin_delay_total。通過注釋可以大概了解到,xxx_count is the number of delay values recorded,xxx_delay_total is the corresponding cumulative delay in nanoseconds,這樣就能算出delay的量,大概需要多少時間能夠消耗完,從側面可以了解負載情況。我現在在使用的內核,還有很多IO統計的數據,但是2.6.19的內核不支持,就沒辦法使用了。
具體的使用,內核文檔的getdelays.c已經很詳細、很通用了,我參照這個,寫了個比較簡單的.
首先,是創建netlink連接,直接使用里面的create_nl_socket函數就好了,和創建普通socket差不多,只是類型上的區別,前面已經提到,taskstats使用的是NETLINK_GENERIC方式創建的netlink,然后就是發送netlink數據包給內核,具體的發送方式send_cmd函數已經進行了封裝,通過枚舉TASKSTATS_CMD_ATTR_TGID和TASKSTATS_CMD_ATTR_PID,可以獲取對應的pid或者tgid的數據了.
新聞熱點
疑難解答