看板 C_and_CPP 關於我們 聯絡資訊
開發平台(Platform): (Ex: Win10, Linux, ...) Linux 編譯器(Ex: GCC, clang, VC++...)+目標環境(跟開發平台不同的話需列出) GCC 問題(Question): 上面那篇我有問估算vector在empalce_back(int)花的時間時, 發現疑似有page fault的情形, 但問題來了,我用/usr/bin/time -v ./a.out 去檢測,結果如下: Major (requiring I/O) page faults: 0 Minor (reclaiming a frame) page faults: 343 看起來沒有發生硬性的page fault,而且我測試的機器記憶體有32GB, 這樣會遇到page fault也讓我有點驚訝, 另外我後來有加mlock,就可以避免在1024倍數次loop時時間變大到us的問題, 但我這時再用/usr/bin/time -v ./a.out 去檢測,結果跟沒有加mlock差不多, 這樣真的有改善page fault嗎? 讓我有點懷疑。 有沒有神人可以指點一二,感恩。 程式碼(Code):(請善用置底文網頁, 記得排版,禁止使用圖檔) #include <iostream> #include <vector> #include <sys/mman.h> uint64_t get_tscp() { uint64_t a, d; __asm__ volatile("rdtscp" : "=a"(a), "=d"(d)); return (d << 32) | a; } int main(int argc, char *argv[]) { std::vector<int> v; int size = 4096; v.reserve(size); mlock(&v[0], sizeof(int)*size); for (int i = 0; i < size; ++i) { auto t1 = get_tscp(); v.emplace_back(i); auto t2 = get_tscp(); // std::cout << (t2 - t1) / 2.6 << std::endl; } return 0; } -- 生死去來,棚頭傀儡,一線斷時,落落磊磊。 -- ※ 發信站: 批踢踢實業坊(ptt.cc), 來自: 111.248.111.87 (臺灣) ※ 文章網址: https://www.ptt.cc/bbs/C_and_CPP/M.1642107483.A.B08.html
shibin: 好奇一問,mlock()有成功嗎 01/14 13:02
Lipraxde: 你想要什麼硬性的 page fault...? 01/14 13:23
sarafciel: 15us的話應該是minor page fault,可以試試看perf 01/14 13:24
Lipraxde: 程式在向 OS 要 memory 時,實際上 OS 是先預留位置, 01/14 13:35
Lipraxde: 直到實際去存取要到的位置時 (觸發了 page fault 後) 01/14 13:35
Lipraxde: 才會真的去更新 page table,屬於 recoverable 的 01/14 13:35
Lipraxde: 想避免的話也許用 mmap + MAP_POPULATE? 01/14 13:44
jaid: madvise? 01/14 16:06
laughingman: 抱歉可能描述不清楚讓大家誤會了,mlock()有成功, 01/14 18:19
laughingman: 所以我想說在使用mlock()時跑/usr/bin/time -v應該 01/14 18:20
laughingman: 看不到minor page fault,可是仍然顯示有一樣多的 01/14 18:22
laughingman: (甚至更多)的minor page fault,這樣無法解釋mlock() 01/14 18:24
laughingman: 真的有解決原有的page fault問題。 01/14 18:25
dces4212: 語言runtime在載入.so時也會有page fault 或許可以試試 01/15 03:29
dces4212: 在你感興趣的程式碼前後用getrusage來觀察page fault次 01/15 03:29
dces4212: 數比較精準 01/15 03:29
LiloHuang: 總是會有 page fault 只是發生時間早晚問題 01/15 14:30
LiloHuang: 從mmap 拿到的 address 再跑 madvise + MADV_HUGEPAGE 01/15 14:35
LiloHuang: 使用 huge page (e.g. 2M) 應該就能減少次數了 01/15 14:36
LiloHuang: std::vector default allocator 也不一定是 mmap 來的 01/15 14:38
LiloHuang: 建議自己用 mmap 寫個 custom allocator 01/15 14:39
laughingman: 謝謝各位大神的建議,我再研究看看,有結果再跟大家 01/16 06:43
laughingman: 分享,感恩。 01/16 06:43