正文
Crash的简单学习
前言
最近进行海光服务器的压测, 多次出现了压测时宕机的情况.
跟OS,DB还有hardware的vender都进行过沟通, 但都比较难定位具体问题.
麒麟操作系统说需要进行一下vmcore的确认.
这边也获取了一下麒麟的文档. 想着自己总结一下问题. 便于以后查询
kdump的简介
kdump 应该是linux为了进行问题定位的一个内核转储机制.
他的方式为,在内核出现宕机或者是panic时有一个抓取内存映象的内核进程
将生产内核的核心内存dump出来. 便于宕机后的事故分析.
默认的存储位置是
/var/crash/$date_time/vmcore
可以使用 crash的命令进行解析, 需要注意的是需要使用 debug版本的vmlinux进行相关动作.
环境准备
需要安装几个必备的软件:
yum install crash kexec-tools -y
开启kdump的服务
systemctl enable kdump && systemctl start kdump
注意需要下载一个对应内核的 debug 的rpm包. 麒麟的下载地址为:
https://update.cs2c.com.cn/NS/V10/V10SP3/os/adv/lic/updates/x86_64/debug/
注意注意 麒麟的SP1以及SP2和SP3的位置其实都不一样.
uname -a 获取内核信息进行下载就可以了.
注意 银河麒麟的debug 的kernel的位置为:
/usr/lib/debug/usr/lib/modules/
需要说明. 如果内核升级了,需要重新下载新的debug kernel.不然无法解析.
触发宕机
# 注意千万不要用于生产, 会直接导致宕机.
echo 1 > /proc/sys/kernel/sysrq
echo c > /proc/sysrq-trigger
# 重要事情说三遍, 不要用于生产
# 重要事情说三遍, 不要用于生产
使用命令进行分析
crash /usr/lib/debug/usr/lib/modules/xxxx/vmlinux /var/crash/xxxx/vmcore
执行 bt 命令 可以查看堆栈信息
据说bt 命令的含义是 back trace -=
13723.534444] sysrq: Trigger a crash
[13723.534461] BUG: unable to handle kernel NULL pointer dereference at 0000000000000000
[13723.534463] PGD 0 P4D 0
[13723.534469] Oops: 0002 [#1] SMP NOPTI
[13723.534473] CPU: 91 PID: 498332 Comm: bash Kdump: loaded Not tainted 4.19.90-52.15.v2207.ky10.x86_64 #1
[13723.534475] Source Version: e17111569035580c1da88ed44f96cbdcf3390e0c
[13723.534477] Hardware name: Inspur CS5280H/CS5280H, BIOS 3.3.48 2022-10-20
[13723.534487] RIP: 0010:sysrq_handle_crash+0x12/0x20
[13723.534489] Code: 5d 41 5e 41 5f e9 fe 99 be ff 48 89 ef e8 76 fb ff ff e9 ae fe ff ff 90 0f 1f 44 00 00 c7 05 c5 2e eb 00 01 00 00 00 0f ae f8 <c6> 04 25 00 00 00 00 01 c3 0f 1f 44 00 00 0f 1f 44 00 00 53 8d 5f
[13723.534491] RSP: 0018:ffffbc5e68717e70 EFLAGS: 00010286
[13723.534493] RAX: ffffffffb4392000 RBX: 0000000000000063 RCX: 0000000000000000
[13723.534494] RDX: 0000000000000000 RSI: ffff95827fcd6968 RDI: 0000000000000063
[13723.534496] RBP: ffffffffb539bf20 R08: 00000000000009a9 R09: 0000000000000007
[13723.534497] R10: 0000000000000000 R11: ffffffffb5ccf6b2 R12: 0000000000000004
[13723.534498] R13: 0000000000000000 R14: 0000556ea72ff410 R15: 0000000000000000
[13723.534500] FS: 00001517cb5c1740(0000) GS:ffff95827fcc0000(0000) knlGS:0000000000000000
[13723.534502] CS: 0010 DS: 0000 ES: 0000 CR0: 0000000080050033
[13723.534503] CR2: 0000000000000000 CR3: 0000004080dd0000 CR4: 00000000003406e0
[13723.534504] Call Trace:
[13723.534511] __handle_sysrq+0x78/0x130
宕机命令解析-1
sysrq 其实是一个组合键, 只要内核不会完全死掉,就会打印出来特定的信息
打开这个功能,运行:
echo 1 > /proc/sys/kernel/sysrq
关闭这个功能:
echo 0 > /proc/sys/kernel/sysrq
如果想让此功能一直生效,在/etc/sysctl.conf里面设置kernel.sysrq的值为1。重新启动以后,此功能将会自动打开。
kernel.sysrq = 1
但是需要注意, 打开这个操作有一个的风险.
宕机命令解析-2
立即重新启动计算机
echo “b” > /proc/sysrq-trigger
立即关闭计算机
echo “o” > /proc/sysrq-trigger
导出内存分配的信息 (可以用/var/log/message 查看)
echo “m” > /proc/sysrq-trigger
导出当前CPU寄存器信息和标志位的信息
echo “p” > /proc/sysrq-trigger
导出线程状态信息
echo “t” > /proc/sysrq-trigger
故意让系统崩溃
echo “c” > /proc/sysrq-trigger
立即重新挂载所有的文件系统
echo “s” > /proc/sysrq-trigger
立即重新挂载所有的文件系统为只读
echo “u” > /proc/sysrq-trigger
crash 命令学习
1. bt
backtrace打印内核栈回溯信息,bt pid 打印指定进程栈信息。
2. log
打印vmcore所在的系统内核dmesg日志信息
3. dis
dis -l (function+offset) 10 反汇编出指令所在代码,10代表打印该指定位置开始的10行信息。
4. mod
mod 查看当时内核加载的所有内核模块信息
5. sym命令
“sym 内存地址”转换指定符号为其虚拟地址,显示系统中对应的符号表信息,并且具体到源代码的那一行
6. ps命令
ps 打印内核崩溃时,正常的进程信息
7. files命令
files pid 打印指定进程所打开的文件信息
8. vm命令
vm pid 打印某指定进程当时虚拟内存基本信息
9. task命令
task 查看当前进程或指定进程task_struct和thread_info的信息
10.kmem命令
查看当时系统内存使用信息
kmem -i //查看内存整体使用情况
kmem -s //查看slab使用情况
kmem [addr] //搜索地址所属的内存结构
11. rd命令
读取内存内容
rd [addr] [len] //查看指定地址,长度为len的内存
rd -S [addr][len] //尝试将地址转换为对应的符号
rd [addr] -e [addr] //查看指定内存区域内容
12. p命令
p命令可以用来打印出表达式或者变量的值