Linux 內(nèi)存使用過(guò)高排查

<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>

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末湾蔓,一起剝皮案震驚了整個(gè)濱河市瘫析,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌,老刑警劉巖贬循,帶你破解...
    沈念sama閱讀 221,635評(píng)論 6 515
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件咸包,死亡現(xiàn)場(chǎng)離奇詭異像吻,居然都是意外死亡麸锉,警方通過(guò)查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 94,543評(píng)論 3 399
  • 文/潘曉璐 我一進(jìn)店門帽哑,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái)奇适,“玉大人坟比,你說(shuō)我怎么就攤上這事∪峦” “怎么了葛账?”我有些...
    開封第一講書人閱讀 168,083評(píng)論 0 360
  • 文/不壞的土叔 我叫張陵,是天一觀的道長(zhǎng)皮仁。 經(jīng)常有香客問(wèn)我籍琳,道長(zhǎng),這世上最難降的妖魔是什么贷祈? 我笑而不...
    開封第一講書人閱讀 59,640評(píng)論 1 296
  • 正文 為了忘掉前任趋急,我火速辦了婚禮,結(jié)果婚禮上势誊,老公的妹妹穿的比我還像新娘宣谈。我一直安慰自己,他們只是感情好键科,可當(dāng)我...
    茶點(diǎn)故事閱讀 68,640評(píng)論 6 397
  • 文/花漫 我一把揭開白布闻丑。 她就那樣靜靜地躺著,像睡著了一般勋颖。 火紅的嫁衣襯著肌膚如雪嗦嗡。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 52,262評(píng)論 1 308
  • 那天饭玲,我揣著相機(jī)與錄音侥祭,去河邊找鬼。 笑死茄厘,一個(gè)胖子當(dāng)著我的面吹牛矮冬,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播次哈,決...
    沈念sama閱讀 40,833評(píng)論 3 421
  • 文/蒼蘭香墨 我猛地睜開眼胎署,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼!你這毒婦竟也來(lái)了窑滞?” 一聲冷哼從身側(cè)響起琼牧,我...
    開封第一講書人閱讀 39,736評(píng)論 0 276
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤恢筝,失蹤者是張志新(化名)和其女友劉穎,沒(méi)想到半個(gè)月后巨坊,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體撬槽,經(jīng)...
    沈念sama閱讀 46,280評(píng)論 1 319
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 38,369評(píng)論 3 340
  • 正文 我和宋清朗相戀三年趾撵,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了侄柔。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 40,503評(píng)論 1 352
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡占调,死狀恐怖暂题,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情妈候,我是刑警寧澤敢靡,帶...
    沈念sama閱讀 36,185評(píng)論 5 350
  • 正文 年R本政府宣布挂滓,位于F島的核電站苦银,受9級(jí)特大地震影響,放射性物質(zhì)發(fā)生泄漏赶站。R本人自食惡果不足惜幔虏,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,870評(píng)論 3 333
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望贝椿。 院中可真熱鬧想括,春花似錦、人聲如沸烙博。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,340評(píng)論 0 24
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)渣窜。三九已至铺根,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間乔宿,已是汗流浹背位迂。 一陣腳步聲響...
    開封第一講書人閱讀 33,460評(píng)論 1 272
  • 我被黑心中介騙來(lái)泰國(guó)打工, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留详瑞,地道東北人掂林。 一個(gè)月前我還...
    沈念sama閱讀 48,909評(píng)論 3 376
  • 正文 我出身青樓,卻偏偏與公主長(zhǎng)得像坝橡,于是被迫代替她去往敵國(guó)和親泻帮。 傳聞我的和親對(duì)象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 45,512評(píng)論 2 359

推薦閱讀更多精彩內(nèi)容