1、free命令
Linux中查看內存的命令為free,命令如下:
$ free -h
total used free shared buff/cache available
Mem: 62G 4.9G 627M 520K 57G 57G
Swap: 4.0G 335M 3.7G
每一列的解釋如下:
total:內存總數
used:已經使用的內存數
free:空閑的內存數
shared:當前已經廢棄不用
buffers Buffer:緩存內存數
cached Page:緩存內存數
可以看出buff/cache占用的內存份額很大,有時候程序運行結束后,大量內存仍位於buff/cache中,有時運行程序會導致內存不足,因此需要將這部分內存釋放出來。
2、Linux中的緩存分類
要清理Linux中的cache,首先要明白buff和cache的區別(free中的buff/cache),以及pagecache,dentries和inodes的區別。
buff
作為buffer cache的內存,是塊設備的讀寫緩沖區
cache
作為page cache的內存,文件系統的cache。Buffer cache是針對磁盤塊的緩存,也就是在沒有文件系統的情況下,直接對磁盤進行操作的數據會緩存到buffer cache中。
pagecache
頁面緩存(pagecache)可以包含磁盤塊的任何內存映射。這可以是緩沖I/O,內存映射文件,可執行文件的分頁區域——操作系統可以從文件保存在內存中的任何內容。Page cache實際上是針對文件系統的,是文件的緩存,在文件層面上的數據會緩存到page cache。
dentries
表示目錄的數據結構
inodes
表示文件的數據結構
總結:cached是cpu與內存間的,buffer是內存與磁盤間的,都是為了解決速度不對等的問題。buffer是即將要被寫入磁盤的,而cache是被從磁盤中讀出來的。
緩存(cached)是把讀取過的數據保存起來,重新讀取時若命中(找到需要的數據)就不要去讀硬盤了,若沒有命中就讀硬盤。其中的數據會根據讀取頻率進行組織,把最頻繁讀取的內容放在最容易找到的位置,把不再讀的內容不斷往后排,直至從中刪除。
緩沖(buffers)是根據磁盤的讀寫設計的,把分散的寫操作集中進行,減少磁盤碎片和硬盤的反復尋道,從而提高系統性能。linux有一個守護進程定期清空緩沖內容(即寫入磁盤),也可以通過sync命令手動清空緩沖。
3、清理cache
/proc/sys/vm/drop_caches (since Linux 2.6.16)
Writing to this file causes the kernel to drop clean caches,dentries and inodes from memory, causing that memory to become free.
To free pagecache, use echo 1 > /proc/sys/vm/drop_caches;
to free dentries and inodes, use echo 2 > /proc/sys/vm/drop_caches;
to free pagecache, dentries and inodes, use echo 3 > /proc/sys/vm/drop_caches.
Because this is a non-destructive operation and dirty objects are not freeable, the user should run sync first.
/proc是一個虛擬文件系統,我們可以通過對它的讀寫操作做為與kernel實體間進行通信的一種手段。也就是說可以通過修改/proc中的文件,來對當前kernel的行為做出調整。那么我們可以通過調整/proc/sys/vm/drop_caches來釋放內存。
/proc/sys/vm/drop_caches中的默認值為0
- 值為1時表示可以釋放pagecache緩存
- 值為2時可以釋放pagecache和inode緩存
- 值為3時可以釋放pagecache, dentries和inodes緩存
當然在釋放內存之前需要執行sync命令。
sync && echo 1 > /proc/sys/vm/drop_caches
sync && echo 2 > /proc/sys/vm/drop_caches
sync && echo 3 > /proc/sys/vm/drop_caches