標籤:des http io 使用 ar strong 檔案 2014 art
紅帽Linux故障定位技術詳解與執行個體(3)
線上故障定位就是在故障發生時, 故障所處的作業系統環境仍然可以訪問,故障處理人員可通過console, ssh等方式登入到作業系統上,在shell上執行各種操作命令或測試程式的方式對故障環境進行觀察,分析,測試,以定位出故障發生的原因。
AD:2014WOT全球軟體技術峰會北京站 課程視頻發布
5、用kdump工具核心故障定位執行個體
A) 部署Kdump
部署 kdump 收集故障資訊的步驟如下:
(1)設定好相關的核心啟動參數
在 /boot/grub/menu.lst 中加入如下內容
- crashkernel=[email protected] nmi_watchdog=1
其中crashkernel參數是用來為kdump的核心預留記憶體的; nmi_watchdog=1 是用來啟用NMI中斷的, 我們在未確定故障是否關閉了中斷的情況下, 需要部署NMI watchdog才能確保觸發panic. 重啟系統確保設定生效
(2)設定好相關的sysctl核心參數
在/etc/sysctl.conf 中最後加入一行
- kernel.softlookup_panic = 1
該設定確保softlock發生時會調用panic, 從而觸發kdump行為執行 #>sysctl -p 確保設定生效
(3)配置 /etc/kdump.conf
在 /etc/kdump.conf 中加入如下幾行內容
- ext3 /dev/sdb1
- core-collector makedumpfile -c –message-level 7 -d 31 -i /mnt/vmcoreinfo
- path /var/crash
- default reboot
其中 /dev/sdb1 是用於放置dumpfile 的檔案系統, dumpfile 檔案放置在/var/crash下, 要事先在/dev/sdb1分區下建立/var/crash 目錄. “-d 31”指定對dump內容的過濾層級,這參數對於dump分區放不下全部記憶體內容或使用者不想讓dumping中斷業務太長時間時很重要. vmcoreinfo 檔案放置在 /dev/sdb1 分區的 / 目錄下, 需要使用如下命令產生:
#>makedumpfile -g //vmcoreinfo -x /usr/lib/debug/lib/modules/2.6.18-128.el5.x86_64/vmlinux
“vmlinux” 檔案是由kernel-debuginfo 包提供的,在運行makedumpfile 之前需要安裝相應核心的 kernel-debuginfo 和 kernel-debuginfo-common 兩個包,該兩個包需從 http://ftp.redhat.com 下載. “default reboot” 用來告訴kdump, 收集完dump資訊後重啟系統
(4)啟用kdump
運行 #>service kdump start 命令,你會看到,在成功完成的情況下會在/boot/目錄下產生一個initrd-2.6.18-128.el5.x86_64kdump.img 檔案,該檔案就是kdump載入的核心的 initrd檔案,收集dump資訊的工作就是在該initrd的啟動環境下進行的. 查看/etc/init.d/kdump指令碼的代碼,你可看到其中會調用mkdumprd命令建立用於dump的initrd檔案
1、測試Kdump部署的有效性
為了測試kdump部署的有效性,本人寫了如下一個核心模組,通過insmod 載入該核心模組, 就能產生一個核心線程,在10秒左右後,佔據100%的CPU,在20秒左右後觸發kdump. 系統重啟後,檢查/oracle分區/var/crash 目錄下的內容,就能確認vmcore檔案是否產生.
- Zqfthread.c #include
- #include
- #include
- #include
- #include
- #include
-
- MODULE_AUTHOR("[email protected]");
- MODULE_DESCRIPTION("A module to test ....");
- MODULE_LICENSE("GPL");
-
- static struct task_struct *zqf_thread;
- static int zqfd_thread(void *data);
-
- static int zqfd_thread(void *data)
- {
- int i=0;
-
- while (!kthread_should_stop()) {
- i++;
- if ( i < 10 ) {
- msleep_interruptible(1000);
- printk("%d seconds\n", i);
- }
- if ( i == 1000 ) // Running in the kernel
- i = 11 ;
- }
- return 0;
- }
- static int __init zqfinit(void)
- {
- struct task_struct *p;
-
- p = kthread_create(zqfd_thread, NULL,"%s","zqfd");
-
- if ( p ) {
- zqf_thread = p;
- wake_up_process(zqf_thread); // actually start it up
- return(0);
- }
-
- return(-1);
- }
-
- static void __exit zqffini(void)
- {
- kthread_stop(zqf_thread);
- }
-
- module_init(zqfinit);
- module_exit(zqffini)
-
- Makefile obj-m += zqfthread.o
- Making #> make -C /usr/src/kernels/2.6.32-71.el6.x86_64/ M=`pwd` modules
2、用crash 工具分析vmcore 檔案
用crash 命令分析vmcore 的命令列格式如下所示. 用crash開啟vmcore後,主要是用dmesg及 bt 命令列印出問題的執行路徑的call trace, 用dis 反組譯碼出代碼,最終確認call trace對應的C源碼中的位置,再進行邏輯分析.
- #>crash /usr/lib/debug/lib/modules/2.6.18-128.el5.x86_64/vmlinux /boot/System.map-2.6.18-128.el5.x86_64 ./vmcore
紅帽Linux故障定位技術詳解與執行個體(3)