核卡頓先看增量:一份不會上來就關(guān) THP 的排障記錄)
看到khugepaged出現(xiàn)在采樣里就把 THP 全關(guān)掉很容易把排障變成猜參數(shù)。compact_stall在一張截圖里很大也可能只是機器已經(jīng)運行了很久。沒有時間窗口累計值不能告訴我們這一分鐘發(fā)生了什么。這篇用構(gòu)造日志講排查步驟不寫成一次發(fā)生過的生產(chǎn)事故。真實系統(tǒng)的證據(jù)應包含同一時間窗的延遲、CPU、內(nèi)存壓力、內(nèi)核棧與計數(shù)器變化而不是先給一個驚險故事再替故事找命令。從兩個快照開始Linux 的 THP 文檔還討論了 multi-size THP不是所有透明大頁都只能按“2MB 對 4KB”解釋??捎么笮∨c啟用方式取決于實際系統(tǒng)。文檔也提醒某些MADV_COLLAPSE行為不被普通 sysfs 的 never 設(shè)置完全覆蓋因此“寫入 never 就永久關(guān)閉一切 THP”過于絕對。官方說明先記錄內(nèi)核版本與/proc/vmstat的兩個快照把差值除以間隔得到速率。若發(fā)生計數(shù)回退可能是重啟或輸入不一致應中止當前比較而不是把負數(shù)當成性能改善。什么證據(jù)能支持 THP 假設(shè)內(nèi)存規(guī)整計數(shù)上漲只是線索。還需要看延遲尖峰是否同窗、采樣棧是否落在相關(guān)路徑、壓力是否來自其他內(nèi)存回收。然后在可以回滾的對照環(huán)境里改變一個條件。樣例不執(zhí)行任何內(nèi)核寫操作也不提供脫離版本條件的調(diào)參套餐。圖把累計計數(shù)、增量與速率分開。兩個快照中的數(shù)值是教學輸入不代表服務器的真實基線也不能單獨證明 THP 導致了請求停頓。def parse_vmstat(text): result {} for line in text.splitlines(): fields line.split() if len(fields) ! 2 or fields[0] in result: raise ValueError(invalid or repeated counter) value int(fields[1]) if value 0: raise ValueError(negative counter) result[fields[0]] value return result def rates(before, after, seconds): if seconds 0: raise ValueError(positive observation interval required) result {} for key in before.keys() after.keys(): delta after[key] - before[key] if delta 0: raise ValueError(counter reset: key) result[key] delta / seconds return result before parse_vmstat(compact_stall 100\nthp_collapse_alloc_failed 8) after parse_vmstat(compact_stall 130\nthp_collapse_alloc_failed 10) r rates(before, after, 10) assert r {compact_stall: 3.0, thp_collapse_alloc_failed: 0.2} try: rates(after, before, 10) except ValueError: pass else: raise AssertionError(reset was interpreted as improvement) print(compact_stall3.0/s; collapse_failed0.2/s; reset rejected)例子跑通以后還要驗證什么這段代碼已在本地 macOS、CPython 3.9.6 下運行實際輸出為compact_stall3.0/s; collapse_failed0.2/s; reset rejected。它驗證的是例子中的數(shù)據(jù)約束與分支不包含線上服務的吞吐或延遲測量。本地僅運行文本解析與差分邏輯沒有讀取宿主機 Linux 指標、執(zhí)行 perf 或更改 sysfs。真正定位需要業(yè)務延遲與內(nèi)核證據(jù)的時間對齊以及適合該發(fā)行版的觀測手段。關(guān)閉功能后的改善也要檢查吞吐、內(nèi)存占用和后續(xù)回歸不能只看一次 P99。延伸閱讀Linux Transparent Hugepage SupportTHP 大小、控制方式與行為邊界的依據(jù)。