Delay accounting 延時統計 任務在執行時等待某個內核資源會意外遇到延遲,例如可運行的任務正在等待空閑CPU。 per-task的延時統計功能測量下列情況下任務經歷的延遲: 正在等待CPU,waiting for a CPU (while being runnable) 同步塊I/O的 ...
Delay accounting
延時統計
任務在執行時等待某個內核資源會意外遇到延遲,例如可運行的任務正在等待空閑CPU。
per-task的延時統計功能測量下列情況下任務經歷的延遲:
- 正在等待CPU,waiting for a CPU (while being runnable)
- 同步塊I/O的完成,completion of synchronous block I/O initiated by the task
- 正在頁面內交換,swapping in pages
- 記憶體回收,memory reclaim
- 占滿頁面緩存,thrashing page cache
- 直接壓縮,direct compact
- 防寫拷貝,write-protect copy
這些統計功能通過taskstats介面提供給用戶空間使用。
這些延遲給設置CPU優先順序,IO優先順序和合適的RSS限制提供了反饋。重要任務的長期延遲可以作為一個觸發器來提高它的優先順序。
這個功能,通過使用taskstats介面,也為所有的線程組(傳統的UNIX進程)中的任務或者線程提供了延時統計,這種收集比內核收集更有效。
用戶空間的應用,特別是資源管理應用程式,也能收集延遲統計到任意分組。要使能這個功能,任務的延遲統計能在整個生存周期內和退出時都可用,需要保證連續的和完全的監測。
介面
延遲統計使用的taskstats介面在本目錄下的文檔中被詳細地描述。Taskstats給用戶空間返回一個per-pid和per-tgid統計的通用數據結構。延遲統計功能計算這個結構中的具體數據域。參看include/uapi/linux/taskstats.h
中的與延遲統計有關的數據域描述。
它一般以計數器的形式返回累計延遲(for cpu, sync block I/O, swapin, memory reclaim, thrash page cache, direct compact, write-protect copy等)。
獲取任務計數器(cpu_delay_total)的兩個連續讀數的差異,由於等待這個間隔內的相關資源也會帶來任務延遲。
當任務退出時,per-task統計的記錄被髮送給用戶空間。如果它是線程組中最後退出的任務,per-tgid統計也會被髮送。更多細節由taskstats介面描述給出。
在tools/accounting目錄下的用戶空間程式getdelays.c允許運行簡單的命令和顯示相關的延遲統計信息。它也用作taskstats的簡單示例。
使用
編譯內核:
CONFIG_TASK_DELAY_ACCT=y
CONFIG_TASKSTATS=y
延遲統計啟動時預設是禁止的,要使能它,增加delayacct
到內核啟動選項。要麼使用sysctl kernel.task_delayacct在運行時來切換狀態。註意只要在使能之後啟動任務,它就有delayacct信息。
系統系統之後,使用跟getdelays.c相似的程式來訪問任務或者任務組(tgid)相關的延遲。應用程式也允許執行命令和查看相關的延遲。
getdelays命令的一般格式:
getdelays [-dilv] [-t tgid] [-p pid]
獲取自系統啟動以來PID 10的延遲:
# ./getdelays -d -p 10
(output similar to next case)
獲取自系統啟動以來tgid 5中所有pid的延遲總和:
# ./getdelays -d -t 5
print delayacct stats ON
TGID 5
CPU count real total virtual total delay total delay average
8 7000000 6872122 3382277 0.423ms
IO count delay total delay average
0 0 0ms
SWAP count delay total delay average
0 0 0ms
RECLAIM count delay total delay average
0 0 0ms
THRASHING count delay total delay average
0 0 0ms
COMPACT count delay total delay average
0 0 0ms
WPCOPY count delay total delay average
0 0 0ms
獲取pid1的IO統計:
# ./getdelays -i -p 1
printing IO accounting
linuxrc: read=65536, write=0, cancelled_write=0
上述命令可以使用-v來獲取等多調試信息。
英文原文:
https://www.kernel.org/doc/html/latest/accounting/delay-accounting.html