环境:
- 操作系统:Oracle Linux 9.5(systemd 252)
- 文件系统:XFS
- 存储:通过 multipathd 的 IBM SAN LUN(ALUA 配置)
- 设备:
/dev/mapper/mpath[a-d]1
- 安装选项:
rw,relatime,seclabel,attr2,inode64,logbufs=8,logbsize=32k,noquota,_netdev
- 系统没有内存压力,CPU 使用率为零(非生产预部署)
问题:像 cp、rsync 甚至直接 dd(使用 iflag=direct 或 oflag=direct)这样的简单文件操作,在 XFS 文件系统之间来回执行时,速度都极其缓慢(低至 2 MB/s),即使复制小文件(例如 50 MB)也是如此。然而,在使用 fio 测试时,我获得了极佳的吞吐量——无论是对已挂载的文件系统还是直接对设备(例如/dev/mapper/mpathc1
) ,读取速度都高达 3 GB/s,写入速度高达 1.8 GB/s。
甚至cat file > /dev/null
显示 3.2 MB/s,而相同文件的 fio 显示 2-3 GB/s。
我尝试过的方法:
- 使用 iflag=direct/oflag=direct 禁用缓存
- 在同步和异步挂载选项之间切换(无影响)
- 测试了 I/O 统计和 cgroups(运行良好)
- 已验证的 ALUA 和多路径优先级(适当平衡,无路径错误)
- 使用 nice、ionice、systemd-run --scope 与 IOWeight、CPUWeight
- 使用 strace 分析,显示正常的复制循环(读/写系统调用)
- 将零设置为
/proc/sys/vm/dirty_ratio
和dirty_background_ratio
- 确保
multipath.conf
配置正确(循环、no_path_retry 等)
值得注意的行为:
- 对设备的所有读/写命令(例如,dd、cat、cp、rsync)都运行得非常慢。
- fio 运行完美——基于文件和基于原始设备的测试。
- 该问题似乎与 SAN 无关或与带宽限制无关。
- I/O 统计数据(iostat、vmstat、iotop)显示这些缓慢操作期间的活动很少。
- 文件系统无损坏——XFS 挂载正常,无任何日志或 dmesg 错误。系统全新。
问题:如何解释 fio 与 cp 或 rsync 等基本文件操作之间的巨大性能差异?
[root@oracle01 ~]# fio --name=read_test --filename=/u01/oradata/edm/testfile --rw=read --bs=64k --size=50M --iodepth=32 --numjobs=4 --time_based --runtime=10s --ioengine=libaio --group_reporting
{...}
Jobs: 4 (f=4): [R(4)][100.0%][r=42.3MiB/s][r=676 IOPS][eta 00m:00s]
[root@oracle01 ~]# fio --name=read_test --filename=/u01/oradata/edm/testfile --rw=read --bs=64k --size=50M --iodepth=32 --numjobs=4 --time_based --runtime=10s --ioengine=libaio --group_reporting --direct=1
{...}
Jobs: 4 (f=4): [R(4)][100.0%][r=3523MiB/s][r=56.4k IOPS][eta 00m:00s]
[root@oracle01 ~]# rsync -ah --progress OracleLinux-R9-U5-x86_64-dvd.iso /u01/oradata/edm/tesst
sending incremental file list
OracleLinux-R9-U5-x86_64-dvd.iso
7.18M 0% 1.56MB/s 2:11:12 ^C