Grep
為什麼 NetBSD grep 在後續呼叫中減慢近 15 倍
我正在研究 APUE 中的範例。在 NetBSD 9.0 系統上,在沒有大負載的情況下,我呼叫了一次
grep
並得到了一個不起眼的結果:apue$ cd /usr/include apue$ time -p grep __POSIX_SOURCE */*.h > /dev/null real 0.73 user 0.01 sys 0.63
但是,如果我多次重複實驗,系統時間會急劇增加(高達 15 倍):
apue$ time -p grep _POSIX_SOURCE */*.h > /dev/null real 0.57 user 0.02 sys 0.54 apue$ time -p grep _POSIX_SOURCE */*.h > /dev/null real 10.06 user 0.01 sys 10.04 apue$ time -p grep _POSIX_SOURCE */*.h > /dev/null real 3.57 user 0.01 sys 3.56 apue$ time -p grep _POSIX_SOURCE */*.h > /dev/null real 4.58 user 0.00 sys 4.58 apue$ time -p grep _POSIX_SOURCE */*.h > /dev/null real 5.56 user 0.02 sys 5.53 apue$ time -p grep _POSIX_SOURCE */*.h > /dev/null real 6.57 user 0.00 sys 6.56 apue$ time -p grep _POSIX_SOURCE */*.h > /dev/null real 2.56 user 0.01 sys 2.54
這是預期的行為嗎?是什麼導致瞭如此大的差異?
更新 根據@Tim 給出的答案,我查看了我的緩衝區記憶體,發現當 grep 為我的搜尋而苦苦掙扎時,它已完全分配為 100%。重新啟動 VM 後,緩衝區使用率下降到 95% 左右。
$ sysstat bufcache /0 /1 /2 /3 /4 /5 /6 /7 /8 /9 /10 Load Average | 603 metadata buffers using 5565 kBytes of memory ( 0%). 15512 pages for cached file data using 62048 kBytes of memory ( 3%). 3034 pages for executables using 12136 kBytes of memory ( 1%). 6460 pages for anon (non-file) data 25840 kBytes of memory ( 1%). 468172 free pages 1872688 kBytes of memory (93%). File System Bufs used % kB in use % Bufsize kB % Util % / 577 95 5378 97 5418 97 99 Total: 577 95 5378 97 5418 97 99
可能是您耗盡了讀取記憶體(文件系統緩衝區記憶體;參考 buffercache(9))?
在第一次通過時,記憶體主要是空的,因此只是添加了頁面。一旦記憶體已滿,就需要執行某種 LRU(最近最少使用)算法,以確定需要從記憶體中驅逐哪些頁面。該程式碼需要(額外的)時間才能完成其工作。
在執行這些測試時監控記憶體狀態,以查看減速是否與可用記憶體達到零一致。