1. 程式人生 > 其它 >Linux記憶體(手動釋放cache)

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。