時(shí)間:2015-06-28 00:00:00 來(lái)源:IT貓撲網(wǎng) 作者:網(wǎng)管聯(lián)盟 我要評(píng)論(0)
總有很多朋友對(duì)于Linux的內(nèi)存管理有疑問,之前一篇linux下的內(nèi)存管理方式似乎也沒能清除大家的疑慮。而在新版核心中,似乎對(duì)這個(gè)問題提供了新的解決方法,特轉(zhuǎn)出來(lái)給大家參考一下。最后,還附上我對(duì)這方法的意見,歡迎各位一同討論。
當(dāng)在Linux下頻繁存取文件后,物理內(nèi)存會(huì)很快被用光,當(dāng)程序結(jié)束后,內(nèi)存不會(huì)被正常釋放,而是一直作為caching。這個(gè)問題,貌似有不少人在問,不過都沒有看到有什么很好解決的辦法。那么我來(lái)談?wù)勥@個(gè)問題。
一、通常情況
先來(lái)說說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 內(nèi)存總數(shù)
used 已經(jīng)使用的內(nèi)存數(shù)
free 空閑的內(nèi)存數(shù)
shared 多個(gè)進(jìn)程共享的內(nèi)存總額
buffers Buffer Cache和cached Page Cache 磁盤緩存的大小
-buffers/cache (已用)的內(nèi)存數(shù):used - buffers - cached
+buffers/cache(可用)的內(nèi)存數(shù):free + buffers + cached
可用的memory=free memory+buffers+cached
有了這個(gè)基礎(chǔ)后,可以得知,我現(xiàn)在used為163MB,free為86MB,buffer和cached分別為10MB,94MB。
那么我們來(lái)看看,如果我執(zhí)行復(fù)制文件,內(nèi)存會(huì)發(fā)生什么變化.
[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
在我命令執(zhí)行結(jié)束后,used為244MB,free為4MB,buffers為8MB,cached為174MB,天吶,都被cached吃掉了。別緊張,這是為了提高文件讀取效率的做法。
為了提高磁盤存取效率,Linux做了一些精心的設(shè)計(jì),除了對(duì)dentry進(jìn)行緩存(用于VFS,加速文件路徑名到inode的轉(zhuǎn)換),還采取了兩種主要Cache方式:Buffer Cache和Page Cache。前者針對(duì)磁盤塊的讀寫,后者針對(duì)文件inode的讀寫。這些Cache有效縮短了 I/O系統(tǒng)調(diào)用(比如read,write,getdents)的時(shí)間。
那么有人說過段時(shí)間,linux會(huì)自動(dòng)釋放掉所用的內(nèi)存。等待一段時(shí)間后,我們使用free再來(lái)試試,看看是否有釋放?
[root@server test]# free -m
total used free shared buffers cached
Mem: 249 244 5 0 8 174
-/+ buffers/cache: 61 188
Swap: 511 0 511
似乎沒有任何變化。(實(shí)際情況下,內(nèi)存的管理還與Swap有關(guān))
那么我能否手動(dòng)釋放掉這些內(nèi)存呢?回答是可以的!
#p#副標(biāo)題#e#
二、手動(dòng)釋放緩存
/proc是一個(gè)虛擬文件系統(tǒng),我們可以通過對(duì)它的讀寫操作做為與kernel實(shí)體間進(jìn)行通信的一種手段。也就是說可以通過修改/proc中的文件,來(lái)對(duì)當(dāng)前kernel的行為做出調(diào)整。那么我們可以通過調(diào)整/proc/sys/vm/drop_caches來(lái)釋放內(nèi)存。操作如下:
[root@server test]# cat /proc/sys/vm/drop_caches
0
首先,/proc/sys/vm/drop_caches的值,默認(rèn)為0。
[root@server test]# sync
手動(dòng)執(zhí)行sync命令(描述:sync 命令運(yùn)行 sync 子例程。如果必須停止系統(tǒng),則運(yùn)行sync 命令以確保文件系統(tǒng)的完整性。sync 命令將所有未寫的系統(tǒng)緩沖區(qū)寫到磁盤中,包含已修改的 i-node、已延遲的塊 I/O 和讀寫映射文件)
[root@server test]# echo 3 > /proc/sys/vm/drop_caches
[root@server test]# cat /proc/sys/vm/drop_caches
3
將/proc/sys/vm/drop_caches值設(shè)為3
[root@server test]# free -m
total used free shared buffers cached
Mem: 249 66 182 0 0 11
-/+ buffers/cache: 55 194
Swap: 511 0 511
再來(lái)運(yùn)行free命令,會(huì)發(fā)現(xiàn)現(xiàn)在的used為66MB,free為182MB,buffers為0MB,cached為11MB。那么有效的釋放了buffer和cache。
◎ 有關(guān)/proc/sys/vm/drop_caches的用法在下面進(jìn)行了說明
/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.
三、我的意見
上述文章就長(zhǎng)期以來(lái)很多用戶對(duì)Linux內(nèi)存管理方面的疑問,給出了一個(gè)比較"直觀"的回復(fù),我更覺得有點(diǎn)像是核心開發(fā)小組的妥協(xié)。
對(duì)于是否需要使用這個(gè)值,或向用戶提及這個(gè)值,我是有保留意見的:
1、從man可以看到,這值從2.6.16以后的核心版本才提供,也就是老版的操作系統(tǒng),如紅旗DC 5.0、RHEL 4.x之前的版本都沒有;
2、若對(duì)于系統(tǒng)內(nèi)存是否夠用的觀察,我還是原意去看swap的使用率和si/so兩個(gè)值的大??;
用戶常見的疑問是,為什么free這么小,是否關(guān)閉應(yīng)用后內(nèi)存沒有釋放?
但實(shí)際上,我們都知道這是因?yàn)長(zhǎng)inux對(duì)內(nèi)存的管理與Windows不同,free小并不是說內(nèi)存不夠用了,應(yīng)該看的是free的第二行最后一個(gè)值:
-/+ buffers/cache: 58 191
這才是系統(tǒng)可用的內(nèi)存大小。
實(shí)際項(xiàng)目中告訴我們,如果因?yàn)槭菓?yīng)用有像內(nèi)存泄露、溢出的問題,從swap的使用情況是可以比較快速可以判斷的,但free上面反而比較難查看。
相反,如果在這個(gè)時(shí)候,我們告訴用戶,修改系統(tǒng)的一個(gè)值,"可以"釋放內(nèi)存,free就大了。用戶會(huì)怎么想?不會(huì)覺得操作系統(tǒng)"有問題"嗎?
所以說,我覺得既然核心是可以快速清空buffer或cache,也不難做到(這從上面的操作中可以明顯看到),但核心并沒有這樣做(默認(rèn)值是0),我們就不應(yīng)該隨便去改變它。
一般情況下,應(yīng)用在系統(tǒng)上穩(wěn)定運(yùn)行了,free值也會(huì)保持在一個(gè)穩(wěn)定值的,雖然看上去可能比較小。
當(dāng)發(fā)生內(nèi)存不足、應(yīng)用獲取不到可用內(nèi)存、OOM錯(cuò)誤等問題時(shí),還是更應(yīng)該去分析應(yīng)用方面的原因,如用戶量太大導(dǎo)致內(nèi)存不足、發(fā)生應(yīng)用內(nèi)存溢出等情況,否則,清空buffer,強(qiáng)制騰出free的大小,可能只是把問題給暫時(shí)屏蔽了。
我覺得,排除內(nèi)存不足的情況外,除非是在軟件開發(fā)階段,需要臨時(shí)清掉buffer,以判斷應(yīng)用的內(nèi)存使用情況;或應(yīng)用已經(jīng)不再提供支持,即使應(yīng)用對(duì)內(nèi)存的時(shí)候確實(shí)有問題,而且無(wú)法避免的情況下,才考慮定時(shí)清空buffer。(可惜,這樣的應(yīng)用通常都是運(yùn)行在老的操作系統(tǒng)版本上,上面的操作也解決不了)。而生產(chǎn)環(huán)境下的服務(wù)器可以不考慮手工釋放內(nèi)存,這樣會(huì)帶來(lái)更多的問題。記住內(nèi)存是拿來(lái)用的,不是拿來(lái)看的。不像windows, 無(wú)論你的真實(shí)物理內(nèi)存有多少,他都要拿硬盤交換文件來(lái)讀。這也就是windows為什么常常提示虛擬空間不足的原因,你們想想多無(wú)聊,在內(nèi)存還有大部分的時(shí)候,拿出一部分硬盤空間來(lái)充當(dāng)內(nèi)存。硬盤怎么會(huì)快過內(nèi)存,所以我們看linux,只要不用swap的交換空間,就不用擔(dān)心自己的內(nèi)存太少。如果常常swap用很多,可能你就要考慮加物理內(nèi)存了,這也是linux看內(nèi)存是否夠用的標(biāo)準(zhǔn)哦。當(dāng)然這僅代表我個(gè)人意見,也歡迎大家來(lái)交流討論。
原文地址 http://www.tech-q.cn/thread-6773-1-1.html
關(guān)鍵詞標(biāo)簽:Linux服務(wù)器,手工釋放
相關(guān)閱讀
熱門文章 安裝紅帽子RedHat Linux9.0操作系統(tǒng)教程 Tomcat9.0如何安裝_Tomcat9.0環(huán)境變量配置方法 多種操作系統(tǒng)NTP客戶端配置 Linux操作系統(tǒng)修改IP
人氣排行 Linux下獲取CPUID、硬盤序列號(hào)與MAC地址 dmidecode命令查看內(nèi)存型號(hào) linux tc實(shí)現(xiàn)ip流量限制 安裝紅帽子RedHat Linux9.0操作系統(tǒng)教程 linux下解壓rar文件 lcx.exe、nc.exe、sc.exe入侵中的使用方法 Ubuntu linux 關(guān)機(jī)、重啟、注銷 命令 查看linux服務(wù)器硬盤IO讀寫負(fù)載