回收 Linux cached memory

最近常被問到,當程式讀取大量資料, kernel 會使用大量記憶體當 cache,又不會在記憶體不足時進行回收,造成程式無法執行。這時該怎麼辨?

方法一:

echo 1 > /proc/sys/vm/drop_caches
    or
sysctl -w vm.drop_caches=1

這會觸發 kernel 回收用於 cache 的記憶體。

方法二:

fcntl(fd, F_SETFL, O_DIRECT)

在程式裡,為 file descriptor 設上 O_DIRECT,使 filesystem 避免 cache 該檔案的內容。這適用於某些大檔案。例如,播放隨便就上 Giga bytes 的影片的 media player,就能在 file descriptor 設定 O_DIRECT,避免吃掉大量的系統記憶體。

方法三:

sysctl -w vm.vfs_cache_pressure=n  (n > 100)

這會使 kernel 更勤於回收 cache。

以上作為參考。

O_DIRECT 的用途