iostat 图

iostat 图

建立一个实验室集群,通过 10G 光纤连接接收数据的写入速度为 10%本地写入速度。

测试传输速度两个相同的机器;iperf3显示出良好的内存到内存速度9.43Gbits/秒. 磁盘(读取)到内存的传输速度为(9.35Gbit/秒):

test@rbox1:~$ iperf3 -s -B 10.0.0.21

test@rbox3:~$ iperf3 -c 10.0.0.21 -F /mnt/k8s/test.3g 
Connecting to host 10.0.0.21, port 5201
        Sent 9.00 GByte / 9.00 GByte (100%) of /mnt/k8s/test.3g
[  5]   0.00-8.26   sec  9.00 GBytes  9.35 Gbits/sec

但发送超过 10G 的数据写入磁盘在另一台机器上速度要慢一个数量级:

test@rbox1:~$ iperf3 -s 10.0.0.21 -F /tmp/foo -B 10.0.0.21

test@rbox3:~$ iperf3 -c 10.0.0.21
Connecting to host 10.0.0.21, port 5201
[  5] local 10.0.0.23 port 39970 connected to 10.0.0.21 port 5201
[ ID] Interval           Transfer     Bitrate         Retr  Cwnd
[  5]   0.00-1.00   sec   103 MBytes   864 Mbits/sec    0    428 KBytes       
[  5]   1.00-2.00   sec   100 MBytes   842 Mbits/sec    0    428 KBytes       
[  5]   2.00-3.00   sec  98.6 MBytes   827 Mbits/sec    0    428 KBytes       
[  5]   3.00-4.00   sec  99.3 MBytes   833 Mbits/sec    0    428 KBytes       
[  5]   4.00-5.00   sec  91.5 MBytes   768 Mbits/sec    0    428 KBytes       
[  5]   5.00-6.00   sec  94.4 MBytes   792 Mbits/sec    0    428 KBytes       
[  5]   6.00-7.00   sec  98.1 MBytes   823 Mbits/sec    0    428 KBytes       
[  5]   7.00-8.00   sec  91.2 MBytes   765 Mbits/sec    0    428 KBytes       
[  5]   8.00-9.00   sec  91.0 MBytes   764 Mbits/sec    0    428 KBytes       
[  5]   9.00-10.00  sec  91.5 MBytes   767 Mbits/sec    0    428 KBytes       
- - - - - - - - - - - - - - - - - - - - - - - - -
[ ID] Interval           Transfer     Bitrate         Retr
[  5]   0.00-10.00  sec   959 MBytes   804 Mbits/sec    0             sender
        Sent  959 MByte / 9.00 GByte (10%) of /mnt/k8s/test.3g
[  5]   0.00-10.00  sec   953 MBytes   799 Mbits/sec                  receiver

NVME 驱动器能够写入本地速度快得多(详细信息ddfio测量值如下) - 对于单个流程和4K/8K/10米块:fio随机写入速度330/500/1300兆字节/秒

我正在尝试实现接近 NVME 驱动器的实际本地写入速度的写入速度(所以是的,很好地阐明了这个假设——我希望能够达到通过网络写入单个 NVME 驱动器的非常相似的速度;但我甚至无法达到它的 20%)。

此时,我完全不知所措,不知道除了尝试不同的内核/操作系统之外还能尝试什么——任何指示、更正和帮助都将不胜感激。


这里有一些测量/信息/结果:

我到目前为止尝试过的:

  • 在两台机器上都安装了巨型帧(MTU 9000),并验证它们可以正常工作ping -mping -M do -s 8972

  • 消除了网络交换机的干扰,我通过 2m Dumplex OM3 多模光纤电缆直接连接了两台机器(所有机器上的电缆和收发器都相同),并将 iperf3 服务器/客户端绑定到这些接口。结果是一样的(慢)。

  • 在测试期间断开所有其他以太网/光纤电缆(以消除路由问题) - 没有变化。

  • 更新了主板和光纤网卡的固件(同样,没有变化)。我还没有更新 NVME 固件 - 似乎已经是最新的了。

  • 甚至尝试将 10G 卡从 PCIE 插槽 1 移动到下一个可用插槽;想知道 NVME 和 10G NIC 是否共享并最大化物理集线器通道带宽(同样,没有可测量的变化)。

发现了一些“有趣”的行为:

  1. 增加并行客户端的数量会增加带宽利用率;当有 1 个客户端时,目标机器的写入速度为 900Mbits/sec;当有 4 个客户端时,写入速度为 1.26 Gbits/sec(超过 4 个并行客户端会产生不利影响)
  2. 在配备 AMD Ryzen 5 3600X 和 64G RAM(相同的 NVME 驱动器 + 10G NIC)的更强大的机器上测试写入 - 1 个客户端可以达到 1.53Gbit/秒,4 个客户端 2.15Gbit/秒(8 个客户端 2.13Gbit/秒)。在这种情况下,流量通过 Mikrotik CS309 交换机,MTU 为 1500;更强大的机器似乎接收/写入速度更快
  3. 测试期间没有明显的负载——这适用于小型和大型机器;2 个核心的负载可能是 26%

编辑06/07:

按照@shodanshok 的评论,通过 NFS 安装远程机器;结果如下:

nfs exports: /mnt/nfs *(rw,no_subtree_check,async,insecure,no_root_squash,fsid=0)

cat /etc/mtab | grep nfs 10.0.0.21:/mnt/nfs /mnt/nfs1 nfs rw,relatime,vers=3,rsize=1048576,wsize=1048576,namlen=255,hard,proto=tcp,timeo=600,retrans=2,sec=sys,mountaddr=10.0.0.21,mountvers=3,mountport=52335,mountproto=udp,local_lock=none,addr=10.0.0.21 0 0

fio --name=random-write --ioengine=libaio --rw=randwrite --bs=$SIZE --numjobs=1 --iodepth=1 --runtime=30 --end_fsync=1 --size=3g dd if=/dev/zero of=/mnt/nfs1/test bs=$SIZE count=$(3*1024/$SIZE)

            | fio (bs=4k)    | fio (bs=8k)    | fio (bs=1M)   | dd (bs=4k)    | dd (bs=1M)
nfs (udp)   |  153           |    210        |   984            |   907        |962
nfs (tcp)   |    157          |    205        |    947           |   946        |916

所有这些测量都是兆字节/秒我很满意 1M 块非常接近 10G 连接的理论速度限制。

这看起来iperf3 -F ...不是测试网络写入速度的方法;但我会尝试让iperf3开发人员也接受它。


设置细节:

每台机器都配有 AMD Ryzen 3 3200G 和 8GB RAM、MPG X570 GAMING PLUS (MS-7C37) 主板。靠近 CPU 的 M.2 插槽中有 1 个 1TB NVME 驱动器(消费级 WD Blue SN550 NVMe SSD WDS100T2B0C)。PCIe 插槽中有一张 SolarFlare S7120 10G 光纤卡。

NVME 磁盘信息:

test@rbox1:~$ sudo nvme list
Node             SN                   Model                                    Namespace Usage                      Format           FW Rev  
---------------- -------------------- ---------------------------------------- --------- -------------------------- ---------------- --------
/dev/nvme0n1     21062Y803544         WDC WDS100T2B0C-00PXH0                   1           1.00  TB /   1.00  TB    512   B +  0 B   211210WD

NVME磁盘写入速度(4k/8k/10M)

test@rbox1:~$ dd if=/dev/zero of=/tmp/temp.bin bs=4k count=1000
1000+0 records in
1000+0 records out
4096000 bytes (4.1 MB, 3.9 MiB) copied, 0.00599554 s, 683 MB/s


test@rbox1:~$ dd if=/dev/zero of=/tmp/temp.bin bs=8k count=1000
1000+0 records in
1000+0 records out
8192000 bytes (8.2 MB, 7.8 MiB) copied, 0.00616639 s, 1.3 GB/s


test@rbox1:~$ dd if=/dev/zero of=/tmp/temp.bin bs=10M count=1000
1000+0 records in
1000+0 records out
10485760000 bytes (10 GB, 9.8 GiB) copied, 7.00594 s, 1.5 GB/s

使用 fio-3.16 测试随机写入速度:

test@rbox1:~$ fio --name=random-write --ioengine=posixaio --rw=randwrite --bs=4k --numjobs=1 --iodepth=1 --runtime=30 --time_based --end_fsync=1
random-write: (g=0): rw=randwrite, bs=(R) 4096B-4096B, (W) 4096B-4096B, (T) 4096B-4096B, ioengine=posixaio, iodepth=1

Run status group 0 (all jobs):
  WRITE: bw=313MiB/s (328MB/s), 313MiB/s-313MiB/s (328MB/s-328MB/s), io=9447MiB (9906MB), run=30174-30174msec

Disk stats (read/write):
    dm-0: ios=2/969519, merge=0/0, ticks=0/797424, in_queue=797424, util=21.42%, aggrios=2/973290, aggrmerge=0/557, aggrticks=0/803892, aggrin_queue=803987, aggrutil=21.54%
  nvme0n1: ios=2/973290, merge=0/557, ticks=0/803892, in_queue=803987, util=21.54%



test@rbox1:~$ fio --name=random-write --ioengine=posixaio --rw=randwrite --bs=8k --numjobs=1 --iodepth=1 --runtime=30 --time_based --end_fsync=1
random-write: (g=0): rw=randwrite, bs=(R) 8192B-8192B, (W) 8192B-8192B, (T) 8192B-8192B, ioengine=posixaio, iodepth=1

Run status group 0 (all jobs):
  WRITE: bw=491MiB/s (515MB/s), 491MiB/s-491MiB/s (515MB/s-515MB/s), io=14.5GiB (15.6GB), run=30213-30213msec

Disk stats (read/write):
    dm-0: ios=1/662888, merge=0/0, ticks=0/1523644, in_queue=1523644, util=29.93%, aggrios=1/669483, aggrmerge=0/600, aggrticks=0/1556439, aggrin_queue=1556482, aggrutil=30.10%
  nvme0n1: ios=1/669483, merge=0/600, ticks=0/1556439, in_queue=1556482, util=30.10%



test@rbox1:~$ fio --name=random-write --ioengine=posixaio --rw=randwrite --bs=10m --numjobs=1 --iodepth=1 --runtime=30 --time_based --end_fsync=1
random-write: (g=0): rw=randwrite, bs=(R) 10.0MiB-10.0MiB, (W) 10.0MiB-10.0MiB, (T) 10.0MiB-10.0MiB, ioengine=posixaio, iodepth=1

Run status group 0 (all jobs):
  WRITE: bw=1250MiB/s (1310MB/s), 1250MiB/s-1250MiB/s (1310MB/s-1310MB/s), io=36.9GiB (39.6GB), run=30207-30207msec

Disk stats (read/write):
    dm-0: ios=9/14503, merge=0/0, ticks=0/540252, in_queue=540252, util=68.96%, aggrios=9/81551, aggrmerge=0/610, aggrticks=5/3420226, aggrin_queue=3420279, aggrutil=69.16%
  nvme0n1: ios=9/81551, merge=0/610, ticks=5/3420226, in_queue=3420279, util=69.16%

核心:

test@rbox1:~$ uname -a
Linux rbox1 5.8.0-55-generic #62-Ubuntu SMP Tue Jun 1 08:21:18 UTC 2021 x86_64 x86_64 x86_64 GNU/Linux

光纤网卡:

test@rbox1:~$ sudo sfupdate 
Solarflare firmware update utility [v8.2.2]
Copyright 2002-2020 Xilinx, Inc. 
Loading firmware images from /usr/share/sfutils/sfupdate_images

enp35s0f0np0 - MAC: 00-0F-53-3B-7D-D0
    Firmware version:   v8.0.1
    Controller type:    Solarflare SFC9100 family
    Controller version: v6.2.7.1001
    Boot ROM version:   v5.2.2.1006

The Boot ROM firmware is up to date
The controller firmware is up to date

光纤网卡的初始化和MTU设置:

test@rbox1:~$ sudo dmesg | grep sf
[    0.210521] ACPI: 10 ACPI AML tables successfully acquired and loaded
[    1.822946] sfc 0000:23:00.0 (unnamed net_device) (uninitialized): Solarflare NIC detected
[    1.824954] sfc 0000:23:00.0 (unnamed net_device) (uninitialized): Part Number : SFN7x22F
[    1.825434] sfc 0000:23:00.0 (unnamed net_device) (uninitialized): no PTP support
[    1.958282] sfc 0000:23:00.1 (unnamed net_device) (uninitialized): Solarflare NIC detected
[    2.015966] sfc 0000:23:00.1 (unnamed net_device) (uninitialized): Part Number : SFN7x22F
[    2.031379] sfc 0000:23:00.1 (unnamed net_device) (uninitialized): no PTP support
[    2.112729] sfc 0000:23:00.0 enp35s0f0np0: renamed from eth0
[    2.220517] sfc 0000:23:00.1 enp35s0f1np1: renamed from eth1
[    3.494367] [drm] VCN decode and encode initialized successfully(under DPG Mode).
[ 1748.247082] sfc 0000:23:00.0 enp35s0f0np0: link up at 10000Mbps full-duplex (MTU 1500)
[ 1809.625958] sfc 0000:23:00.1 enp35s0f1np1: link up at 10000Mbps full-duplex (MTU 9000)

主板编号:

# dmidecode 3.2
Getting SMBIOS data from sysfs.
SMBIOS 2.8 present.

Handle 0x0001, DMI type 1, 27 bytes
System Information
    Manufacturer: Micro-Star International Co., Ltd.
    Product Name: MS-7C37
    Version: 2.0

附加硬件信息(主要列出物理连接 - 桥接)

test@rbox1:~$ hwinfo --short
cpu:                                                            
                       AMD Ryzen 3 3200G with Radeon Vega Graphics, 1500 MHz
                       AMD Ryzen 3 3200G with Radeon Vega Graphics, 1775 MHz
                       AMD Ryzen 3 3200G with Radeon Vega Graphics, 1266 MHz
                       AMD Ryzen 3 3200G with Radeon Vega Graphics, 2505 MHz
storage:
                       ASMedia ASM1062 Serial ATA Controller
                       Sandisk Non-Volatile memory controller
                       AMD FCH SATA Controller [AHCI mode]
                       AMD FCH SATA Controller [AHCI mode]
network:
  enp35s0f1np1         Solarflare SFN7x22F-R3 Flareon Ultra 7000 Series 10G Adapter
  enp35s0f0np0         Solarflare SFN7x22F-R3 Flareon Ultra 7000 Series 10G Adapter
  enp39s0              Realtek RTL8111/8168/8411 PCI Express Gigabit Ethernet Controller
network interface:
  br-0d1e233aeb68      Ethernet network interface
  docker0              Ethernet network interface
  vxlan.calico         Ethernet network interface
  veth0ef4ac4          Ethernet network interface
  enp35s0f0np0         Ethernet network interface
  enp35s0f1np1         Ethernet network interface
  lo                   Loopback network interface
  enp39s0              Ethernet network interface
disk:
  /dev/nvme0n1         Sandisk Disk
  /dev/sda             WDC WD5000AAKS-4
partition:
  /dev/nvme0n1p1       Partition
  /dev/nvme0n1p2       Partition
  /dev/nvme0n1p3       Partition
  /dev/sda1            Partition
bridge:
                       AMD Matisse Switch Upstream
                       AMD Family 17h (Models 00h-1fh) PCIe Dummy Host Bridge
                       AMD Raven/Raven2 Device 24: Function 3
                       AMD Raven/Raven2 PCIe GPP Bridge [6:0]
                       AMD Matisse PCIe GPP Bridge
                       AMD Raven/Raven2 Device 24: Function 1
                       AMD Family 17h (Models 00h-1fh) PCIe Dummy Host Bridge
                       AMD FCH LPC Bridge
                       AMD Matisse PCIe GPP Bridge
                       AMD Matisse PCIe GPP Bridge
                       AMD Raven/Raven2 Device 24: Function 6
                       AMD Matisse PCIe GPP Bridge
                       AMD Raven/Raven2 Root Complex
                       AMD Raven/Raven2 Internal PCIe GPP Bridge 0 to Bus A
                       AMD Raven/Raven2 Device 24: Function 4
                       AMD Matisse PCIe GPP Bridge
                       AMD Raven/Raven2 Device 24: Function 2
                       AMD Matisse PCIe GPP Bridge
                       AMD Raven/Raven2 Device 24: Function 0
                       AMD Raven/Raven2 Device 24: Function 7
                       AMD Raven/Raven2 PCIe GPP Bridge [6:0]
                       AMD Raven/Raven2 Device 24: Function 5

答案1

这个答案是受到@shodanshok 的评论启发的,他评论了(所以我不能赞同他的贡献 - 而是发布答案)

编辑 2021/06/09-iperf3开发人员发现了一个可能的问题;软件包的较新版本可能有不同的行为,YMMV。请参阅:https://github.com/esnet/iperf/issues/1159

最初,我用它iperf3 -F ....来测量网络写入速度(以验证 10G 光纤连接)。然而,它产生的结果比通过 NFS 写入数据(使用fio基准测试生成)慢得多。

这非常令人困惑,因为rsync速度远远低于这个数字100MB/s,即使考虑到解密/加密,在 10G 光纤上也不应该这么慢。所以我一直在错误的方向挖掘。

下面的测量结果显示,具有 NVME(单)磁盘的 10G 网络能够超过 900MB/s,并且有备用 CPU 容量。

在我的设置中,我使用逻辑卷(LVM),奇怪的是 LVM 统计信息与分区不一致NVME;这是系统上唯一的分区 - 因此,看看如果没有 LVM 会发生什么情况会很有趣。

nfs 导出: /mnt/nfs *(rw,no_subtree_check,async,insecure,no_root_squash,fsid=0)

cat /etc/mtab | grep nfs

10.0.0.21:/mnt/nfs /mnt/nfs1 nfs rw,relatime,vers=3,rsize=1048576,wsize=1048576,namlen=255,hard,proto=tcp,timeo=600,retrans=2,sec=sys,mountaddr=10.0.0.21,mountvers=3,mountport=52335,mountproto=udp,local_lock=none,addr=10.0.0.21 0 0

命令用于产生以下测量结果:

`fio --name=random-write --ioengine=libaio --rw=randwrite --bs=$SIZE --numjobs=1 --iodepth=1 --runtime=30 --end_fsync=1 --size=3g`

`dd if=/dev/zero of=/mnt/nfs1/test bs=$SIZE count=$(3*1024/$SIZE)`


|            | fio (bs=4k)    | fio (bs=8k)    | fio (bs=1M)   | dd (bs=4k)    | dd (bs=1M) |
|------------|----------------|----------------|---------------|---------------|------------|
|nfs (udp)   |  153           |    210         |    984        |    907        |    962     |
|nfs (tcp)   |  157           |    205         |    947        |    946        |    916     |

iostat 图

从:

`fio --name=random-write --ioengine=libaio --rw=randwrite --bs=1m --numjobs=1 --iodepth=1 --runtime=30 --end_fsync=1 --size=20g`

本地写入速度 NFS 写入速度(10G光纤)
中央处理器 中央处理器
nvme nvme
lvm lvm

答案2

使用我的 2 台通过 10Gbit 以太网连接的服务器,您的测试方式表明,使用 iperf3 时,我使用的 NVMe 驱动器比我预期的要慢。我认为您可能会在 iostat 或 atop 中看到磁盘实际上处于 100% 繁忙状态。

跑步:

dd if=/dev/urandom of=/home/randomfile bs=1M count=10240
iperf3 -s -F /home/randomfile

# in a different session:
iostat -x 1

iperf3 服务器端显示磁盘:

Device  %util
dm-0    0.00
dm-1    100.00
md0     0.00
nvme0n1 100.00
nvme1n1 100.00

和 iperf:

[ ID] Interval           Transfer     Bitrate
        Sent 4.04 GByte / 4.04 GByte (100%) of /home/randomfile
[  5]   0.00-10.00  sec  4.04 GBytes  3.47 Gbits/sec                  receiver

运行撤销使用 -R 标志(读取而不是写入文件)

iperf3 -c server1 -R

iperf3服务器端的磁盘:

Device  %util
dm-0    0.00
dm-1    0.00
md0     0.00
nvme0n1 0.40
nvme1n1 0.40

和 iperf:

[ ID] Interval           Transfer     Bitrate         Retr
[  5]   0.00-10.00  sec  10.9 GBytes  9.39 Gbits/sec   56             sender
[  5]   0.00-10.00  sec  10.9 GBytes  9.38 Gbits/sec                  receiver

反向重试 iperf。这可能与网络无关。

添加:

当将文件移动到 ramdisk 时,您可以看到网络功能正常:

mount -t ramfs -o size=11G ramfs /mnt
mv /home/randomfile /mnt/
iperf3 -s -F /mnt/randomfile
iperf3 -c server1
[ ID] Interval           Transfer     Bitrate         Retr
[  5]   0.00-2.51   sec  2.74 GBytes  9.39 Gbits/sec   35             sender
[  5]   0.00-2.51   sec  0.00 Bytes  0.00 bits/sec                  receiver

iperf3 -c server1 -R
[ ID] Interval           Transfer     Bitrate
[  5]   0.00-1.59   sec  0.00 Bytes  0.00 bits/sec                  sender
[  5]   0.00-1.59   sec  1.73 GBytes  9.38 Gbits/sec                  receiver

答案3

所以,我遇到了类似的情况。不同之处在于:我使用 fio 来测量系统速度。

fio --randrepeat=1 --ioengine=libaio --direct=1 --gtod_reduce=1 --name=test --filename=test.fio --bs=4k --iodepth=64 --size=4G --readwrite=randrw --rwmixread=75

这是我使用的命令。我的 nvme 驱动器通过 nvmet-tcp 连接到客户端计算机上。客户端和服务器连接到 10Gbps 网络,RAM 到 RAM 的速度为 10 Gigs。

但服务器上的 NVME 驱动器读取速度可达到每秒 6 Gigabits。我无法在客户端上获得超过 1 Gbps 的速度。

因此,在阅读了您的原始问题后,我尝试了相同的命令,但添加了--numjobs参数,以指定运行此程序的线程数。

fio --randrepeat=1 --ioengine=libaio --direct=1 --gtod_reduce=1 --name=test --filename=test.fio --bs=4k --iodepth=64 --size=4G --readwrite=randrw --rwmixread=75 --numjobs=8

通过这种设置,我能够毫无问题地达到 6Gbps。

当我查看 I/O 期间的处理器使用情况时,发现存在一些瓶颈。可能是网卡和处理器之间,但其中一个核心会加载到 100%,而其余核心则处于空闲状态。如果有 8 个并发流,我会加载 8 个核心(在服务器端),这将为我带来 6Gbps。

相关内容