kdump和crash的配置方法与内核故障原因分析(一)
?最近數(shù)據(jù)庫服務(wù)器備機升級網(wǎng)卡驅(qū)動版本以及大數(shù)據(jù)有個別設(shè)備直接crash重啟了,查看日志也查不到當(dāng)時時間點的日志,查看kdump是開啟了的,但是數(shù)據(jù)庫的kdump不知道為啥沒有生成crash日志,為了發(fā)現(xiàn)問題并找出問題,我在虛機上也配置了kdump學(xué)習(xí)下它的工作原理和實際應(yīng)用。
kdump簡介
?Linux的內(nèi)核十分穩(wěn)定,但仍不可避免地會遇到崩潰的情況,獲取內(nèi)核崩潰時的內(nèi)存鏡像,有助于分析系統(tǒng)在崩潰前發(fā)生了什么,分析原因并修復(fù)錯誤,進(jìn)而改進(jìn)系統(tǒng)的穩(wěn)定性。
Kdump 用于對內(nèi)存鏡像的轉(zhuǎn)儲,它不但可以轉(zhuǎn)儲內(nèi)存鏡像到本地硬盤,還可以將內(nèi)存鏡像通過 NFS, SSH 等協(xié)議轉(zhuǎn)儲到不同機器的設(shè)備上。
Kdump 分為兩個組件: Kexec 和 Kdump。
Kexec 是一種內(nèi)核的快速啟動工具,可以使新的內(nèi)核在正在運行的內(nèi)核(生產(chǎn)內(nèi)核)的上下文中啟動,而不需要通過耗時的 BIOS 檢測,方便內(nèi)核開發(fā)人員對內(nèi)核進(jìn)行調(diào)試。
Kdump 是一種有效的內(nèi)存轉(zhuǎn)儲工具,啟用 Kdump 后,生產(chǎn)內(nèi)核將會保留一部分內(nèi)存空間,用于在內(nèi)核崩潰時通過 Kexec 快速啟動到新的內(nèi)核,這個過程不需要重啟系統(tǒng),因此可以轉(zhuǎn)儲崩潰的生產(chǎn)內(nèi)核的內(nèi)存鏡像。
試驗環(huán)境:
[root@test-server upload]# lsb_release -a LSB Version: :base-4.0-amd64:base-4.0-noarch:core-4.0-amd64:core-4.0-noarch:graphics-4.0-amd64:graphics-4.0-noarch:printing-4.0-amd64:printing-4.0-noarch Distributor ID: RedHatEnterpriseServer Description: Red Hat Enterprise Linux Server release 6.8 (Santiago) Release: 6.8 Codename: Santiago [root@test-server upload]# uname -a Linux test-server 2.6.32-642.el6.x86_64 #1 SMP Wed Apr 13 00:51:26 EDT 2016 x86_64 x86_64 x86_64 GNU/Linux [root@test-server upload]#?一、查看有沒有安裝kexec-tools這個rpm包,沒有就rpm或者yum方式將它安裝上。
[root@test-server upload]# rpm -qa|grep kexec kexec-tools-2.0.0-300.el6.x86_64?二、在grub中為kdump kernel 配置保留的內(nèi)存空間,修改/boot/grub/grub.conf 并且在kernel行增加crashkernel=[size]M (or crashkernel=auto)
crashkernel參數(shù)格式是:br/>crashkernel=nn[KMG]@ss[KMG]
nn表示要為crashkernel預(yù)留多少內(nèi)存
ss表示為crashkernel預(yù)留內(nèi)存的起始位置
?我的grub.conf配置文件配置
?注意:這里grub.conf配置文件中如果crashkernel=auto 對于小內(nèi)存(我自己測試的虛機內(nèi)存是1G)會出現(xiàn)kdump服務(wù)啟動不起來,并且在系統(tǒng)messages日志里出現(xiàn)“kdump: No crashkernel parameter specified for running kernel”,這時需要你手動的指定crashkernel的值
系統(tǒng)的內(nèi)存 <= 8 GB --> crashkernel=128M (后面的可以省略)
系統(tǒng)的內(nèi)存> 8 GB 但是<= 16 GB --> crashkernel=256M
系統(tǒng)內(nèi)存> 16GB --> crashkernel=512M
?三、kdump配置文件將系統(tǒng)崩潰后的文件默認(rèn)放在了/var/crash中,crash文件既可以放在本地也可以在崩潰后傳送到遠(yuǎn)端服務(wù)器,我只在本地分析所以我就使用默認(rèn)配置了。
[root@test-server upload]# egrep -v '^$|^#' /etc/kdump.conf path /var/crash core_collector makedumpfile -c --message-level 1 -d 31?四、啟用kdump后臺程序
4.1 檢查和確保kernel命令行包括了kdump配置和為kdump保留了內(nèi)存轉(zhuǎn)儲空間
[root@test-server upload]# cat /proc/cmdline ro root=/dev/mapper/vg_testserver-LogVol01_root rd_NO_LUKS rd_LVM_LV=vg_testserver/LogVol00_swap rd_LVM_LV=vg_testserver/LogVol01_root rd_NO_MD crashkernel=128M@48M LANG=zh_CN.UTF-8 KEYBOARDTYPE=pc KEYTABLE=us rd_NO_DM rhgb quiet [root@test-server upload]#4.2 將kdump服務(wù)設(shè)置為開機自啟動
[root@test-server upload]# chkconfig kdupmp on [root@test-server upload]# chkconfig --list|grep kdump kdump 0:關(guān)閉 1:關(guān)閉 2:啟用 3:啟用 4:啟用 5:啟用 6:關(guān)閉[root@test-server upload]#
4.3 啟用kdump后臺進(jìn)程
?五、grub配置文件和kdump服務(wù)配置好后需要重啟下系統(tǒng)生效
[root@test-server upload]# reboot
?六、檢查kdump狀態(tài)確保kdump服務(wù)是在運行的
[root@test-server upload]# service kdump status Kdump is operational [root@test-server upload]#?七、測試模擬kdump
[root@test-server upload]# echo 1 > /proc/sys/kernel/sysrq [root@test-server upload]# echo c > /proc/sysrq-trigger?八、使用一下命令觸發(fā)內(nèi)核的崩潰,在/var/crash目錄會有一個內(nèi)核崩潰時間點生成的內(nèi)核鏡像文件
[root@test-server upload]# ls -l /var/crash/ 總用量 4 drwxr-xr-x. 2 root root 4096 12月 19 05:04 127.0.0.1-2017-12-19-05:04:30 [root@test-server upload]#kdump配置完成,現(xiàn)在需要對crash文件進(jìn)行分析
? Crash 是由 David Anderson開發(fā)維護(hù)的分析內(nèi)存轉(zhuǎn)儲文件的工具,它可以分析多種工具產(chǎn)生的內(nèi)存轉(zhuǎn)儲文件。
?一、檢查是否安裝crash rpm安裝包
[root@test-server upload]# type crash crash is hashed (/usr/bin/crash) [root@test-server upload]# rpm -qf /usr/bin/crash crash-7.1.0-6.el6.x86_64 [root@test-server upload]#?二、檢查是否安裝kernel-debuginfo安裝包
[root@test-server upload]# rpm -qa|grep kernel-debuginfo kernel-debuginfo-common-x86_64-2.6.32-642.el6.x86_64 kernel-debuginfo-2.6.32-642.el6.x86_64?三、如果步驟2沒有安裝對應(yīng)的kernel-debuginfo rpm包,需要從網(wǎng)上進(jìn)行下載,ISO鏡像里是沒有這兩個安裝包的。
3.1首先確認(rèn)自己的內(nèi)核版本
[root@test-server upload]# uname -r 2.6.32-642.el6.x86_64 [root@test-server upload]#3.2 根據(jù)內(nèi)核版本下載對應(yīng)版本的kernel-debuginfo rpm包,下載網(wǎng)址是http://debuginfo.centos.org/6/x86_64/,環(huán)境不一樣下載的安裝包版本和網(wǎng)址URL都不一樣
3.3 通過SFTP或者FTP等工具將安裝包傳到對應(yīng)的機器上
3.4 安裝kernel-debuginfo rpm包
?四、使用如下命令即可開始使用 Crash 分析內(nèi)存轉(zhuǎn)儲文件,其中第一個參數(shù)為帶有調(diào)試信息的內(nèi)核, 第二個參數(shù)為某次崩潰產(chǎn)生的內(nèi)存轉(zhuǎn)儲文件
[root@test-server upload]# crash /usr/lib/debug/lib/modules/2.6.32-642.el6.x86_64/vmlinux /var/crash/127.0.0.1-2017-12-19-05\:04\:30/vmcorecrash 7.1.0-6.el6 Copyright (C) 2002-2014 Red Hat, Inc. Copyright (C) 2004, 2005, 2006, 2010 IBM Corporation Copyright (C) 1999-2006 Hewlett-Packard Co Copyright (C) 2005, 2006, 2011, 2012 Fujitsu Limited Copyright (C) 2006, 2007 VA Linux Systems Japan K.K. Copyright (C) 2005, 2011 NEC Corporation Copyright (C) 1999, 2002, 2007 Silicon Graphics, Inc. Copyright (C) 1999, 2000, 2001, 2002 Mission Critical Linux, Inc. This program is free software, covered by the GNU General Public License, and you are welcome to change it and/or distribute copies of it under certain conditions. Enter "help copying" to see the conditions. This program has absolutely no warranty. Enter "help warranty" for details.GNU gdb (GDB) 7.6 Copyright (C) 2013 Free Software Foundation, Inc. License GPLv3+: GNU GPL version 3 or later <http://gnu.org/licenses/gpl.html> This is free software: you are free to change and redistribute it. There is NO WARRANTY, to the extent permitted by law. Type "show copying" and "show warranty" for details. This GDB was configured as "x86_64-unknown-linux-gnu"...WARNING: kernel version inconsistency between vmlinux and dumpfileKERNEL: /usr/lib/debug/lib/modules/2.6.32-642.el6.x86_64/vmlinuxDUMPFILE: /var/crash/127.0.0.1-2017-12-19-05:04:30/vmcore [PARTIAL DUMP]CPUS: 1DATE: Tue Dec 19 05:04:27 2017UPTIME: 00:02:22 LOAD AVERAGE: 0.15, 0.13, 0.05TASKS: 205NODENAME: test-serverRELEASE: 2.6.32-642.el6.x86_64VERSION: #1 SMP Wed Apr 13 00:51:26 EDT 2016MACHINE: x86_64 (2294 Mhz)MEMORY: 1 GBPANIC: "SysRq : Trigger a crash"PID: 2236COMMAND: "bash"TASK: ffff88003e268ab0 [THREAD_INFO: ffff880039cf8000]CPU: 0STATE: TASK_RUNNING (SYSRQ)其中各項參數(shù)的意義為:
KERNEL: 表示調(diào)試用內(nèi)核的位置和版本信息;
DUMPFILE: 表示所分析的內(nèi)存轉(zhuǎn)儲鏡像
CPUS: 表示本機的 CPU 數(shù)目;
DATE: 表示內(nèi)核崩潰發(fā)生的時間;
UPTIME: 表示內(nèi)核已正常運行的時間;
LOAD AVERAGE: 表示內(nèi)核崩潰時系統(tǒng)的負(fù)載;
TASKS: 表示內(nèi)核崩潰時系統(tǒng)運行的任務(wù)數(shù);
NODENAME: 表示內(nèi)核崩潰的機器的主機名;
RELEASE: 表示內(nèi)核的發(fā)布版本;
VERSION: 表示內(nèi)核的其他版本信息
MACHINE: 表示 CPU 的架構(gòu)和主頻信息;
MEMORY: 表示發(fā)生內(nèi)核崩潰的系統(tǒng)的內(nèi)存大小;
PANIC: 表示內(nèi)核崩潰的類型; 這里可能有 SysRq(即通過系統(tǒng)請求造
成的內(nèi)核崩潰,如上面測試用的命令即是), Oops(表示內(nèi)核
發(fā)生了不可預(yù)期的或不正確的行為,這時會殺死相應(yīng)的進(jìn)程,
內(nèi)核可能恢復(fù)正常,也可能處于一種不確定的狀態(tài),并進(jìn)而導(dǎo)
致內(nèi)核的 Panic), 以及 Panic( 內(nèi)核崩潰,即發(fā)生了嚴(yán)重且不可
修復(fù)的錯誤, 如發(fā)生了非法的地址訪問, 強制加載或卸載內(nèi)核
模塊,以及硬件錯誤等等)。
PID: 表示導(dǎo)致內(nèi)核崩潰的進(jìn)程號;
COMMAND: 表示導(dǎo)致內(nèi)核崩潰的進(jìn)程名稱
TASK: 表示導(dǎo)致內(nèi)核崩潰的進(jìn)程訪問的內(nèi)存地址;
CPU: 表示導(dǎo)致內(nèi)核崩潰的進(jìn)程占用的 CPU 數(shù)目;
STATE: 表示導(dǎo)致內(nèi)核崩潰的進(jìn)程的運行狀態(tài)。
以上信息可用于初步分析內(nèi)核崩潰的原因,內(nèi)核態(tài)有三種出錯情況,分別是 bug, oops
和 panic。 bug 屬于輕微錯誤, oops 代表某一用戶進(jìn)程出現(xiàn)錯誤,需要殺死用戶進(jìn)程。
這時如果用戶進(jìn)程占用了某些信號鎖,所以這些信號鎖將永遠(yuǎn)不會得到釋放,這會導(dǎo)致
系統(tǒng)潛在的不穩(wěn)定性。 panic 是嚴(yán)重錯誤,代表整個系統(tǒng)崩潰。 深入的分析需要使用更
多的命令進(jìn)行追蹤和查找.
Crash 常用的命令有如下幾個:
help #查看命令的幫助信息, 也可用 man 命令
h #查看歷史命令,相當(dāng)于 shell 下的 history
log #該命令用于打印出內(nèi)存的日志信息
bt #該命令用于獲取當(dāng)前線程的調(diào)用堆棧
foreach bt #該命令用于獲取所有線程的調(diào)用堆棧
ps #該命令用于查看內(nèi)核崩潰時的進(jìn)程信息
vm #該命令用于查看當(dāng)前的內(nèi)核上下文的虛擬內(nèi)存信息
files #該命令用于查看當(dāng)前的內(nèi)核上下文中打開的文件
exit or q #退出 Crash
更詳細(xì)的命令介紹可以查看官方介紹:http://people.redhat.com/anderson/help.html
crash經(jīng)常發(fā)生在應(yīng)用負(fù)載比較大的系統(tǒng)上,特別是大數(shù)據(jù)集群設(shè)備,接下來的會直接附上實際案例。
轉(zhuǎn)載于:https://blog.51cto.com/kk876435928/2054256
總結(jié)
以上是生活随笔為你收集整理的kdump和crash的配置方法与内核故障原因分析(一)的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: org.springframework.
- 下一篇: redis中几种数据存储方式的比较