[問題] vector emplace_back 疑似page fault問題

看板C_and_CPP作者 (笑面男)時間2年前 (2022/01/14 04:58), 編輯推噓5(5018)
留言23則, 7人參與, 2年前最新討論串1/1
開發平台(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

01/14 13:02, 2年前 , 1F
好奇一問,mlock()有成功嗎
01/14 13:02, 1F

01/14 13:23, 2年前 , 2F
你想要什麼硬性的 page fault...?
01/14 13:23, 2F

01/14 13:24, 2年前 , 3F
15us的話應該是minor page fault,可以試試看perf
01/14 13:24, 3F

01/14 13:35, 2年前 , 4F
程式在向 OS 要 memory 時,實際上 OS 是先預留位置,
01/14 13:35, 4F

01/14 13:35, 2年前 , 5F
直到實際去存取要到的位置時 (觸發了 page fault 後)
01/14 13:35, 5F

01/14 13:35, 2年前 , 6F
才會真的去更新 page table,屬於 recoverable 的
01/14 13:35, 6F

01/14 13:44, 2年前 , 7F
想避免的話也許用 mmap + MAP_POPULATE?
01/14 13:44, 7F

01/14 16:06, 2年前 , 8F
madvise?
01/14 16:06, 8F

01/14 18:19, 2年前 , 9F
抱歉可能描述不清楚讓大家誤會了,mlock()有成功,
01/14 18:19, 9F

01/14 18:20, 2年前 , 10F
所以我想說在使用mlock()時跑/usr/bin/time -v應該
01/14 18:20, 10F

01/14 18:22, 2年前 , 11F
看不到minor page fault,可是仍然顯示有一樣多的
01/14 18:22, 11F

01/14 18:24, 2年前 , 12F
(甚至更多)的minor page fault,這樣無法解釋mlock()
01/14 18:24, 12F

01/14 18:25, 2年前 , 13F
真的有解決原有的page fault問題。
01/14 18:25, 13F

01/15 03:29, 2年前 , 14F
語言runtime在載入.so時也會有page fault 或許可以試試
01/15 03:29, 14F

01/15 03:29, 2年前 , 15F
在你感興趣的程式碼前後用getrusage來觀察page fault次
01/15 03:29, 15F

01/15 03:29, 2年前 , 16F
數比較精準
01/15 03:29, 16F

01/15 14:30, 2年前 , 17F
總是會有 page fault 只是發生時間早晚問題
01/15 14:30, 17F

01/15 14:35, 2年前 , 18F
從mmap 拿到的 address 再跑 madvise + MADV_HUGEPAGE
01/15 14:35, 18F

01/15 14:36, 2年前 , 19F
使用 huge page (e.g. 2M) 應該就能減少次數了
01/15 14:36, 19F

01/15 14:38, 2年前 , 20F
std::vector default allocator 也不一定是 mmap 來的
01/15 14:38, 20F

01/15 14:39, 2年前 , 21F
建議自己用 mmap 寫個 custom allocator
01/15 14:39, 21F

01/16 06:43, 2年前 , 22F
謝謝各位大神的建議,我再研究看看,有結果再跟大家
01/16 06:43, 22F

01/16 06:43, 2年前 , 23F
分享,感恩。
01/16 06:43, 23F
文章代碼(AID): #1Xu99Ri8 (C_and_CPP)