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
參考資料