一、问题背景
最近在基于NVMe SSD 盘部署达梦DSC集群时,在创建ASM磁盘阶段出现了如下报错:read error in os_file_read_by_offset:invalid argument。
二、排查思路
因为这个错误不常见,首先怀疑是磁盘问题,因此采用了如下两个方法:
dd磁盘:无果
nvme format格式化磁盘:无果
接下来只能从日志出发:(如下图)
2024-09-29 20:33:53.238 [ERROR] dmasmcmdm P0000051035 T0000000000000051035 os_file_read_by_offset [pread] error! handle: 5, offset: 0, bytes_to_read: [512], bytes_read: -1, buffer:0xfffff7347800, code: 22, desc: Invalid argument
2024-09-29 20:33:53.543 [ERROR] dmasmcmdm P0000051035 T0000000000000051035 os_file_read_by_offset [pread] error! handle: 5, offset: 0, bytes_to_read: [512], bytes_read: -1, buffer:0xfffff7348000, code: 22, desc: Invalid argument
2024-09-29 20:33:53.544 [ERROR] dmasmcmdm P0000051035 T0000000000000051035 The ASMCMD executed: "create dcrvdisk ‘/dev/PROD/dmasm_dcrv1’ ‘DCRV1’
", code: -4601, desc: 读错误
[点击并拖拽以移动]
分析:上述截图一看是调用os_file_read_by_offset接口出了问题,我们查看一下DM8官方手册,看看这个接口涉及那几个参数:
注:我们此次部署的是DMASM镜像版,因此找到对应的ASM接口文档,如下图所示
函数原型:
Copy
ASMRETURN
dmasm_file_read_by_offset(
asmcon_handle conn_in,
asm_fhandle_t fhandle,
udint8 offset,
sdbyte* buffer,
udint4 bytes_to_read,
sdbyte* err_desc,
udint4* err_len
)
功能说明:
从 ASM 文件读取数据。从 ASM 文件 offset 偏移读取 bytes_to_read 大小的内容到缓冲区 buffer,调用者保证缓冲区够用。因为裸设备读写限制,offset, buffer, bytes_to_read 都必须能被 512 整除,否则会报错。
参数说明:
conn_in:输入参数,连接句柄。
fhandle:输入参数,文件句柄。
offset:输入参数,起始偏移。
buffer:输入参数,缓冲区。
bytes_to_read:输入参数,读取数据大小,单位 Byte。
err_desc:输出参数,错误描述信息。
err_len:输入输出参数,错误描述信息长度。
[点击并拖拽以移动]
根据这个接口函数的参数描述,特别是这一句“因为裸设备读写限制,offset, buffer, bytes_to_read 都必须能被 512 整除,否则会报错。”,故我们可以大胆推测无效参数很可能是 bytes_to_read。
根据报错日志显示,此时编译读取的数据大小是 512B,理论上没有错,这时我们从盘的角度出发看看。
进入到服务器层面,使用nvme list命令查看:
[root@PAI-I-02 log]# nvme list
Node SN Model Namespace Usage Format FW Rev
/dev/nvme0n1 ****************** INTEL SSDPF2KX038T1 1 3.84 TB / 3.84 TB 4 KB + 0 B 9CV10410
/dev/nvme1n1 ****************** INTEL SSDPF2KX038T1 1 3.84 TB / 3.84 TB 4 KB + 0 B 9CV10410
/dev/nvme2n1 ****************** INTEL SSDPF2KX038T1 1 3.84 TB / 3.84 TB 4 KB + 0 B 9CV10410
/dev/nvme3n1 ****************** INTEL SSDPF2KX038T1 1 3.84 TB / 3.84 TB 4 KB + 0 B 9CV10410
/dev/nvme4n1 ****************** INTEL SSDPF2KX038T1 1 3.84 TB / 3.84 TB 4 KB + 0 B 9CV10410
/dev/nvme5n1 ****************** INTEL SSDPF2KX038T1 1 3.84 TB / 3.84 TB 4 KB + 0 B 9CV10410
[root@PAI-I-02 log]#
根据结果查询发现,NVMe盘的扇区sector是以4KB为单位的,因此不难理解,ASM的遍历512B数据大小在盘上对不上。
三、问题解决
将NVMe SSD盘的扇区大小转化为512B,命令如下:
nvme format /dev/nvme0n1 -l 0
所有盘全部转化扇区大小后,问题得到解决。
[root@PAI-I-02 log]# nvme list
Node SN Model Namespace Usage Format FW Rev
/dev/nvme0n1 ****************** INTEL SSDPF2KX038T1 1 3.84 TB / 3.84 TB 512 B + 0 B 9CV10410
/dev/nvme1n1 ****************** INTEL SSDPF2KX038T1 1 3.84 TB / 3.84 TB 512 B + 0 B 9CV10410
/dev/nvme2n1 ****************** INTEL SSDPF2KX038T1 1 3.84 TB / 3.84 TB 512 B + 0 B 9CV10410
/dev/nvme3n1 ****************** INTEL SSDPF2KX038T1 1 3.84 TB / 3.84 TB 512 B + 0 B 9CV10410
/dev/nvme4n1 ****************** INTEL SSDPF2KX038T1 1 3.84 TB / 3.84 TB 512 B + 0 B 9CV10410
/dev/nvme5n1 ****************** INTEL SSDPF2KX038T1 1 3.84 TB / 3.84 TB 512 B + 0 B 9CV10410
[点击并拖拽以移动]
文章
阅读量
获赞