光纤多路径失败:结果:hostbyte=DID_ERROR driverbyte=DRIVER_OK

Pra*_*era 7 hardware storage multipath centos6

我正在尝试使用 EMC VMAX3 在后端的同一数据中心的两台服务器之间复制(使用 rsync 的约 7TB 数据)

复制 ~30-40GB 的数据后,多路径开始失败

Dec 15 01:57:53 test.example.com multipathd: 360000970000196801239533037303434: Recovered to normal mode
Dec 15 01:57:53 test.example.com multipathd: 360000970000196801239533037303434: remaining active paths: 1
Dec 15 01:57:53 test.example.com kernel: sd 1:0:2:20: [sdeu]  Result: hostbyte=DID_ERROR driverbyte=DRIVER_OK 

[root@test log]# multipath -ll |grep -i fail
 |- 1:0:0:15 sdq  65:0   failed ready running
  - 3:0:0:15 sdai 66:32  failed ready running
Run Code Online (Sandbox Code Playgroud)

我们使用默认的 multipath.conf

HBA driver version  8.07.00.26.06.8-k

HBA model QLogic Corp. ISP8324-based 16Gb Fibre Channel to PCI Express Adapter

OS: CentOS 64-bit/2.6.32-642.6.2.el6.x86_64
Hardware:Intel/HP ProLiant DL380 Gen9
Run Code Online (Sandbox Code Playgroud)

已经验证了这个解决方案并与 EMC 核对一切看起来都很好https://access.redhat.com/solutions/438403

更多信息

- 网络侧没有丢包/错误包。

  • 文件系统使用 noatime、nodiratime 挂载
  • 文件系统 ext4(已经尝试过 xfs 但同样的错误)
  • LVM 处于条带模式(从线性选项开始,然后转换为条带)
  • 已禁用 THP

  • echo never > /sys/kernel/mm/redhat_transparent_hugepage/enabled

  • 每当多路径启动失败进程进入 D 状态时
  • 系统固件升级
  • 尝试使用最新版本的 qlogic 驱动程序
  • 尝试使用不同的调度程序(noop、deadline、cfq)
  • 尝试使用不同的调整配置文件(企业存储)

发布期间收集的 Vmcore

我可以在问题期间收集 vmcore

  KERNEL: /usr/lib/debug/lib/modules/2.6.32-642.6.2.el6.x86_64/vmlinux
DUMPFILE: vmcore  [PARTIAL DUMP]
    CPUS: 36
    DATE: Fri Dec 16 00:11:26 2016
  UPTIME: 01:48:57
  LOAD AVERAGE: 0.41, 0.49, 0.60
   TASKS: 1238
NODENAME: test.example.com
 RELEASE: 2.6.32-642.6.2.el6.x86_64
 VERSION: #1 SMP Wed Oct 26 06:52:09 UTC 2016
 MACHINE: x86_64  (2297 Mhz)
  MEMORY: 511.9 GB
   PANIC: "BUG: unable to handle kernel NULL pointer dereference at 0000000000000018"
     PID: 15840
 COMMAND: "kjournald"
    TASK: ffff884023446ab0  [THREAD_INFO: ffff88103def4000]
     CPU: 2
   STATE: TASK_RUNNING (PANIC)
Run Code Online (Sandbox Code Playgroud)

在 qlogic sid 上启用调试模式后

qla2xxx [0000:0b:00.0]-3822:5: FCP command status: 0x2-0x0 (0x70000) nexus=5:1:0 portid=1f0160 oxid=0x800 cdb=2a200996238000038000 len=0x70000 rsp_info=0x0 resid=0x0 fw_resid=0x0 sp=ffff882189d42580 cp=ffff88276d249480.
qla2xxx [0000:84:00.0]-3822:7: FCP command status: 0x2-0x0 (0x70000) nexus=7:0:3 portid=450000 oxid=0x4de cdb=2a20098a5b0000010000 len=0x20000 rsp_info=0x0 resid=0x0 fw_resid=0x0 sp=ffff882189d421c0 cp=ffff8880237e0880.
Run Code Online (Sandbox Code Playgroud)

Pra*_*era 1

终于问题解决了

\n\n

错误:技术预览版:可能不完全支持 DIF/DIX 支持。

\n\n

在发布期间我经常在 dmesg 中看到此消息,并继续忽略此消息

\n\n

在进一步调试时,我发现内核处于受污染状态

\n\n
 cat /proc/sys/kernel/tainted **So it\'s a combination of  TAINT_TECH_PREVIEW and TAINT_WARN**\n 536871424\n\n lsmod |egrep -i "dif|dix"\xc2\xa0\n crc_t10dif\xc2\xa0 \xc2\xa0 \xc2\xa0 \xc2\xa0 \xc2\xa0 \xc2\xa0 \xc2\xa0 1209\xc2\xa0 1 sd_mod\n\n modinfo crc_t10dif\n filename: \xc2\xa0 \xc2\xa0 \xc2\xa0 /lib/modules/2.6.32-642.6.2.el6.x86_64/kernel/lib/crc-t10dif.ko\n softdep:\xc2\xa0 \xc2\xa0 \xc2\xa0 \xc2\xa0 pre: crct10dif\n license:\xc2\xa0 \xc2\xa0 \xc2\xa0 \xc2\xa0 GPL\n description:\xc2\xa0 \xc2\xa0 T10 DIF CRC calculation\n srcversion: \xc2\xa0 \xc2\xa0 52BC47DEA6DD58B87A2D9C1\n depends: \xc2\xa0 \xc2\xa0 \xc2\xa0 \xc2\xa0\n vermagic: \xc2\xa0 \xc2\xa0 \xc2\xa0 2.6.32-642.6.2.el6.x86_64 SMP mod_unload modversions\n
Run Code Online (Sandbox Code Playgroud)\n\n

根据红帽

\n\n
\n

DIF 是最近添加到 SCSI 标准中的一项新功能。它将常用的 512 字节磁盘块的大小从 512 字节增加到 520 字节。额外的字节包含数据完整性字段(DIF)。基本思想是 HBA 将在写入时计算数据块的校验和值,并将其存储在 DIF 中。存储设备将在接收时确认校验和,并存储数据和校验和。读取时,存储设备和接收 HBA 将检查校验和。

\n\n

数据完整性扩展 (DIX) 允许此检查在堆栈中向上移动:应用程序计算校验和并将其传递到 HBA,以附加到 512 字节数据块。这提供了完整的端到端数据完整性检查

\n\n

一些供应商采用名称保护信息 (PI) 来指代 DIF/DIX 功能。Linux 上的 DIF/DIX 存在一个困难 - 内存管理系统可能会在数据缓冲区排队等待写入时更改数据缓冲区。如果这样做,则内存管理系统必须记住在 I/O 成功后将该页标记为脏页。如果内存管理系统在计算校验和之后、写入完成之前更改了缓冲区中的数据,则校验和测试将失败,写入将失败,并且文件系统将变为只读,或者会发生一些类似的故障。

\n\n

因此,Red Hat Enterprise Linux 6 用户应注意以下事项: DIF/DIX 硬件校验和功能只能与专门发出 O_DIRECT I/O 的应用程序一起使用。这些应用程序可以在 O_DIRECT 模式下使用原始块设备或 XFS 文件系统。(XFS 是唯一在执行某些分配操作时不会回退到缓冲 IO 的文件系统)。只有设计用于 O_DIRECT I/O 和 DIF/DIX 硬件的应用程序才应启用此功能。

\n\n

DIF/DIX 是 RHEL 6.0 中的技术预览版。目前只有两个驱动程序/hba 组合支持此功能:Emulex lpfc 和\n LSI mpt2sas。只有少数存储供应商支持它:\n Netapp Engenio FC RAID 阵列和某些 Hitachi SAS 磁盘。我们预计未来会有更多存储供应商支持此功能。

\n
\n\n

当我们使用 EMC 时,我们决定禁用此功能,结果成功了

\n\n
   cat /etc/modprobe.d/qla2xxx.conf\n   options qla2xxx ql2xenabledif=0 ql2xenablehba_err_chk=0\n   Back up existing initramfs: \xc2\xa0cp /boot/initramfs-$(uname -r).img /boot/initramfs-$(uname -r).img.bak\n   Rebuild initramfs: \xc2\xa0dracut -f -v\n   Verify that /etc/modprobe.d/qla2xxx.conf is the same as the one in initramfs (time and size should be the same): \xc2\xa0\xc2\xa0\xc2\xa0\xc2\xa0lsinitrd | grep qla2xxx.conf; ls -al /etc/modprobe.d/qla2xxx.conf\n
Run Code Online (Sandbox Code Playgroud)\n