PowerPath AIX:應用程式當機並LVM_IO_FAIL,錯誤代碼如 sys/errno.h 22 (EINVAL) 中所定義
Summary: 在具有兩個虛擬 HBA 的 NPIV 組態中,當一個虛擬 HBA 故障時,雖然剩下一個路徑可供 I/O 使用,LVM_IO_FAIL會以 sys/errno.h 中定義的錯誤代碼設為 22 (EINVAL) 登入 errpr。由於這些 LVM 錯誤,使用卷的應用程式崩潰。此問題也可能發生在非 NPIV 環境中。
Symptoms
路徑遺失
環境:
Dell 軟體:適用於 AIX 的 PowerPath (任何版本)
在 PowerPath 管理的多路徑組態中,當一條路徑中斷,儘管有其他路徑可用,應用程式便會中斷。並記錄「ERROR CODE AS DEFINED IN sys/errno.h」設為 22 LVM_IO_FAIL。
使用「summ」解碼後,錯誤會顯示為:
107769 Apr 12 08:57:21 LVDD P LVM_IO_FAIL LV 8000002C00000003 PV 800000250000001A Block 20016620 EINVAL
(所有路徑上的錯誤導致的實際LVM_IO_FAIL通常與 errno 5 (EIO) 相關聯......這裡不是這種情況)
LABEL: LVM_IO_FAIL IDENTIFIER: E86653C3 Date/Time: Sun Apr 12 10:09:28 2020 Sequence Number: 108111 Machine Id: 0XXXXXXXXXXX Node Id: snode1 Class: H Type: PERM WPAR: Global Resource Name: LVDD Resource Class: NONE Resource Type: NONE Location: Description I/O ERROR DETECTED BY LVM Probable Causes POWER, DRIVE, ADAPTER, OR CABLE FAILURE Recommended Actions RUN DIAGNOSTICS AGAINST THE FAILING DEVICE Detail Data PHYSICAL VOLUME DEVICE MAJOR/MINOR 8000 0025 0000 0029 ERROR CODE AS DEFINED IN sys/errno.h 22 BLOCK NUMBER 392149792 LOGICAL VOLUME DEVICE MAJOR/MINOR 8000 002D 0000 0001 PHYSICAL BUFFER TRANSACTION TIME 0 RESIDUAL COUNT 1048576 NUMBER OF BLOCKS 1048576 I/O TYPE USER DATA SENSE DATA 0000 0000 0002 EBF7 00F6 D020 0000 4C00 0000 013D 10F0 F4AD 00F6 D020 3831 80BE 0000 0000 0000 0000
Cause
當上游 (FS/LVM) 的 I/O 緩充未傳輸至磁碟驅動程式時,會產生此錯誤。(此處為 PowerPath - 但問題也可能在 MPIO 環境中出現) hdiskpower)。
用 IBM 術語來說:當 PCM (powerpath) 無法處理來自 LVM 的 I/O 要求時,會回報此 LVM I/O 錯誤 (EINVAL),因為 VG LTG 大小 (LVM I/O 緩衝區) 可能與磁碟max_transfer大小或配接卡max_xfer_size不相符 (此處為 NPIV)。
當邏輯追蹤群組 (LTG) 大於磁碟驅動程式max_transfer大小時,無法處理 I/O,並產生 erno 設為 22 (EINVAL) 的LVM_IO_FAIL
在我們的例子中,我們有(客戶私人數據已被修改):
VOLUME GROUP: vgdata1 VG IDENTIFIER: 00f6d02000004c0000000145a924a9d9 VG STATE: active PP SIZE: 256 megabyte(s) VG PERMISSION: read/write TOTAL PPs: 36387 (9315072 megabytes) MAX LVs: 512 FREE PPs: 746 (190976 megabytes) LVs: 3 USED PPs: 35641 (9124096 megabytes) OPEN LVs: 3 QUORUM: 7 (Enabled) TOTAL PVs: 13 VG DESCRIPTORS: 13 STALE PVs: 0 STALE PPs: 0 ACTIVE PVs: 13 AUTO ON: yes MAX PPs per VG: 127000 MAX PPs per PV: 5080 MAX PVs: 25 LTG size (Dynamic): 1024 kilobyte(s) AUTO SYNC: no HOT SPARE: no BB POLICY: relocatable PV RESTRICTION: none INFINITE RETRY: no DISK BLOCK SIZE: 512 CRITICAL VG: no FS SYNC OPTION: no CRITICAL PVs: no
和
# lsattr -El hdisk25 PR_key_value none Persistant Reserve Key Value True clr_q yes Device CLEARS its Queue on error True location Location Label True+ lun_id 0x0 Logical Unit Number ID False lun_reset_spt yes FC Forced Open LUN True max_coalesce 0x100000 Maximum Coalesce Size True max_retries 5 Maximum Number of Retries True max_transfer 0x40000 Maximum TRANSFER Size True node_name 0x5000144041111111 FC Node Name False pvid none Physical volume identifier False q_err no Use QERR bit True q_type simple Queue TYPE True queue_depth 32 Queue DEPTH True+ reassign_to 120 REASSIGN time out value True reserve_policy no_reserve Reserve Policy True reset_delay 0 Reset Delay True rw_timeout 30 READ/WRITE time out value True scsi_id 0x72ff40 SCSI ID False start_timeout 60 START UNIT time out value True ww_name 0xc001448111111111 FC World Wide Name False
這裡我們看到 max_transfer = 0x40000 (256 kB) < LTG (1024 kB) (0x100000) .. 造成此問題。
在配置中,一些hdisks將“max_transfer”設置為0x100000,而其他hdisk設置為0x40000(可能使用不同的ODM版本生成)。如果所有路徑都可用,則每個 hdiskpower 中始終有一個 hdisks max_transfer設為 0x100000,即可完成 I/O。但是當這個hdisk不再可用時,只能訪問max_transfer設置為0x40000的磁碟...導致問題。
Resolution
若要解決此問題,必須將 hdisk 的「max_transfer」屬性設定為大於或等於 LTG 大小的值。在我們的案例中,LTG = 1024 kB,執行下列命令以解決問題:
# for i in `lsdev -Cc disk |grep -i hdiskp |awk '{print $1}'`
do
chdev -l $i -a max_transfer=0x100000 -P
done
# for i in `lsdev -Cc disk |grep -i EMC |awk '{print $1}'`
do
chdev -l $i -a max_transfer=0x100000 -P
done
# reboot
Additional Information
此 KB 不適用於 errno 設為 5 (EIO) 的LVM_IO_FAIL