1. Kdump工具 Kdump的工作機制是在內核崩潰時, 通過kexec 工具由BIOS啟動一個備用內核, 由備用內核執行一系列任務,保存記憶體中崩潰內核的狀態, 供後續故障分析用. 本文預設AMD或INTEL X86_64架構, RHEL7系統環境. 1.1 內核管理工具Kdump安裝 Kdump ...
1. Kdump工具
Kdump的工作機制是在內核崩潰時, 通過kexec 工具由BIOS啟動一個備用內核, 由備用內核執行一系列任務,保存記憶體中崩潰內核的狀態, 供後續故障分析用.
本文預設AMD或INTEL X86_64架構, RHEL7系統環境.
1.1 內核管理工具Kdump安裝
Kdump是RHEL7中自帶的內核管理工具.在RHEL7.1之前的版本,kdump作為安裝完成之後的可選組件自動安裝,從RHEL7.1開始kdump被植入安裝界面,作為系統基礎工具供安裝選擇.
可以通過下麵命令直接RPM包安裝.
yum -y install kexec-tools rpm -q kexec-tools
同時,Kdump還配備了圖形化管理工具,可以通過下麵命令安裝.
yum -y install system-config-kdump
對於RHEL7.4及之後的版本,kdump支持INTEL IOMMU. 而不支持RHEL7.3及之前的版本.
1.2 通過命令行配置kdump記憶體容量
kdump能監控系統內核運行狀態,其地位比較特殊. kdump的記憶體空間是在系統啟動時,由引導程式分配的,相對於系統內核,kdump記憶體是一個獨立的空間.
可以通過如下命令指定kdump的記憶體空間大小.
crashkernel=128M #為kdump保留128M的記憶體空間.
crashkernel的值可以設置成“auto",在一些擁有較大記憶體的系統中,利於實現Kdump的自動化管理.
crashkernel=auto
當然,crashkernel的值還可以通過如下形式實現更靈活的配置.
crashkernel=<範圍1>:<大小1>, <範圍2>:<大小2>
crashkernel=512M-2G:64M,2G-:128M #當系統記憶體在512M-2G之間時,為Kdump保留64M的記憶體空間;當系統記憶體大於2G時,為Kdump保留128M的記憶體空間.
還可以這樣:
crashkernel=128M@16M #為Kdump保留128M的記憶體空間,記憶體地址從16M(physical address 0x01000000)開始.
1.3 Kdump的存儲
Kdump的配置在/etc/kdump.cnf中. kdump提供多種方式將捕獲到內核崩潰數據本地保存或保存到遠程主機.
#path /var/crash #kdump本地存儲目錄,預設是存放在/var/crash目錄下,可以根據使用習慣設置. path /usr/local/cores
... #raw /dev/vg/lv_kdump #kdump可以直接寫入移動介質. raw /dev/sdb1
... #nfs my.server.com:/export/tmp #kdump可以通過NFS保存到網路上其它存儲設備中. nfs test.example.com:/export/cores ... #ssh [email protected] #kdump可以通過SSH傳輸協議,保存遠程主機上. #sshkey /root/.ssh/kdump_id_rsa ssh [email protected] sshkey /root/.ssh/mykey
kdump.conf中還可以在 core_collector makedumpfile 選項後加上" -c ", 使kdump文件能夠被壓縮,以節省存儲空間.
core_collector makedumpfile -c
systemctl start kdump.service #啟動Kdump服務 systemctl enable kdump.service #使Kdump開機自啟 systemctl is-active kdump #檢查Kdump是否已啟動 active echo 1 > /proc/sys/kernel/sysrq #模擬內核崩潰,檢查/var/crash/是否自動保存Kdump捕獲的內核崩潰數據, 以確定Kdump是否正常工作 echo c > /proc/sysrq-trigger
需要註意的是
(1)在RHEL7之前的版本中,kdump的存儲目錄會隨著kdump服務的啟動而由系統自動創建. RHEL7中,如果改變了kdump的存儲目錄,則必須在啟動kdump服務之前,手動創建kdump的存儲目錄,否則kdump服務會啟動失敗.
(2)如果在安裝界面禁用了kdump, 而安裝完成之後再通過systemctl start kdump啟動kdump, 會報記憶體不足無法啟動的錯誤. kdump的記憶體空間是在內核載入之前由boot分配的, 所以必須修改boot. 最好使用kdump的圖形管理工具 system-config-kdump 載入kdump的預設配置, 使kdump處於可用狀態, 然後重啟系統, systemctl status kdump 服務處於激活狀態(active).
1.4 利用crash功能分析內核崩潰
利用crash功能組件能夠分析linux內核崩潰時的網路、磁碟、CPU、系統內核狀態,快速定位故障點.
crash組件可以通過RPM包安裝.
sudo yum -y install crash #安裝crash
sudo debuginfo-install kernel #安裝內核調試模塊
sudo crash /usr/lib/debug/lib/modules/<kernel>/vmlinux /var/crash/<timestamp>/vmcore #啟動crash調試
測試一下:
crash基本調試命令:
crash>log #崩潰時日誌記錄 crash>bt #崩潰時的堆棧信息 crash>vm #崩潰時的記憶體狀態 crash>ps #崩潰時的進程狀態 crash>files #崩潰時的打開的文件 crash>exit #退出crash
2 linux內核調校
2.1 kernel的調校途徑
RHEL7中提供三種內核調校方法:
(1)使用sysctl 命令;
(2)修改/etc/sysctl.d/ 目錄下的內核配置文件;
(3)通過shell 在/proc/sys 目錄下掛載虛擬文件系統;
2.2 sysctl命令可以列出、讀取、設置內核參數, 還可以將參數設置為臨時或永久.
sysctl -a #列出所有可調校的項 sysctl kernel.version #列出kernel的版本信息 sysctl <tunable class>.<tunable>=<value> #使調校參數臨時生效 sysctl -W <tunable class>.<tunable>=<value> #使調校參數永久生效
2.3 修改/etc/sysctl.d/99-sysctl.conf 目錄下的99-sysctl.conf文件
cp /etc/sysctl.d/99-sysctl.conf /etc/sysctl.d/99-sysctl.conf.bak #備份系統預設的內核參數文件 vim /etc/sysctl.d/99-my.conf #創建新的內核參數文件 ... <tunable class>.<tunable> = <value> #寫入要調校的參數類和值 <tunable class>.<tunable> = <value> ... save #保存文件 reboot\ sysctl -p /etc/sysctl.d/99-my.conf #重啟系統或者使用sysctl -p 命令載入新的內核參數配置
2.4 sysctl 調校內核參數
(1)調整最大請求的aio數量.
sysctl -a | grep fs.aio #查看內核預設的最大aio值 sysctl fs.aio-max-nr=2048576 #臨時調整aio最大值
(2)開啟本地ipv4轉發功能.
sysctl net.ipv4.ip_forward = 1
(3)設定進程能被分配到的最大記憶體空間.
sysctl vm.max_map_count = 65530
(4)設定系統中同時運行的最大進程數.
sysctl kernel.threads-max = 16161
在root許可權下,通過sysctl 命令的內核參數調校, 基本上能直接控制linux 的內核所有行為, 滿足實際生產中的絕大多數需求.