Linux記憶體(手動釋放cache)
專案的擴容申請了一臺機器,到手之後看一下機器的指標,看到記憶體使用情況是這樣的。
1、檢視記憶體
free
$ free -h
total used free shared buffers cached
Mem: 125G 89G 36G 92K 212M 74G
-/+ buffers/cache: 14G 111G
Swap: 7.5G 1.8G 5.6G
cat /proc/meminfo
如果你想得到更加相近的資訊可以使用cat /proc/meminfo,直接看硬體的統計資料。
MemTotal: 131755760 kB MemFree: 38151680 kB Buffers: 217564 kB Cached: 78274852 kB SwapCached: 6072 kB Active: 29647292 kB Inactive: 50949268 kB Active(anon): 2073604 kB Inactive(anon): 30640 kB Active(file): 27573688 kB Inactive(file): 50918628 kB Unevictable: 0 kB Mlocked: 0 kB SwapTotal: 7812092 kB SwapFree: 5889924 kB Dirty: 804 kB Writeback: 0 kB AnonPages: 2100436 kB Mapped: 442904 kB Shmem: 92 kB Slab: 12017476 kB SReclaimable: 11910264 kB SUnreclaim: 107212 kB KernelStack: 31184 kB PageTables: 37492 kB NFS_Unstable: 0 kB Bounce: 0 kB WritebackTmp: 0 kB CommitLimit: 73689972 kB Committed_AS: 25708340 kB VmallocTotal: 34359738367 kB VmallocUsed: 491656 kB VmallocChunk: 34290629896 kB HardwareCorrupted: 0 kB AnonHugePages: 694272 kB HugePages_Total: 0 HugePages_Free: 0 HugePages_Rsvd: 0 HugePages_Surp: 0 Hugepagesize: 2048 kB DirectMap4k: 4096 kB DirectMap2M: 2019328 kB DirectMap1G: 132120576 kB
這裡我們看到,記憶體總數total=125G,已使用used=89G,空閒free=36G,cache=78G。其他型別不等。
先解釋一下:
total 記憶體總數 used 已經使用的記憶體數 free 空閒的記憶體數 shared 多個程序共享的記憶體總額 buffers Buffer Cache和cached Page Cache 磁碟快取的大小 -buffers/cache (已用)的記憶體數:used - buffers - cached +buffers/cache(可用)的記憶體數:free + buffers + cached 可用的memory=free memory+buffers+cached
這裡可以看到我們使用了89G,其中cache佔用了78G。這個佔用有點高,並且不會自動釋放。
2、什麼是cache
為了提高磁碟存取效率,Linux做了一些精心的設計,除了對dentry進行快取(用於VFS,加速檔案路徑名到inode的轉換),還採取了兩種主要Cache方式:Buffer Cache和Page Cache。前者針對磁碟塊的讀寫,後者針對檔案inode的讀寫。這些Cache有效縮短了 I/O系統呼叫(比如read,write,getdents)的時間。
cached主要負責快取檔案使用, 日誌檔案過大造成cached區記憶體增大把記憶體佔用完 .
Free中的buffer和cache:(它們都是佔用記憶體): buffer : 作為buffer cache的記憶體,是塊裝置的讀寫緩衝區 cache: 作為page cache的記憶體, 檔案系統的cache 如果 cache 的值很大,說明cache住的檔案數很多。
3、手動釋放cache
/proc是一個虛擬檔案系統,我們可以通過對它的讀寫操作做為與kernel實體間進行通訊的一種手段。也就是說可以通過修改/proc中的檔案,來對當前kernel的行為做出調整。那麼我們可以通過調整/proc/sys/vm/drop_caches來釋放記憶體。
釋放方法有三種(系統預設值是0,釋放之後你可以再改回0值):
To free pagecache: echo 1 > /proc/sys/vm/drop_caches
To free dentries and inodes: echo 2 > /proc/sys/vm/drop_caches
To free pagecache, dentries and inodes: echo 3 > /proc/sys/vm/drop_caches
注意:在清空快取前我們需要在linux系統中執行一下sync命令,將快取中的未被寫入磁碟的內容寫到磁碟上
具體的操作如下
# 先檢視一下釋放cache信令值, 此時應該是0
$ cat /proc/sys/vm/drop_caches
0
# 將緩衝區寫入磁碟, 當需要停止系統的時候, 保證檔案系統的完整性
$ sync
# 釋放cache, 這個命令可能要花費一點時間, 請耐心等待
$ echo 3 > /proc/sys/vm/drop_caches
# 再看一眼
$ cat /proc/sys/vm/drop_caches
3
再來看一眼記憶體
$ free -h
total used free shared buffers cached
Mem: 125G 3.5G 122G 88K 13M 444M
-/+ buffers/cache: 3.1G 122G
Swap: 7.5G 1.8G 5.6G
cache已經釋放,free=122G。