本篇的标题似乎有点复杂,但能比较好的描述本篇要介绍的东西。现网一套oracle rac,使用的rhel系统,现有kernel版本有一个遇到分母为0,内核检测到会抛出异常,并致使系统宕机的bug,解决该问题需要进行kernel升级。而和Mellanox和EMC相关人员对接后,确认InfiniBand驱动和EMC POWerpath都需要相应升级。这里记录下该升级的步骤。

一、powerpath多路径信息备份

升级之前需要,检查原来的power path路径信息并保存到文件、升级之前需要export导出power path配置文件、在升级PP 之前还需要对license 和PP 的配置文件做好备份。具体操作如下:

1mkdir emcbak && cd emcbak
2powermt display  > pp.txt
3powermt display  dev=all  > pp_all.txt
4emcpadm export_mappings -x -f ppmap.map
5cp /etc/emcp_registration file .
6cp /etc/powermt.custom  .
7cp /etc/powermt_custom.xml .

在备份完成后,最好再做如下的一个检查,确认当前导出的配置文件和现有配置是一致的

1emcpadm check_mappings -x -f ppmap.map

如果是一致的,所有的路径都会提示no change 。

二、升级kernel

先配置好高版本的源,使用如下命令即可,操作比较简单。

1# yum -y install kernel*
2# 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 ,具体如下:

mellanox-infiniband
mellanox-infiniband

主机重启后,使用新的kernel ,挂载下的mellanox 镜像,挂载并进行安装,安装过程中自动会卸载原来的版本,操作命令如下:

1mount -o loop MLNX_OFED_LINUX-3.4-1.0.0.0-rhel6.8-x86_64.iso /mnt/
2cd /mnt
3./mlnxofedinstall --all

注:如果想要先卸载,也可以直接执行命令perl /mnt/uninstall.sh 。

四、升级powerpath

升级完 ib 驱动后,需要再次重启OS ,并在系统下检查ib 网卡的可用性。确认正常后,开始emc多路径软件的升级(该升级为必须升级,不然会发现多路径启动不成功) 。下载官方给出的升级包EMCPower.LINUX.6.2.0.b051.tar.gz (EMC包无法直接下载,需联系对应的售后才能获取),解压该包后,找到对应版本的rpm包,进行升级。

1rpm -Uvh EMCPower.LINUX-6.2.0.00.00-051.RHEL6.x86_64.rpm

上面选择的升级安装,不是先卸载再安装,这样会保证配置都在。升级完后会有如下提示:

powerpath
powerpath

在启动多路径服务之前,确认配置一致:

1emcpadm check_mappings -x -f ppmap.map   //检查配置确认是否一致
2emcpadm import_mappings -x -f ppmap.map  //如果不一致,用备份导入

以上操作完成后,再检查下开机自启动等是否有问题,没有问题,建议再做最后一次重启,以验证后续重启后不会有问题。

五、最后及相关

1、多路径优化

从上面的操作可以发现,主机层面的变动,对应用层面的影响比较大,其中多路径这部分实际上是可以在设计之初规避掉的。如果使用系统自带的多路径软件multipath,就不会存多路径需要升级的问题 。

2、内核bug分析相关

redhat官方对此bug的分析内容如下:

  1. 系统由于kernel panic 宕机,kernel panic原因是"divide error: 0000 [#1] SMP ", 即系统运算过程中,遇到分母为0,内核检测到,抛出异常,致使系统宕机.分析过程:
 1crash> sys
 2      KERNEL: /cores/retrace/repos/kernel/x86_64/usr/lib/debug/lib/modules/2.6.32-279.el6.x86_64/vmlinux
 3    DUMPFILE: /cores/retrace/tasks/213641603/crash/vmcore  [PARTIAL DUMP]
 4        CPUS: 48
 5        DATE: Sat Nov 12 19:51:23 2016
 6      UPTIME: 261 days, 22:52:47
 7LOAD AVERAGE: 6.18, 5.64, 5.11
 8       TASKS: 3184
 9    NODENAME: irora17
10     RELEASE: 2.6.32-279.el6.x86_64
11     VERSION: #1 SMP Wed Jun 13 18:24:36 EDT 2012
12     MACHINE: x86_64  (2394 Mhz)
13      MEMORY: 128 GB
14       PANIC: "divide error: 0000 [#1] SMP "
15crash> bt
16PID: 3398   TASK: ffff881c340a4ae0  CPU: 26  COMMAND: "oracle"
17#0 [ffff881909d3bb70] machine_kexec at ffffffff8103281b
18#1 [ffff881909d3bbd0] crash_kexec at ffffffff810ba662
19#2 [ffff881909d3bca0] oops_end at ffffffff81501290
20#3 [ffff881909d3bcd0] die at ffffffff8100f26b
21#4 [ffff881909d3bd00] do_trap at ffffffff81500b84
22#5 [ffff881909d3bd60] do_divide_error at ffffffff8100cfff
23#6 [ffff881909d3be00] divide_error at ffffffff8100be7b
24    [exception RIP: thread_group_times+86]
25    RIP: ffffffff81058226  RSP: ffff881909d3beb8  RFLAGS: 00010046
26    RAX: 84d6dade97614932  RBX: ffff881c34c10400  RCX: 00000001064e96a3
27    RDX: 0000000000000000  RSI: ffff881909d3beb8  RDI: 000fa27caa0f3a70
28    RBP: ffff881909d3bef8   R8: 0000000081a52f26   R9: ffff881c34c10400
29    R10: 000000131172bd10  R11: 0000000000000202  R12: ffff881909d3bf08
30    R13: ffff881909d3bf10  R14: 0000000000000000  R15: 00000012f1c81168
31    ORIG_RAX: ffffffffffffffff  CS: 0010  SS: 0018
32#7 [ffff881909d3bf00] do_sys_times at ffffffff8108979d
33#8 [ffff881909d3bf40] sys_times at ffffffff81089864
34#9 [ffff881909d3bf80] system_call_fastpath at ffffffff8100b0f2
35    RIP: 00000034e1aab3fa  RSP: 00007fff6fab93a0  RFLAGS: 00000202
36    RAX: 0000000000000064  RBX: ffffffff8100b0f2  RCX: 0000000000000001
37    RDX: 00007fff6fab84c0  RSI: 0000000000000005  RDI: 00007fff6fab84c0
38    RBP: 00007fff6fab84e0   R8: 00007fff6fab9888   R9: 0000000000000004
39    R10: 000000131172bd10  R11: 0000000000000202  R12: 00000012b1a4d0d0
40    R13: 00000012e19eb450  R14: 00007fff6faba000  R15: 00000012b1a4d0d0
41    ORIG_RAX: 0000000000000064  CS: 0033  SS: 002b
42crash> dis -r thread_group_times+86
430xffffffff810581d0 <thread_group_times>:        push   %rbp
440xffffffff810581d1 <thread_group_times+1>:      mov    %rsp,%rbp
450xffffffff810581d4 <thread_group_times+4>:      sub    $0x40,%rsp
460xffffffff810581d8 <thread_group_times+8>:      mov    %rbx,-0x20(%rbp)
470xffffffff810581dc <thread_group_times+12>:     mov    %r12,-0x18(%rbp)
480xffffffff810581e0 <thread_group_times+16>:     mov    %r13,-0x10(%rbp)
490xffffffff810581e4 <thread_group_times+20>:     mov    %r14,-0x8(%rbp)
500xffffffff810581e8 <thread_group_times+24>:     nopl   0x0(%rax,%rax,1)
510xffffffff810581ed <thread_group_times+29>:     mov    0x768(%rdi),%rbx
520xffffffff810581f4 <thread_group_times+36>:     mov    %rsi,%r13
530xffffffff810581f7 <thread_group_times+39>:     lea    -0x40(%rbp),%rsi
540xffffffff810581fb <thread_group_times+43>:     mov    %rdx,%r12
550xffffffff810581fe <thread_group_times+46>:     callq  0xffffffff81093680 <thread_group_cputime>
560xffffffff81058203 <thread_group_times+51>:     mov    -0x38(%rbp),%r14
570xffffffff81058207 <thread_group_times+55>:     add    -0x40(%rbp),%r14
580xffffffff8105820b <thread_group_times+59>:     mov    -0x30(%rbp),%rdi
590xffffffff8105820f <thread_group_times+63>:     callq  0xffffffff81071c80 <nsecs_to_jiffies>
600xffffffff81058214 <thread_group_times+68>:     test   %r14,%r14
610xffffffff81058217 <thread_group_times+71>:     mov    %rax,%rcx
620xffffffff8105821a <thread_group_times+74>:     je     0xffffffff81058229 <thread_group_times+89>
630xffffffff8105821c <thread_group_times+76>:     imul   -0x40(%rbp),%rax
640xffffffff81058221 <thread_group_times+81>:     mov    %r14d,%r14d
650xffffffff81058224 <thread_group_times+84>:     xor    %edx,%edx
660xffffffff81058226 <thread_group_times+86>:     div    %r14 <---------- %r14值为0, 此处做除法运算,分母为0,导致的异常.
  1. 相关kbase:
    https://access.redhat.com/solutions/185843
    解决方法:
    根据kbase描述,您需要升级内核版本至2.6.32-279.11.1.el6.x86_64或更高规避此问题.