回收 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 的用途