Linux

分配 RAM 塊設備的速度比 Linux 核心正常分配記憶體的速度快

  • February 18, 2021

背景

我正在嘗試以全速 (12.5GB/s) 或接近速度將大約 150GB 下載到具有 100gbps 網路連接的新創建的 Linux 機器 (AWS EC2)。網路端執行良好。然而,我很難在盒子上找到任何地方,我可以把所有數據足夠快地跟上,即使盒子有 192GB 的 RAM。

到目前為止,我最成功的嘗試是使用brd核心模組分配一個足夠大的 RAM 塊設備,然後並行寫入。當塊設備已被完全寫入時,這以所需的速度(使用直接 io)工作,例如使用dd if=/dev/zero ...

不幸的是,當brd新創建設備時,它只接受大約 2GB/s 的寫入速率。

我的猜測是,這是因為brd掛鉤到“正常”核心管理的記憶體,因此當第一次使用每個新塊時,核心必須實際分配它,它的速度不超過 2GB/s。

到目前為止我嘗試過的所有東西都有同樣的問題。看起來,tmpfsramfsbrd和其他所有提供 RAM 儲存的東西都與正常的核心記憶體分配系統掛鉤。

問題

Linux 中是否有任何方法可以在不經過正常核心的記憶體管理的情況下從實際記憶體中創建塊設備?

我在想,也許有一個核心模組會在啟動時分離出大量記憶體,像磁碟一樣對待。該記憶體不會被視為核心的正常記憶體,因此它想要將其用於其他任何事情都沒有問題。

或者,是否有某種方法可以讓核心快速完全初始化brdramdisk(或類似的)?我嘗試單獨寫入磁碟的最後一個塊,但不出所料,這並沒有幫助。

非 RAM 替代品

理論上,NVMe SSD 的 RAID 可以達到所需的寫入速度,儘管似乎可能存在某種瓶頸來阻止如此高的整體 I/O。我嘗試將mdadmRAID 0 與 8 個 NVMe SSD 一起使用沒有成功,我認為部分原因是由於塊大小方面存在困難。要使用直接 io 並繞過核心的記憶體(這似乎是必要的),唯一可以使用的塊大小是 4096,這顯然太小而無法有效利用 SSD 本身。這裡的任何替代方案將不勝感激。

註釋

我知道 2GB/s 聽起來很多,下載很多只需要幾分鐘,但我需要在不到一分鐘的時間內從根本沒有 EC2 實例到載入 150GB 的 EC2 實例。從理論上講,這應該是完全可能的:網路堆棧和物理 RAM 完全能夠以如此快的速度傳輸數據。

謝謝!

在 tmpfs 文件系統上,我可以通過並行執行 64 個作業在 7.8 秒內複製 64 個 1.6 GB 的文件(總共 100 GB)。這非常接近您的 100 Gbit/s。

因此,如果您並行執行它(元程式碼):

curl byte 1G..2G | write_to file.out position 1G..2G 

ẁrite_to可以用mmap.

也許您可以簡單地寫入不同的文件,使用循環設備,並線上性模式下使用 RAID: https ://raid.wiki.kernel.org/index.php/RAID_setup#Linear_mode

如果您控制兩端,則將源設置為 150 個 1 GB 文件,用作循環設備和線性模式下的 RAID。然後您應該並行複制這些並再次設置 RAID 線性。

引用自:https://unix.stackexchange.com/questions/634988