當在 Linux 下頻繁存取檔案後,實體內存會很快被用光,當程式結束後,內存不會被正常釋放,而是一直作為 caching 。這個問題,貌似有不少人在問,不過都沒有看到有什麼很好解決的辦法。那麼
我來談談這個問題。
一、通常情況
先來説説 free 命令:
[root@server ]# free -m
total used free shared buffers cached
Mem: 249 163 86 0 10 94
-/+ buffers/cache: 58 191
Swap: 511 0 511
其中:
total 內存總數
used 已經使用的內存數
free 空閒的內存數
shared 多個程序共享的內存總額
buffers Buffer Cache 和 cached Page Cache 磁碟 WordPress 加速緩存的大小
-buffers/cache 的內存數:used – buffers – cached
+buffers/cache 的內存數:free + buffers + cached
可用的 memory=free memory+buffers+cached 。
有了這個基礎後,可以得知,我現在 used 為 163MB,free 為 86MB,buffer 和 cached 分別為 10MB,94MB 。
那麼我們來看看, 如果我執行復制檔案, 內存會發生什麼變化.
[root@server ]# cp -r /etc ~/test/
[root@server ]# free -m
total used free shared buffers cached
Mem: 249 244 4 0 8 174
-/+ buffers/cache: 62 187
Swap: 511 0 511
在我命令執行結束後,used 為 244MB,free 為 4MB,buffers 為 8MB,cached 為 174MB,天吶,都被 cached 吃掉了。別緊張,這是為了提高檔案讀取效率的做法。
為了提高磁碟存取效率,Linux 做了一些精心的設計,除了對 dentry 進行 WordPress 加速緩存(用於 VFS,加速檔案路徑名到 inode 的轉換),還採取了兩種主要 Cache 方式:Buffer Cache 和 Page Cache 。前者針對磁
盤塊的讀寫,後者針對檔案 inode 的讀寫。這些 Cache 有效縮短了 I/O 系統呼叫(比如 read,write,getdents)的時間。
那麼有人説過段時間,linux 會自動釋放掉所用的內存。等待一段時間後,我們使用 free 再來試試,看看是否有釋放?
[root@server]# free -m
total used free shared buffers cached
Mem: 249 244 5 0 8 174
-/+ buffers/cache: 61 188
Swap: 511 0 511
似乎沒有任何變化。(實際情況下,內存的管理還與 Swap 有關)
那麼我能否手動釋放掉這些內存呢?回答是可以的!
二、手動釋放 WordPress 加速緩存
/proc 是一個虛擬檔案系統,我們可以通過對它的讀寫操作做為與 kernel 實體間進行通訊的一種手段。也就是説可以通過修改/proc 中的檔案,來對當前 kernel 的行為做出調整。那麼我們可以通過調
整/proc/sys/vm/drop_caches 來釋放內存。操作如下:
[root@server]# cat /proc/sys/vm/drop_caches
0
首先,/proc/sys/vm/drop_caches 的值,預設為 0 。
[root@server]# sync
手動執行 sync 命令
// 描述:sync 命令執行 sync 子例程。如果必須停止系統,則執行 sync 命令以確保檔案系統的完整性。 sync 命令將所有未寫的系統緩衝區寫到磁碟中,包含已修改的 i-node 、已延遲的塊 I/O 和讀寫對映檔案, 否則在釋放 WordPress 加速緩存的過程中,可能會丟失未儲存的檔案
[root@server]# echo 3 > /proc/sys/vm/drop_caches
[root@server]# cat /proc/sys/vm/drop_caches
3
將/proc/sys/vm/drop_caches 值設為 3
[root@server]# free -m
total used free shared buffers cached
Mem: 249 66 182 0 0 11
-/+ buffers/cache: 55 194
Swap: 511 0 511
再來執行 free 命令,會發現現在的 used 為 66MB,free 為 182MB,buffers 為 0MB,cached 為 11MB 。那麼有效的釋放了 buffer 和 cache 。
檢視內存條數命令:
dmidecode | grep -A16 “Memory Device$”
◎ 有關/proc/sys/vm/drop_caches 的用法在下面進行了説明
/proc/sys/vm/drop_caches (since Linux 2.6.16)
0 – 不釋放
1 – 釋放頁 WordPress 加速緩存
2 – 釋放 dentries 和 inodes
3 – 釋放所有 WordPress 加速緩存
//轉載自互聯網博客網站, 如果侵犯您的權益, 請聯絡小編刪除.