<article class="baidu_pl" style="box-sizing: inherit; outline: 0px; margin: 0px; padding: 16px 0px 0px; display: block; position: relative; color: rgb(51, 51, 51); font-family: "Microsoft YaHei", "SF Pro Display", Roboto, Noto, Arial, "PingFang SC", sans-serif; font-size: 14px; font-style: normal; font-variant-ligatures: normal; font-variant-caps: normal; font-weight: 400; letter-spacing: normal; orphans: 2; text-align: start; text-indent: 0px; text-transform: none; white-space: normal; widows: 2; word-spacing: 0px; -webkit-text-stroke-width: 0px; text-decoration-style: initial; text-decoration-color: initial;">
Linux釋放內(nèi)存的命令:
sync
echo 1 > /proc/sys/vm/drop_caches
drop_caches的值可以是0-3之間的數(shù)字虎眨,代表不同的含義:
0:不釋放(系統(tǒng)默認(rèn)值)
1:釋放頁(yè)緩存
2:釋放dentries和inodes
3:釋放所有緩存
釋放完內(nèi)存后改回去讓系統(tǒng)重新自動(dòng)分配內(nèi)存砍濒。
echo 0 >/proc/sys/vm/drop_caches
free -m #看內(nèi)存是否已經(jīng)釋放掉了诲侮。
如果我們需要釋放所有緩存饶辙,就輸入下面的命令:
echo 3 > /proc/sys/vm/drop_caches
######### Linux釋放內(nèi)存的相關(guān)知識(shí) ###############
在Linux系統(tǒng)下耳幢,我們一般不需要去釋放內(nèi)存模暗,因?yàn)橄到y(tǒng)已經(jīng)將內(nèi)存管理的很好禁悠。但是凡事也有例外,有的時(shí)候內(nèi)存會(huì)被緩存占用掉汰蓉,導(dǎo)致系統(tǒng)使用SWAP空 間影響性能绷蹲,例如當(dāng)你在linux下頻繁存取文件后,物理內(nèi)存會(huì)很快被用光,當(dāng)程序結(jié)束后,內(nèi)存不會(huì)被正常釋放,而是一直作為caching棒卷。顾孽,此時(shí)就需 要執(zhí)行釋放內(nèi)存(清理緩存)的操作了祝钢。
Linux系統(tǒng)的緩存機(jī)制是相當(dāng)先進(jìn)的,他會(huì)針對(duì)dentry(用于VFS若厚,加速文件路徑名到inode的轉(zhuǎn)換)拦英、Buffer Cache(針對(duì)磁盤塊的讀寫)和Page Cache(針對(duì)文件inode的讀寫)進(jìn)行緩存操作。但是在進(jìn)行了大量文件操作之后测秸,緩存會(huì)把內(nèi)存資源基本用光疤估。但實(shí)際上我們文件操作已經(jīng)完成,這部分 緩存已經(jīng)用不到了霎冯。這個(gè)時(shí)候铃拇,我們難道只能眼睜睜的看著緩存把內(nèi)存空間占據(jù)掉嗎?所以沈撞,我們還是有必要來(lái)手動(dòng)進(jìn)行Linux下釋放內(nèi)存的操作慷荔,其實(shí)也就是 釋放緩存的操作了。/proc是一個(gè)虛擬文件系統(tǒng),我們可以通過(guò)對(duì)它的讀寫操作做為與kernel實(shí)體間進(jìn)行通信的一種手段.也就是說(shuō)可以通過(guò)修改 /proc中的文件,來(lái)對(duì)當(dāng)前kernel的行為做出調(diào)整.那么我們可以通過(guò)調(diào)整/proc/sys/vm/drop_caches來(lái)釋放內(nèi)存缠俺。要達(dá)到釋 放緩存的目的显晶,我們首先需要了解下關(guān)鍵的配置文件/proc/sys/vm/drop_caches。這個(gè)文件中記錄了緩存釋放的參數(shù)壹士,默認(rèn)值為0磷雇,也就 是不釋放緩存。
一般復(fù)制了文件后,可用內(nèi)存會(huì)變少躏救,都被cached占用了唯笙,這是linux為了提高文件讀取效率的做法:為了提高磁盤存取效率, 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í)間。"
釋放內(nèi)存前先使用sync命令做同步忠怖,以確保文件系統(tǒng)的完整性呢堰,將所有未寫的系統(tǒng)緩沖區(qū)寫到磁盤中,包含已修改的 i-node凡泣、已延遲的塊 I/O 和讀寫映射文件枉疼。否則在釋放緩存的過(guò)程中,可能會(huì)丟失未保存的文件鞋拟。
[root@fcbu.com ~]# free -m
total used free shared buffers cached
Mem: 7979 7897 82 0 30 3918
-/ buffers/cache: 3948 4031
Swap: 4996 438 4558
第一行用全局角度描述系統(tǒng)使用的內(nèi)存狀況:
total 內(nèi)存總數(shù)
used 已經(jīng)使用的內(nèi)存數(shù)骂维,一般情況這個(gè)值會(huì)比較大,因?yàn)檫@個(gè)值包括了cache 應(yīng)用程序使用的內(nèi)存
free 空閑的內(nèi)存數(shù)
shared 多個(gè)進(jìn)程共享的內(nèi)存總額
buffers 緩存贺纲,主要用于目錄方面,inode值等(ls大目錄可看到這個(gè)值增加)
cached 緩存航闺,用于已打開的文件
第二行描述應(yīng)用程序的內(nèi)存使用:
-buffers/cache 的內(nèi)存數(shù):used - buffers - cached
buffers/cache 的內(nèi)存數(shù):free buffers cached
前個(gè)值表示-buffers/cache 應(yīng)用程序使用的內(nèi)存大小,used減去緩存值
后個(gè)值表示 buffers/cache 所有可供應(yīng)用程序使用的內(nèi)存大小,free加上緩存值
第三行表示swap的使用:
used 已使用
free 未使用
可用的內(nèi)存=free memory buffers cached潦刃。
為什么free這么小侮措,是否關(guān)閉應(yīng)用后內(nèi)存沒(méi)有釋放?
但實(shí)際上乖杠,我們都知道這是因?yàn)長(zhǎng)inux對(duì)內(nèi)存的管理與Windows不同分扎,free小并不是說(shuō)內(nèi)存不夠用了,應(yīng)該看的是free的第二行最后一個(gè)值:-/ buffers/cache: 3948 4031 胧洒,這才是系統(tǒng)可用的內(nèi)存大小畏吓。
實(shí)際項(xiàng)目中的經(jīng)驗(yàn)告訴我們,如果因?yàn)槭菓?yīng)用有像內(nèi)存泄露卫漫、溢出的問(wèn)題菲饼,從swap的使用情況是可以比較快速可以判斷的,但free上面反而比較難查看列赎。我覺(jué)得既然核心是可以快速清空buffer或cache巴粪,但核心并沒(méi)有這樣做(默認(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ò) 誤等問(wèn)題時(shí)芭届,還是更應(yīng)該去分析應(yīng)用方面的原因,如用戶量太大導(dǎo)致內(nèi)存不足感耙、發(fā)生應(yīng)用內(nèi)存溢出等情況褂乍,否則,清空buffer即硼,強(qiáng)制騰出free的大小逃片,可 能只是把問(wèn)題給暫時(shí)屏蔽了,所以說(shuō)一般情況下linux都不用經(jīng)常手動(dòng)釋放內(nèi)存只酥。
1褥实、cached主要負(fù)責(zé)緩存文件使用, 日志文件過(guò)大造成cached區(qū)內(nèi)存增大把內(nèi)存占用完 .
Free中的buffer和cache:(它們都是占用內(nèi)存):
buffer : 作為buffer cache的內(nèi)存,是塊設(shè)備的讀寫緩沖區(qū)
cache: 作為page cache的內(nèi)存, 文件系統(tǒng)的cache
如果 cache 的值很大裂允,說(shuō)明cache住的文件數(shù)很多损离。
Linux 內(nèi)存管理做了很多精心的設(shè)計(jì),除了對(duì)dentry進(jìn)行緩存(用于VFS绝编,加速文件路徑名到inode的轉(zhuǎn)換)僻澎,還采取了兩種主要Cache方式:Buffer Cache和Page Cache貌踏,目的就是為了提升磁盤IO的性能。從低速的塊設(shè)備上讀取數(shù)據(jù)會(huì)暫時(shí)保存在內(nèi)存中窟勃,即使數(shù)據(jù)在當(dāng)時(shí)已經(jīng)不再需要了祖乳,但在應(yīng)用程序下一次訪問(wèn)該數(shù)據(jù)時(shí),它可以從內(nèi)存中直接讀取拳恋,從而繞開低速的塊設(shè)備,從而提高系統(tǒng)的整體性能砸捏。而Linux會(huì)充分利用這些空閑的內(nèi)存谬运,設(shè)計(jì)思想是內(nèi)存空閑還不如拿來(lái)多緩存一些數(shù)據(jù),等下次程序再次訪問(wèn)這些數(shù)據(jù)速度就快了垦藏,而如果程序要使用內(nèi)存而系統(tǒng)中內(nèi)存又不足時(shí)梆暖,這時(shí)不是使用交換分區(qū),而是快速回收部分緩存掂骏,將它們留給用戶程序使用轰驳。
因此,可以看出弟灼,buffers/cached真是百益而無(wú)一害级解,真正的壞處可能讓用戶產(chǎn)生一種錯(cuò)覺(jué)——Linux耗內(nèi)存!其實(shí)不然田绑,Linux并沒(méi)有吃掉你的內(nèi)存勤哗,只要還未使用到交換分區(qū),你的內(nèi)存所剩無(wú)幾時(shí)掩驱,你應(yīng)該感到慶幸芒划,因?yàn)長(zhǎng)inux 緩存了大量的數(shù)據(jù),也許下一次你就從中受益欧穴!
2民逼、手動(dòng)釋放cached
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
當(dāng)你在Linux下頻繁存取文件后,物理內(nèi)存會(huì)很快被用光,當(dāng)程序結(jié)束后,內(nèi)存不會(huì)被正常釋放,而是一直作為caching.這個(gè)問(wèn)題,貌似有不少人在問(wèn),不過(guò)都沒(méi)有看到有什么很好解決的辦法.那么我來(lái)談?wù)勥@個(gè)問(wèn)題.
先來(lái)說(shuō)說(shuō)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為86,buffer和cached分別為10,94
那么我們來(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吃掉了.別緊張,這是為了提高文件讀取效率的做法.
引用http://www.wujianrong.com/archives/2007/09/linux_free.html“為了提高磁盤存取效率, 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í)間〉饔В”
那么有人說(shuō)過(guò)段時(shí)間,linux會(huì)自動(dòng)釋放掉所用的內(nèi)存,我們使用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
MS沒(méi)有任何變化,那么我能否手動(dòng)釋放掉這些內(nèi)存呢?回答是可以的!
/proc是一個(gè)虛擬文件系統(tǒng),我們可以通過(guò)對(duì)它的讀寫操作做為與kernel實(shí)體間進(jìn)行通信的一種手段.也就是說(shuō)可以通過(guò)修改/proc中的文件,來(lái)對(duì)當(dāng)前kernel的行為做出調(diào)整.那么我們可以通過(guò)調(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
- 1
- 2
- 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
- 1
- 2
- 3
- 4
- 5
再來(lái)運(yùn)行free命令,發(fā)現(xiàn)現(xiàn)在的used為66MB,free為182MB,buffers為0MB,cached為11MB.那么有效的釋放了buffer和cache.
有關(guān)/proc/sys/vm/drop_caches的用法在下面進(jìn)行了說(shuō)明
/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(8) first
</article>