1. 程式人生 > >Linux記憶體分析與清理

Linux記憶體分析與清理

文章作者:Tyan
部落格:noahsnail.com  |  CSDN  |  簡書

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

參考資料