linux pagecache與內存占用
一、概念介紹
linux系統中通常使用free命令來查看內存使用情況,free命令主要是從/proc/meminfo文件中讀取的內存數據然後進行簡單處理進行展示,根據查看free命令的手冊了解到各個字段的含義。
total:系統總內存大小(分物理內存mem、交換分區swap)
used:已使用的內存(total - free - buffers - cache)
free:未使用的內存
shared:通常情況下是tmpfs(內存文件系統)使用的內存
buffers:內核緩沖區使用的內存
cache:page cache和slab所占用的內存之和
buff/cache:buffers + cache
available:在不進行swap的前提下還有多少內存可用於創建新的進程。這個跟free、buff/cache字段中的數字有所不同,這裏的剩余內存是free加上可以被回收(有些slab、cache正在使用,不能回收)的page cache、mem slab的值的總和。
上述的page cache是系統讀寫磁盤文件時為了提高性能而將一部分文件緩存到內存中。這種做法雖然提高了磁盤I/O性能,但是也極大的占用了物理內存,特別當系統內存緊張時更容易出現問題。
二、實際用途
linux系統會經常執行一些寫日誌、生成備份文件的工作,當這些文件比較大時相應的cache就會占用大量的系統內存,而且這些類型的cache並不會被經常訪問,所以系統會定期將這些cache flush到磁盤中。但是如果系統未及時的將這些cache flush到磁盤中的話,就會占用大量的內存導致出現swap的情況,這樣會很影響系統的整體性能。
/proc是一個虛擬文件系統,我們可以通過對它的讀寫操作做為與kernel實體間進行通信的一種手段。也就是說可以通過修改/proc中的文件,來對當前kernel的行為做出調整。有一個內核配置接口 /proc/sys/vm/drop_caches 可以允許用戶手動清理cache來達到釋放內存的作用,這個文件有三個值:1、2、3。具體介紹如下
Writing to this will cause the kernel to drop clean caches, dentries and inodes from memory, causing that memory to become free.
- To free pagecache:
- * echo 1 > /proc/sys/vm/drop_caches
- To free dentries and inodes:
- * echo 2 > /proc/sys/vm/drop_caches
- To free pagecache, dentries and inodes:
- * echo 3 > /proc/sys/vm/drop_caches
- As this is a non-destructive operation, and dirty objects are notfreeable, the user should run "sync" first in order to make sure allcached objects are freed.
- This tunable was added in 2.6.16.
根據上面介紹,在執行上述命令需要先執行sync命令將page cache刷新到磁盤中,然後在通過該drop_caches接口進行緩存清理。
另外,在編寫處理大文件的代碼時,避免整個文件全部讀取到內存中,這樣會導致占用大量的內存,極端情況下會出現linux 系統的OOM導致的正常進程被終止。盡量將文件分割成小文件再進行處理,文件使用完畢後盡早close。
linux pagecache與內存占用