Linux-Networking

10G 網路上的寫入速度非常慢(NVME 驅動器)

  • January 12, 2022

搭建實驗實驗室集群,通過10G光纖連接接收數據的寫入速度為本地寫入速度的10%。

測試兩台相同機器之間的傳輸速度;iperf3顯示良好的記憶體到記憶體速度為9.43Gbits/s。磁碟(讀取)到記憶體的傳輸速度為(9.35Gbit/s):

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 驅動器能夠更快地在本地dd寫入(詳細資訊和fio測量值如下)- 對於單程序和4k/8k/10m塊:fio隨機寫入速度為330/500/1300 MB/s

我正在嘗試實現接近 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/sec,4 個客戶端可以達到 2.15Gbits/sec(8 個客戶端可以達到 2.13Gbit/sec )。本例流量流經 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

所有這些測量結果都是MB/s我很滿意 1M 塊非常接近 10G 連接的理論速度限制。

看起來iperf3 -F ...不是測試網路寫入速度的方法;但我也會嘗試讓iperf3開發人員接受它。


設置詳情:

每台機器都有 AMD Ryzen 3 3200G 和 8GB RAM,MPG X570 GAMING PLUS (MS-7C37) 主機板。1 個 1TB NVME 驅動器(消費級 WD Blue SN550 NVMe SSD WDS100T2B0C),位於最靠近 CPU 的 M.2 插槽中。以及 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

這個答案的靈感來自@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)

貓 /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`

引用自:https://serverfault.com/questions/1065820