文章作者:Tyan
博客:noahsnail.com ?|? CSDN ?|? 簡(jiǎn)書
1. free命令
Linux中查看內(nèi)存的命令為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:內(nèi)存總數(shù)
- used:已經(jīng)使用的內(nèi)存數(shù)
- free:空閑的內(nèi)存數(shù)
- shared:當(dāng)前已經(jīng)廢棄不用
- buffers Buffer:緩存內(nèi)存數(shù)
- cached Page:緩存內(nèi)存數(shù)
可以看出buff/cache
占用的內(nèi)存份額很大,有時(shí)候程序運(yùn)行結(jié)束后蒋失,大量?jī)?nèi)存仍位于buff/cache
中,有時(shí)運(yùn)行程序會(huì)導(dǎo)致內(nèi)存不足掸读,因此需要將這部分內(nèi)存釋放出來(lái)糜颠。
2. Linux中的緩存分類
要清理Linux中的cache熊榛,首先要明白buff和cache的區(qū)別(free中的buff/cache)种樱,以及pagecache蒙袍,dentries和inodes的區(qū)別俊卤。
buff
作為buffer cache的內(nèi)存,是塊設(shè)備的讀寫緩沖區(qū)cache
作為page cache的內(nèi)存左敌,文件系統(tǒng)的cache瘾蛋。Buffer cache是針對(duì)磁盤塊的緩存俐镐,也就是在沒(méi)有文件系統(tǒng)的情況下矫限,直接對(duì)磁盤進(jìn)行操作的數(shù)據(jù)會(huì)緩存到buffer cache中佩抹。pagecache
頁(yè)面緩存(pagecache)可以包含磁盤塊的任何內(nèi)存映射叼风。這可以是緩沖I/O,內(nèi)存映射文件棍苹,可執(zhí)行文件的分頁(yè)區(qū)域——操作系統(tǒng)可以從文件保存在內(nèi)存中的任何內(nèi)容无宿。Page cache實(shí)際上是針對(duì)文件系統(tǒng)的,是文件的緩存枢里,在文件層面上的數(shù)據(jù)會(huì)緩存到page cache孽鸡。
dentries
表示目錄的數(shù)據(jù)結(jié)構(gòu)inodes
表示文件的數(shù)據(jù)結(jié)構(gòu)
總結(jié):cached是cpu與內(nèi)存間的,buffer是內(nèi)存與磁盤間的栏豺,都是為了解決速度不對(duì)等的問(wèn)題彬碱。buffer是即將要被寫入磁盤的,而cache是被從磁盤中讀出來(lái)的奥洼。
緩存(cached)是把讀取過(guò)的數(shù)據(jù)保存起來(lái)巷疼,重新讀取時(shí)若命中(找到需要的數(shù)據(jù))就不要去讀硬盤了,若沒(méi)有命中就讀硬盤灵奖。其中的數(shù)據(jù)會(huì)根據(jù)讀取頻率進(jìn)行組織嚼沿,把最頻繁讀取的內(nèi)容放在最容易找到的位置,把不再讀的內(nèi)容不斷往后排瓷患,直至從中刪除骡尽。
緩沖(buffers)是根據(jù)磁盤的讀寫設(shè)計(jì)的,把分散的寫操作集中進(jìn)行擅编,減少磁盤碎片和硬盤的反復(fù)尋道攀细,從而提高系統(tǒng)性能。linux有一個(gè)守護(hù)進(jìn)程定期清空緩沖內(nèi)容(即寫入磁盤)沙咏,也可以通過(guò)sync命令手動(dòng)清空緩沖辨图。
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是一個(gè)虛擬文件系統(tǒng),我們可以通過(guò)對(duì)它的讀寫操作做為與kernel實(shí)體間進(jìn)行通信的一種手段肢藐。也就是說(shuō)可以通過(guò)修改/proc中的文件故河,來(lái)對(duì)當(dāng)前kernel的行為做出調(diào)整。那么我們可以通過(guò)調(diào)整/proc/sys/vm/drop_caches來(lái)釋放內(nèi)存吆豹。/proc/sys/vm/drop_caches
中的默認(rèn)值為0鱼的,值為1時(shí)表示可以釋放pagecache緩存理盆,值為2時(shí)可以釋放pagecache和inode緩存,值為3時(shí)可以釋放pagecache, dentries和inodes緩存凑阶。當(dāng)然在釋放內(nèi)存之前需要執(zhí)行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
參考資料