linux系統內存dump機制介紹(一)--kdump
03-21
- kdump的原理介紹
按照linux系統的設計哲學,內核只提供dump內存的機制,用戶想要dump什麼樣的內存,dump多少內存是屬於策略問題,由用戶來決定。
在真實的使用場景中,主要有兩種使用方式:一種是dump某一個進程的地址空間來供用戶在進程掛掉之後debug分析,也就是通常所說的coredump,這個在下一篇中描述;另一種就是dump整個系統的內存空間,以便於系統管理員debug分析系統掛掉的原因,也就是本文描述的kdump。
由於dump內存的邏輯依然需要系統可以正常工作,管理系統的各種資源,所以kdump整個過程依賴kexec和一個額外的dump內核來保證整個流程正確的執行。下圖描述了kdump的整個流程:- kdump涉及的組件
- kdump專用內核,通過kexec工具load到預留的內存中,供故障引導使用
- kexec工具,負責載入crash內核,以及一些啟動參數傳遞
- makedumpfile工具,負責將故障內核的內存copy,壓縮,寫去指定文件
- kdump的實現
- 首先是工作內核啟動,包括硬體自檢初始化,bootloader載入內核並發引導內核啟動,然後配置預留內存,並使用kexec工具將crash內核載入到保留內存中。
- 工作內核在遇到故障觸發panic之後啟動crash kernel,kexec啟動crash kernel只執行內核初始化邏輯,不再做硬體自檢初始化,啟動速度很快。
- crash內核載入好之後可以正常管理一部分系統資源,通過/proc/vmcore內存鏡像文件,將故障內存經過壓縮之後寫入到硬碟的dump文件中保存
- 捕獲完畢之後重啟系統,完成故障恢復
隨著系統內存的不斷增大,故障恢復時間也隨之線性增加,兩次系統啟動時間比較固定,線性增加的時間主要是受copy內存、壓縮內存以及文件落盤影響。所以社區也出現了很多kdump優化的方案,主要也是針對這個幾個方面實現的:
- copy內存方面,為了減少系統調用的次數,實現了vmcore的mmap方法,可以提高copy的效率
- 內存壓縮方面,引入了壓縮效率比較高的lzo演算法來替換原來的gzip演算法
- 落盤方面主要考慮並發寫文件和優化io效率
- 如何使用kdump
- 修改啟動參數,增加crashkernel欄位,通過/proc/cmdline可以觀察是否生效
- 安裝kdump組件包,包括crash kernel和kexec組件
- 啟動kdump服務,通過service命令或者/etc目錄中的啟動腳本啟動
- 觀察/proc/iomem中是否成功load了crash kernel
推薦閱讀:
TAG:Linux內核 |