標籤:

linux系統內存dump機制介紹(一)--kdump

  • kdump的原理介紹

按照linux系統的設計哲學,內核只提供dump內存的機制,用戶想要dump什麼樣的內存,dump多少內存是屬於策略問題,由用戶來決定。

在真實的使用場景中,主要有兩種使用方式:

一種是dump某一個進程的地址空間來供用戶在進程掛掉之後debug分析,也就是通常所說的coredump,這個在下一篇中描述;

另一種就是dump整個系統的內存空間,以便於系統管理員debug分析系統掛掉的原因,也就是本文描述的kdump。

由於dump內存的邏輯依然需要系統可以正常工作,管理系統的各種資源,所以kdump整個過程依賴kexec和一個額外的dump內核來保證整個流程正確的執行。

下圖描述了kdump的整個流程:

  • kdump涉及的組件
  1. kdump專用內核,通過kexec工具load到預留的內存中,供故障引導使用
  2. kexec工具,負責載入crash內核,以及一些啟動參數傳遞
  3. makedumpfile工具,負責將故障內核的內存copy,壓縮,寫去指定文件

  • kdump的實現

kdump整個流程涉及到兩次內核啟動:

  1. 首先是工作內核啟動,包括硬體自檢初始化,bootloader載入內核並發引導內核啟動,然後配置預留內存,並使用kexec工具將crash內核載入到保留內存中。
  2. 工作內核在遇到故障觸發panic之後啟動crash kernel,kexec啟動crash kernel只執行內核初始化邏輯,不再做硬體自檢初始化,啟動速度很快。
  3. crash內核載入好之後可以正常管理一部分系統資源,通過/proc/vmcore內存鏡像文件,將故障內存經過壓縮之後寫入到硬碟的dump文件中保存
  4. 捕獲完畢之後重啟系統,完成故障恢復

隨著系統內存的不斷增大,故障恢復時間也隨之線性增加,兩次系統啟動時間比較固定,線性增加的時間主要是受copy內存、壓縮內存以及文件落盤影響。所以社區也出現了很多kdump優化的方案,主要也是針對這個幾個方面實現的:

  • copy內存方面,為了減少系統調用的次數,實現了vmcore的mmap方法,可以提高copy的效率
  • 內存壓縮方面,引入了壓縮效率比較高的lzo演算法來替換原來的gzip演算法
  • 落盤方面主要考慮並發寫文件和優化io效率

  • 如何使用kdump
  1. 修改啟動參數,增加crashkernel欄位,通過/proc/cmdline可以觀察是否生效
  2. 安裝kdump組件包,包括crash kernel和kexec組件
  3. 啟動kdump服務,通過service命令或者/etc目錄中的啟動腳本啟動
  4. 觀察/proc/iomem中是否成功load了crash kernel

推薦閱讀:

TAG:Linux內核 |