Grep

為什麼 NetBSD grep 在後續呼叫中減慢近 15 倍

  • February 15, 2021

我正在研究 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(最近最少使用)算法,以確定需要從記憶體中驅逐哪些頁面。該程式碼需要(額外的)時間才能完成其工作。

在執行這些測試時監控記憶體狀態,以查看減速是否與可用記憶體達到零一致。

引用自:https://unix.stackexchange.com/questions/634479