手動釋放linux下cache所佔用的實體記憶體
http://blog.chinaunix.net/uid-17218799-id-3067098.html
手動釋放linux記憶體cache 2012-02-07 16:35:22
分類: LINUX
總有很多朋友對於Linux的記憶體管理有疑問,之前一篇linux下的記憶體管理方式似乎也沒能清除大家的疑慮。 而在新版核心中,似乎對這個問題提供了新的解決方法,特轉出來給大家參考一下。最後,還附上我對
這方法的意見,歡迎各位一同討論。 而是一直作為caching。這個問題,貌似有不少人在問,不過都沒有看到有什麼很好解決的辦法。 那麼我來談談這個問題。 一、通常情況先來說說free命令:
1.# free -m
2.total used free shared buffers cached
3.Mem: 249 163 86 0 10 94
4.-/+ buffers/cache: 58 191
5.Swap: 511 0 511
其中:
有了這個基礎後,可以得知,我現在used為163MB,free為86MB,buffer和cached分別為10MB,94MB。
1.# cp -r /etc ~/test/
2.# free -m
3.total used free shared buffers cached
4.Mem: 249 244 4 0 8 174
5.-/+ buffers/cache: 62 187
6.Swap: 511 0 511
在我命令執行結束後,used為244MB,free為4MB,buffers為8MB,cached為174MB,天吶,都被cached吃掉了。
別緊張,這是為了提高檔案讀取效率的做法。 inode的轉換),還採取了兩種主要Cache方式:Buffer Cache和Page Cache。前者針對磁碟塊的讀寫,
後者針對檔案inode的讀寫。這些Cache有效縮短了 I/O系統呼叫(比如read,write,getdents)的時間。 看看是否有釋放?
1.# free -m
2.total used free shared buffers cached
3.Mem: 249 244 5 0 8 174
4.-/+ buffers/cache: 61 188
5.Swap: 511 0 511
似乎沒有任何變化。(實際情況下,記憶體的管理還與Swap有關)那麼我能否手動釋放掉這些記憶體呢? 回答是可以的! 二、手動釋放快取/proc是一個虛擬檔案系統,我們可以透過對它的讀寫操作做為與kernel實體間進行通訊的一種手段。 也就是說可以透過修改/proc中的檔案,來對當前kernel的行為做出調整。那麼我們可以透過調整 /proc/sys/vm/drop_caches來釋放記憶體。操作如下:
1.# cat /proc/sys/vm/drop_caches
2.0
首先,/proc/sys/vm/drop_caches的值,預設為0。
1.# sync
手動執行sync命令(描述:sync 命令執行 sync 子例程。如果必須停止系統,則執行sync 命令以確保檔案系統的 完整性。sync 命令將所有未寫的系統緩衝區寫到磁碟中,包含已修改的 i-node、已延遲的塊 I/O 和 讀寫對映檔案)
1.# echo 3 > /proc/sys/vm/drop_caches
2.# cat /proc/sys/vm/drop_caches
3.3
將/proc/sys/vm/drop_caches值設為3
1.# free -m
2.total used free shared buffers cached
3.Mem: 249 66 182 0 0 11
4.-/+ buffers/cache: 55 194
5.Swap: 511 0 511
再來執行free命令,會發現現在的used為66MB,free為182MB,buffers為0MB,cached為11MB。
那麼有效的釋放了buffer和cache。
三、我的意見
上述文章就長期以來很多使用者對Linux記憶體管理方面的疑問,給出了一個比較“直觀”的回覆, 我更覺得有點像是核心開發小組的妥協。對於是否需要使用這個值,或向使用者提及這個值, 我是有保留意見的。
從man可以看到,這值從2.6.16以後的核心版本才提供,也就是老版的作業系統, 如紅旗DC 5.0、RHEL 4.x之前的版本都沒有;若對於系統記憶體是否夠用的觀察, 我還是原意去看swap的使用率和si/so兩個值的大小;
使用者常見的疑問是,為什麼free這麼小,是否關閉應用後記憶體沒有釋放?但實際上,我們都知道這是因為 Linux對記憶體的管理與Windows不同,free小並不是說記憶體不夠用了,應該看的是free的第二行最後一個值: -/+ buffers/cache: 58 191,這才是系統可用的記憶體大小。
實際專案中告訴我們,如果因為是應用有像記憶體洩露、溢位的問題,從swap的使用情況是可以比較快速 可以判斷的,但free上面反而比較難檢視。相反,如果在這個時候,我們告訴使用者,修改系統的一個值, “可以”釋放記憶體,free就大了。使用者會怎麼想?不會覺得作業系統“有問題”嗎?所以說,我覺得既然核心 是可以快速清空buffer或cache,也不難做到(這從上面的操作中可以明顯看到),但核心並沒有這樣做 (預設值是0),我們就不應該隨便去改變它。一般情況下,應用在系統上穩定執行了,free值也會保持 在一個穩定值的,雖然看上去可能比較小。
當發生記憶體不足、應用獲取不到可用記憶體、OOM錯誤等問題時,還是更應該去分析應用方面的原因, 如使用者量太大導致記憶體不足、發生應用記憶體溢位等情況,否則,清空buffer,強制騰出free的大小, 可能只是把問題給暫時遮蔽了。
我覺得,排除記憶體不足的情況外,除非是在軟體開發階段,需要臨時清掉buffer,以判斷應用的記憶體使用情況; 或應用已經不再提供支援,即使應用對記憶體的時候確實有問題,而且無法避免的情況下,才考慮定時清空buffer。 (可惜,這樣的應用通常都是執行在老的作業系統版本上,上面的操作也解決不了)。而生產環境下的伺服器 可以不考慮手工釋放記憶體,這樣會帶來更多的問題。記住記憶體是拿來用的,不是拿來看的。 不像windows,無論你的真實實體記憶體有多少,他都要拿硬碟交換檔案來讀。 這也就是windows為什麼常常提示虛擬空間不足的原因,你們想想多無聊,在記憶體還有大部分的時候, 拿出一部分硬碟空間來充當記憶體。 硬碟怎麼會快過記憶體,所以我們看linux,只要不用swap的交換空間,就不用擔心自己的記憶體太少。 如果常常swap用很多,可能你就要考慮加實體記憶體了,這也是linux看記憶體是否夠用的標準哦。 當然這僅代表我個人意見,也歡迎大家來交流討論。
原文地址: |
來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/19602/viewspace-1724695/,如需轉載,請註明出處,否則將追究法律責任。
相關文章
- Linux系統手動釋放記憶體快取Linux記憶體快取
- Chrome 再次最佳化記憶體佔用問題,新增記憶體釋放開關Chrome記憶體
- 怎麼手動在rstudio中釋放記憶體?記憶體
- Linux記憶體、Swap、Cache、BufferLinux記憶體
- 如何主動釋放 HeapIdle 的記憶體API記憶體
- vector 的記憶體釋放記憶體
- 手動釋放Linux上的Swap、Buffer和CacheLinux
- XCode釋放記憶體XCode記憶體
- 記憶體的分配與釋放,記憶體洩漏記憶體
- Linux如何手動釋放Swap、Buffer和CacheLinux
- Redis刪除大量key後,佔用的系統記憶體卻沒有釋放?Redis記憶體
- python物件的記憶體佔用Python物件記憶體
- 如何讓手遊記憶體佔用更小?從記憶體消耗iOS實時統計開始記憶體iOS
- 資源記憶體佔用記憶體
- influxdb記憶體佔用剖析UX記憶體
- golang 釋放記憶體機制的探索Golang記憶體
- linux記憶體管理(一)實體記憶體的組織和記憶體分配Linux記憶體
- Linux實體記憶體管理Linux記憶體
- C# 垃圾回收釋放記憶體C#記憶體
- iOS底層原理探究- NSObject 所佔記憶體iOSObject記憶體
- Redis 實戰 —— 12. 降低記憶體佔用Redis記憶體
- .Net記憶體管理釋放的兩種方式記憶體
- 託管堆記憶體佔用記憶體
- node計算記憶體佔用記憶體
- mariadb 記憶體佔用優化記憶體優化
- 【.Net Core】分析.net core在linux下記憶體佔用過高問題Linux記憶體
- win10如何設定自動釋放記憶體_win10怎麼設定自動清理系統垃圾釋放記憶體Win10記憶體
- C/C++記憶體分配以及釋放C++記憶體
- vector clear() 方法 記憶體釋放問題記憶體
- Win10記憶體佔用過多怎麼辦 win10清理記憶體佔用的方法Win10記憶體
- Redis 檢視所有 key 的 value 值所佔記憶體大小Redis記憶體
- Vector() 記憶體釋放 不得不說的故事記憶體
- C++ vector 釋放記憶體的兩種方法C++記憶體
- 檢視LINUX程式記憶體佔用情況Linux記憶體
- linux結束處於Tl狀態的程序,釋放記憶體資源Linux記憶體
- DOTNET記憶體佔用最佳化記憶體
- MySQL記憶體佔用計算公式MySql記憶體公式
- win10系統快速啟動佔用記憶體如何解決_win10快速啟動佔用記憶體高的解決教程Win10記憶體
- golang手動管理記憶體Golang記憶體