2017-07-20 42 views
3

如果您嘗試使用Rust的任何內存分配機制(包括每晚alloc_api)分配大量內存,則無法預填充頁表,即不能重新創建mmap的MAP_POPULATE選項。相反,當我需要分配大面積內存時,我只使用libc::mmap有沒有辦法預先爲操作系統的頁面表填充Rust分配?

除了循環使用Vec<usize>Vec<SomeTypeOfPageSize>並觸發頁面錯誤之外,是否還有另一種方法在Rust中預填充頁表?

由於pointed out by @FlorianWeimer,有平臺特定的方式來做到這一點。我將掃描Rust RFC以查看新分配器API是否包含任何預填充選項。

+0

出於好奇,你會看到這樣一個前人口增長是什麼樣的加速? – Shepmaster

+2

@Shepmaster:作爲一名在HFT工作的人,我的典型回答是,吞吐量不如延遲的可預測性。單個頁面錯誤會導致延遲(在很多執行過程中)的尾部分佈,這是真正令人厭惡的,因爲在中位數上高達100倍/ 1000倍。 –

+1

添加到@MatthieuM中。說它更多的是控制啓動期間的延遲。在程序的整個生命週期中,它沒有任何區別(假設你最終填充了頁表)。但是,當每秒執行數百萬個數據包時,任何涉及中斷/系統調用的阻塞行爲都非常昂貴,並且可能會導致數據包被丟棄,直到頁表被填充爲止。 –

回答

4

如果您有能力預先填充的所有內容,那麼您可以調用mlockall。這應該適用於GNU/Linux以及實現POSIX實時(進程內存鎖定)擴展的系統。

這是否可以接受真的取決於您的應用程序。

相關問題