Linux內存分析free與cache清理


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


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM