延遲統計¶
當任務等待某些核心資源可用時,例如一個可執行的任務可能等待一個空閒的 CPU 來執行,它們在執行過程中會遇到延遲。
每個任務的延遲統計功能測量任務在以下情況中遇到的延遲:
等待 CPU(同時處於可執行狀態)
完成由任務發起的同步塊 I/O
交換頁面
記憶體回收
抖動
直接壓縮
防寫複製
IRQ/SOFTIRQ
並將這些統計資料透過 taskstats 介面提供給使用者空間。
這些延遲提供了反饋,以便適當地設定任務的 CPU 優先順序、IO 優先順序和 rss 限制值。 重要任務的長時間延遲可能是提高其相應優先順序的觸發因素。
該功能透過使用 taskstats 介面,還提供了執行緒組(對應於傳統的 Unix 程序)中所有任務(或執行緒)的聚合延遲統計資訊。 這是核心更有效完成的常用聚合。
使用者空間實用程式,特別是資源管理應用程式,還可以將延遲統計資訊聚合到任意組中。 為了實現這一點,任務的延遲統計資訊在其生命週期內及其退出時都可用,確保可以進行連續和完整的監控。
介面¶
延遲統計使用 taskstats 介面,該介面在本目錄中的單獨文件中詳細描述。 Taskstats 將一個通用的資料結構返回給使用者空間,對應於每個 pid 和每個 tgid 的統計資訊。 延遲統計功能填充此結構的特定欄位。 參見
include/uapi/linux/taskstats.h
瞭解有關延遲統計的欄位的描述。 它通常以計數器的形式返回 CPU、同步塊 I/O、交換、記憶體回收、抖動頁面快取、直接壓縮、防寫複製、IRQ/SOFTIRQ 等的累積延遲。
獲取給定任務的給定計數器(例如 cpu_delay_total)的兩個連續讀數之間的差值,將給出該任務在該時間間隔內等待相應資源所經歷的延遲。
當任務退出時,包含每個任務統計資訊的記錄將傳送到使用者空間,而無需命令。 如果它是執行緒組的最後一個退出任務,也會發送每個 tgid 的統計資訊。 任務統計介面描述中提供了更多詳細資訊。
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 為 242 的所有 pid 的延遲的總和和峰值
bash-4.4# ./getdelays -d -t 242
print delayacct stats ON
TGID 242
CPU count real total virtual total delay total delay average delay max delay min
39 156000000 156576579 2111069 0.054ms 0.212296ms 0.031307ms
IO count delay total delay average delay max delay min
0 0 0.000ms 0.000000ms 0.000000ms
SWAP count delay total delay average delay max delay min
0 0 0.000ms 0.000000ms 0.000000ms
RECLAIM count delay total delay average delay max delay min
0 0 0.000ms 0.000000ms 0.000000ms
THRASHING count delay total delay average delay max delay min
0 0 0.000ms 0.000000ms 0.000000ms
COMPACT count delay total delay average delay max delay min
0 0 0.000ms 0.000000ms 0.000000ms
WPCOPY count delay total delay average delay max delay min
156 11215873 0.072ms 0.207403ms 0.033913ms
IRQ count delay total delay average delay max delay min
0 0 0.000ms 0.000000ms 0.000000ms
獲取 pid 1 的 IO 統計資訊,它僅適用於 -p
# ./getdelays -i -p 1
printing IO accounting
linuxrc: read=65536, write=0, cancelled_write=0
以上命令可以與 -v 一起使用以獲取更多除錯資訊。