令人驚訝的 Rust’s `sync_all` 高延遲

https://stackoverflow.com/questions/78626405/surprisingly-high-latency-for-rusts-sync-all

Rust 的`sync_all`的延遲驚人地高

目標是探索數據持久性領域,試圖編寫(非常)簡單的網絡服務:

客戶端將一些數據發送到服務器。

服務器將數據寫入磁盤。

服務器對客戶端回覆“ok”。

然後,客戶端收到服務器的“ok”信號後,會刪除本地的數據副本,相信服務器保留了一份。 在我的示例中,數據非常重要,不應該丟失。 根據一篇優秀的文章,我發現了 fsync。 我的最愛是 Rust,所以我選擇用它來實現這個示例。 根據我理解,Rust 中 fsync 的等價物是 sync_all,這就是我要使用的。 在還沒有開始寫我的網絡代碼之前,我從一個微不足道的基準開始:

該基準一開始只是打開一個文件,寫 1KB 並調用 sync_all,測量這個過程需要多長時間,並重複測量 100 次。 使用 Apple AP2048Z SSD 的 2024 Macbook Pro M3 Max 在我意料之外地測量到每次寫入大約需要 4ms 的時間。 這種長時間與我的直覺相違背:寫入到本地的現代 SSD 需要的時間多次比如 ping google.com 的時間長?讓我感到驚訝地在線上查了一下,發現一篇文章報導,即使是 QLC SSD 的平均寫入延遲也應該大約為 70 微秒左右。 這幾乎比我觀察到的時間少 60 倍。我在想這是怎麼回事? 我的直覺是,對磁盤寫入少量數據應該需要的時間應該接近 SSD 的寫入延遲時間。 實際上,在我看來,這應該是寫入延遲的目標! 為了了解可能發生的事情,我在系統上安裝並運行了 fio: 在便宜的 Linux 服務器上運行相同的基準,獲得更糟糕的延遲(平均 68 微秒)和類似的 fsync 時間(平均 22 微秒)。 但運行相同的基準(使用相同版本的 rust 編譯器,相同的優化標誌),測量時間在 25 到 50 微秒之間波動。這相當於 80 到 160 倍的差距!我將嘗試在相同的機器上使用 C 運行相同的測試,如@user2407038 建議的那樣進行了測試。 這是由於使用 fsync(fd)導致測量時間降至 30 微秒,比使用 F_FULLSYNC 縮短了 100 多倍。

via Active questions tagged c – Stack Overflow

June 16, 2024 at 06:54AM

發佈留言

發佈留言必須填寫的電子郵件地址不會公開。 必填欄位標示為 *