我正在尝试对全 NVMe ZFS 磁盘阵列进行基准测试。我熟悉极快的基准测试结果,由于高效的 ZFS 缓存,磁盘活动非常少。我遇到了相反的情况:大量的 ZFS 磁盘活动,但 FIO 仅显示很少的带宽。我该如何解释这种行为?
Zpool iostat -v 1
仅显示一秒,但每秒输出一致:16 至 20 GiB/s 写入带宽
capacity operations bandwidth
pool alloc free read write read write
------------ ----- ----- ----- ----- ----- -----
my_pool-10 1.92T 19.0T 2 155K 95.7K 16.9G
mirror-0 329G 3.16T 0 26.2K 3.99K 2.84G
nvme2n1 - - 0 13.2K 0 1.42G
nvme3n1 - - 0 13.1K 3.99K 1.42G
mirror-1 328G 3.16T 0 26.0K 0 2.83G
nvme4n1 - - 0 13.0K 0 1.41G
nvme5n1 - …
Run Code Online (Sandbox Code Playgroud) 我有很多 NVMe 磁盘的服务器。我正在fio
使用以下方法测试磁盘性能:
fio --name=asdf --rw=randwrite --direct=1 --ioengine=libaio --bs=16k --numjobs=8 --size=10G --runtime=60 --group_reporting
对于单个磁盘,LUKS 对性能影响不大。
我尝试mdadm
在raid10
+ 一个 XFS 文件系统中使用6 个磁盘。它表现良好。
但是当我在 mdadm 设备上创建一个 LUKS 容器时,我得到了糟糕的性能:
回顾一下:
mdadm
RAID10 + XFS = 正常性能的 116%,即与单盘 + XFS 相比,写入吞吐量和 IOPS提高16%mdadm
RAID10 + LUKS + XFS = 正常性能的 33%,即与单盘 + XFS 相比,写入吞吐量和 IOPS差67%在所有其他场景中,我没有观察到 LUKS 和非 LUKS 之间的这种性能差异。这包括 LVM 跨越、条带化和镜像。换句话说,mdadm
具有 6 个磁盘的 RAID10(我理解这是跨越 3 个 2 磁盘镜像)、一个 …
我被要求fio
为这个测试数据集提供基准测试结果:1048576x1MiB。因此,整体大小为1TiB。该集合包含2^20 个 1MiB文件。服务器运行CentOS Linux release 7.8.2003 (Core)
。它有足够的内存:
[root@tbn-6 src]# free -g
total used free shared buff/cache available
Mem: 376 8 365 0 2 365
Swap: 3 2 1
Run Code Online (Sandbox Code Playgroud)
它实际上不是物理服务器。相反,它是一个具有以下 CPU 的 Docker 容器:
Architecture: x86_64
CPU op-mode(s): 32-bit, 64-bit
Byte Order: Little Endian
CPU(s): 48
On-line CPU(s) list: 0-47
Thread(s) per core: 2
Core(s) per socket: 12
Socket(s): 2
NUMA node(s): 2
Vendor ID: GenuineIntel
CPU family: 6
Model: 85 …
Run Code Online (Sandbox Code Playgroud) 我在 SSD 中复制了一个 10GB 的文件,使用 fio 命令进行基准测试,其读取带宽约为 3.3GB/s。这是参考: https: //cloud.google.com/compute/docs/disks/benchmarking-pd-performance
我使用“sync; echo 3 > /proc/sys/vm/drop_caches”清除了缓存。之后,我尝试每次使用系统调用 open() 和 read() 以 3MB 的小块读取文件。如果我打开没有 O_DIRECT 和 O_SYNC 的文件,它会给我大约 1.2GB/s 的带宽。但是,如果我使用 O_DIRECT 和 O_SYNC,它会提供大约 3GB/s 的带宽。即使 O_DIRECT 也没有真正使用页面缓存,两次都会清除缓存。
我的问题是为什么 O_DIRECT 提供正常的 IO 带宽,而没有 O_DIRECT 我无法获得它。由于从 IO 到页面缓存的数据带宽为 3.3GB/s,从页面缓存到用户缓冲区的带宽假设约为 7GB/si。该管道还应提供正常的 3.3GB/s。为什么速度比较慢?
我每次都会读新的 3MB。我没有重用数据,因此缓存并不是很有用。但是管道应该是受IO约束的,为什么不呢?
CPU 为 Intel(R) Xeon(R) Silver 4214 CPU @ 2.20GHz。我不确定 DRAM 的速度。但问题是,如果我多次重新读取相同的 3MB,那么我会获得约 8GB/s 的带宽。我想这应该是 DRAM 带宽。因为linux可以使用所有的空闲RAM作为页面缓存。
我尝试了启用和不启用 O_DIRECT 的 fio 命令并记录了 iostat。
使用这个 fio 命令。“fio --name=read_throughput --directory=$TEST_DIR --numjobs=1 --size=10G --time_based --runtime=30s …
我刚刚安装了两个 Samsung 970 EVO Plus 驱动器,并将最大分区配置为 RAID\xc2\xa010(远 2 布局)。问题是FIO仅报告读取速度为 72\xc2\xa0MB/s。我使用以下命令来构建数组;
\nmdadm --create --verbose --level=10 --metadata=1.2 --chunk=512 --raid-devices=2 --layout=f2 /dev/md/MyRAID10Array /dev/nvme0n1p3 /dev/nvme1n1p3\n
Run Code Online (Sandbox Code Playgroud)\n这应该使我接近引用的读取速度 3500\xc2\xa0MB/s 的两倍。我已使用XFS的默认选项对其进行格式化,
\nmkfs.xfs /dev/md127\n
Run Code Online (Sandbox Code Playgroud)\n磁盘布局如下
\nfdisk -l /dev/nvme0n1\n
Run Code Online (Sandbox Code Playgroud)\n输出:
\nDisk /dev/nvme0n1: 931.51 GiB, 1000204886016 bytes, 1953525168 sectors\nDisk model: Samsung SSD 970 EVO Plus 1TB\nUnits: sectors of 1 * 512 = 512 bytes\nSector size (logical/physical): 512 bytes / 512 bytes\nI/O size (minimum/optimal): 512 bytes / 512 bytes\nDisklabel type: …
Run Code Online (Sandbox Code Playgroud)