本篇的标题似乎有点复杂,但能比较好的描述本篇要介绍的东西。现网一套oracle rac,使用的rhel系统,现有kernel版本有一个遇到分母为0,内核检测到会抛出异常,并致使系统宕机的bug,解决该问题需要进行kernel升级。而和Mellanox和EMC相关人员对接后,确认InfiniBand驱动和EMC POWerpath都需要相应升级。这里记录下该升级的步骤。
一、powerpath多路径信息备份
升级之前需要,检查原来的power path路径信息并保存到文件、升级之前需要export导出power path配置文件、在升级PP 之前还需要对license 和PP 的配置文件做好备份。具体操作如下:
mkdir emcbak && cd emcbak
powermt display > pp.txt
powermt display dev=all > pp_all.txt
emcpadm export_mappings -x -f ppmap.map
cp /etc/emcp_registration file .
cp /etc/powermt.custom .
cp /etc/powermt_custom.xml .
在备份完成后,最好再做如下的一个检查,确认当前导出的配置文件和现有配置是一致的。
emcpadm check_mappings -x -f ppmap.map
如果是一致的,所有的路径都会提示no change 。
二、升级kernel
先配置好高版本的源,使用如下命令即可,操作比较简单。
# yum -y install kernel*
# yum -y update
执行yum update是顺便升级下的相应的软件。如果条件允许,建议做此操作。升级完成后,检查/boot下的grub.conf文件,确认新的kernel内核为第一引导。
三、升级ib驱动
mellanox官方对应的驱动下载链接为:http://ch.mellanox.com/page/products_dyn?product_family=26&mtag=linux_sw_drivers ,具体如下:
主机重启后,使用新的kernel ,挂载下的mellanox 镜像,挂载并进行安装,安装过程中自动会卸载原来的版本,操作命令如下:
mount -o loop MLNX_OFED_LINUX-3.4-1.0.0.0-rhel6.8-x86_64.iso /mnt/
cd /mnt
./mlnxofedinstall --all
注:如果想要先卸载,也可以直接执行命令perl /mnt/uninstall.sh 。
四、升级powerpath
升级完 ib 驱动后,需要再次重启OS ,并在系统下检查ib 网卡的可用性。确认正常后,开始emc多路径软件的升级(该升级为必须升级,不然会发现多路径启动不成功) 。下载官方给出的升级包EMCPower.LINUX.6.2.0.b051.tar.gz (EMC包无法直接下载,需联系对应的售后才能获取),解压该包后,找到对应版本的rpm包,进行升级。
rpm -Uvh EMCPower.LINUX-6.2.0.00.00-051.RHEL6.x86_64.rpm
上面选择的升级安装,不是先卸载再安装,这样会保证配置都在。升级完后会有如下提示:
在启动多路径服务之前,确认配置一致:
emcpadm check_mappings -x -f ppmap.map //检查配置确认是否一致
emcpadm import_mappings -x -f ppmap.map //如果不一致,用备份导入
以上操作完成后,再检查下开机自启动等是否有问题,没有问题,建议再做最后一次重启,以验证后续重启后不会有问题。
五、最后及相关
1、多路径优化
从上面的操作可以发现,主机层面的变动,对应用层面的影响比较大,其中多路径这部分实际上是可以在设计之初规避掉的。如果使用系统自带的多路径软件multipath,就不会存多路径需要升级的问题 。
2、内核bug分析相关
redhat官方对此bug的分析内容如下:
- 系统由于kernel panic 宕机,kernel panic原因是
"divide error: 0000 [#1] SMP "
, 即系统运算过程中,遇到分母为0,内核检测到,抛出异常,致使系统宕机.分析过程:
crash> sys
KERNEL: /cores/retrace/repos/kernel/x86_64/usr/lib/debug/lib/modules/2.6.32-279.el6.x86_64/vmlinux
DUMPFILE: /cores/retrace/tasks/213641603/crash/vmcore [PARTIAL DUMP]
CPUS: 48
DATE: Sat Nov 12 19:51:23 2016
UPTIME: 261 days, 22:52:47
LOAD AVERAGE: 6.18, 5.64, 5.11
TASKS: 3184
NODENAME: irora17
RELEASE: 2.6.32-279.el6.x86_64
VERSION: #1 SMP Wed Jun 13 18:24:36 EDT 2012
MACHINE: x86_64 (2394 Mhz)
MEMORY: 128 GB
PANIC: "divide error: 0000 [#1] SMP "
crash> bt
PID: 3398 TASK: ffff881c340a4ae0 CPU: 26 COMMAND: "oracle"
#0 [ffff881909d3bb70] machine_kexec at ffffffff8103281b
#1 [ffff881909d3bbd0] crash_kexec at ffffffff810ba662
#2 [ffff881909d3bca0] oops_end at ffffffff81501290
#3 [ffff881909d3bcd0] die at ffffffff8100f26b
#4 [ffff881909d3bd00] do_trap at ffffffff81500b84
#5 [ffff881909d3bd60] do_divide_error at ffffffff8100cfff
#6 [ffff881909d3be00] divide_error at ffffffff8100be7b
[exception RIP: thread_group_times+86]
RIP: ffffffff81058226 RSP: ffff881909d3beb8 RFLAGS: 00010046
RAX: 84d6dade97614932 RBX: ffff881c34c10400 RCX: 00000001064e96a3
RDX: 0000000000000000 RSI: ffff881909d3beb8 RDI: 000fa27caa0f3a70
RBP: ffff881909d3bef8 R8: 0000000081a52f26 R9: ffff881c34c10400
R10: 000000131172bd10 R11: 0000000000000202 R12: ffff881909d3bf08
R13: ffff881909d3bf10 R14: 0000000000000000 R15: 00000012f1c81168
ORIG_RAX: ffffffffffffffff CS: 0010 SS: 0018
#7 [ffff881909d3bf00] do_sys_times at ffffffff8108979d
#8 [ffff881909d3bf40] sys_times at ffffffff81089864
#9 [ffff881909d3bf80] system_call_fastpath at ffffffff8100b0f2
RIP: 00000034e1aab3fa RSP: 00007fff6fab93a0 RFLAGS: 00000202
RAX: 0000000000000064 RBX: ffffffff8100b0f2 RCX: 0000000000000001
RDX: 00007fff6fab84c0 RSI: 0000000000000005 RDI: 00007fff6fab84c0
RBP: 00007fff6fab84e0 R8: 00007fff6fab9888 R9: 0000000000000004
R10: 000000131172bd10 R11: 0000000000000202 R12: 00000012b1a4d0d0
R13: 00000012e19eb450 R14: 00007fff6faba000 R15: 00000012b1a4d0d0
ORIG_RAX: 0000000000000064 CS: 0033 SS: 002b
crash> dis -r thread_group_times+86
0xffffffff810581d0 <thread_group_times>: push %rbp
0xffffffff810581d1 <thread_group_times+1>: mov %rsp,%rbp
0xffffffff810581d4 <thread_group_times+4>: sub $0x40,%rsp
0xffffffff810581d8 <thread_group_times+8>: mov %rbx,-0x20(%rbp)
0xffffffff810581dc <thread_group_times+12>: mov %r12,-0x18(%rbp)
0xffffffff810581e0 <thread_group_times+16>: mov %r13,-0x10(%rbp)
0xffffffff810581e4 <thread_group_times+20>: mov %r14,-0x8(%rbp)
0xffffffff810581e8 <thread_group_times+24>: nopl 0x0(%rax,%rax,1)
0xffffffff810581ed <thread_group_times+29>: mov 0x768(%rdi),%rbx
0xffffffff810581f4 <thread_group_times+36>: mov %rsi,%r13
0xffffffff810581f7 <thread_group_times+39>: lea -0x40(%rbp),%rsi
0xffffffff810581fb <thread_group_times+43>: mov %rdx,%r12
0xffffffff810581fe <thread_group_times+46>: callq 0xffffffff81093680 <thread_group_cputime>
0xffffffff81058203 <thread_group_times+51>: mov -0x38(%rbp),%r14
0xffffffff81058207 <thread_group_times+55>: add -0x40(%rbp),%r14
0xffffffff8105820b <thread_group_times+59>: mov -0x30(%rbp),%rdi
0xffffffff8105820f <thread_group_times+63>: callq 0xffffffff81071c80 <nsecs_to_jiffies>
0xffffffff81058214 <thread_group_times+68>: test %r14,%r14
0xffffffff81058217 <thread_group_times+71>: mov %rax,%rcx
0xffffffff8105821a <thread_group_times+74>: je 0xffffffff81058229 <thread_group_times+89>
0xffffffff8105821c <thread_group_times+76>: imul -0x40(%rbp),%rax
0xffffffff81058221 <thread_group_times+81>: mov %r14d,%r14d
0xffffffff81058224 <thread_group_times+84>: xor %edx,%edx
0xffffffff81058226 <thread_group_times+86>: div %r14 <---------- %r14值为0, 此处做除法运算,分母为0,导致的异常.
- 相关kbase:
https://access.redhat.com/solutions/185843
解决方法:
根据kbase描述,您需要升级内核版本至2.6.32-279.11.1.el6.x86_64或更高规避此问题.