Free命令 - Linux系統(tǒng)診斷 - 內(nèi)存基礎(chǔ)

1 free

1.1 free命令原理


free是通過查看 /proc/meminfo 來獲取內(nèi)存的使用情況。但是 /proc/meminfo 這個文件又是怎么來的单刁?我們先了解下 /proc 目錄:


/proc 是一個虛擬文件系統(tǒng)辫愉,該目錄下的所有文件都是偽文件仰泻,該類文件只存在于內(nèi)存中麻捻,并不占用空間——使用 du -sh 即可驗證,該模具路下的磁盤占用都是0耻矮。 /proc 下的所有文件都是內(nèi)核調(diào)用proc_create() 接口來創(chuàng)建的虛擬條目。 /proc 中的文件忆谓,大多反饋系統(tǒng)信息的實時情況(進程裆装、內(nèi)存、cpu倡缠、設(shè)備信息等)哨免。

結(jié)論: /proc/meminfo 是 /proc 文件系統(tǒng)下保存你內(nèi)存相關(guān)信息的"偽文件"。


2.2 命令輸出簡介


每個發(fā)行版輸出都有一定差異昙沦,我們以debian8 4.19.x發(fā)行版為例琢唾。


root@4f996feeb851:~# free -m total used free shared buffers cachedMem: 1991 1909 81 4 155 836-/+ buffers/cache: 917 1073Swap: 1023 1 1022

大部分的命令輸出意思,大家可以在man文檔中找到解析盾饮,這里不做贅述采桃。


used: 已使用的內(nèi)存 used = total - free -buffers -cached free: 未使用的內(nèi)存 memFreeswapFree in /proc/meminfo shared: tmpfs使用的內(nèi)存 shmem in /proc/meminfo buffers:被內(nèi)核緩沖去使用的內(nèi)存 cached: 被頁緩存和slabs使用的內(nèi)存 buffers/cache: 表示buffers和cache的總和 swap: 交換分區(qū)的使用量

2.3 buffer和cache會使用內(nèi)存嗎?


答案是肯定的丘损,先來了解下buffer和cache普办。


cache(緩存)官方定義是用來彌補高速設(shè)備和低速設(shè)備之間的訪問速度不匹配而預(yù)留的一段空間,用來加快資源的訪問徘钥。 簡單講就是讀的更快衔蹲。 buffer(緩沖)是為了做資源寫入整形,計算機遇到大量的“小規(guī)模IO”時呈础,會將其整形為少量的“大規(guī)模IO”舆驶,降低寫入次數(shù)。從而達到“寫資源”合理利用的效果而钞。

然而贞远,free命令所展示的buffer和cache 有點狹義的意思——free展示的buffer表示 塊設(shè)備所占用的緩存 、free展示的cache表示普通文件占用的the page cache(緩存頁) 笨忌。


總之蓝仲,buffer和cache使用的內(nèi)存都是用來加速Linux讀寫性能,如果有新的進程需要內(nèi)存,系統(tǒng)會將buffer和cache占用的內(nèi)存回收袱结,并重新分配給進程使用亮隙。


2.4 其他內(nèi)存概念


RSSVSZPSSUSS


RSS(Resident Set Size):進程實際使用的物理內(nèi)存大小,包括sharedMem垢夹。 VSZ(Virtual Memory Size):進程所有能夠訪問到的內(nèi)存大小溢吻,包括因為缺頁中斷,被swap出去的內(nèi)存大小果元,以及sharedMem促王。 PSS(Proportional Set Size):按照比例將內(nèi)存的大小加到RSS中。 USS(Unique Set Size):進程獨占的物理內(nèi)存大小而晒。

usedMem分為 activeinactive


active:表示這部分的內(nèi)存正在被某個特定的進程使用蝇狼,不太可能被收回。 inactive:表示這部分內(nèi)存是被分配到某個不在running狀態(tài)的進程倡怎,有可能會被回收迅耘。

Linux會維護一個LRU List用來管理活動頁和非活動頁的回收。 簡單講监署, 越接近該List的末尾颤专,該頁面被回收的概率就越大,反之钠乏,越接近列首栖秕,則更不易被回收。 linux內(nèi)核會維護兩類LRUList——active list和inactive list晓避,剛訪問過的頁面放入active list累魔,長時間未訪問的頁面放入inactive list,內(nèi)核線程kswapd會定期將active list中的頁面移至?inactive list中够滑。


如果系統(tǒng)的inactive的內(nèi)存過大垦写,可以通過如下操作對其做回收。sync; echo 3/proc/sys/vm/drop_caches


3. 虛擬內(nèi)存

現(xiàn)代x86系統(tǒng)彰触,計算機能夠使用的內(nèi)存會大于其物理內(nèi)存的上限梯投,依靠的就是虛擬內(nèi)存機制。Linux支持虛擬內(nèi)存機制和實模式機制况毅。


實模式下分蓖,計算機會直接申請物理內(nèi)存, 虛擬內(nèi)存機制下尔许,系統(tǒng)會把磁盤當成內(nèi)存的擴展么鹤,已增加可使用的內(nèi)存大小。并通過映射map的機制味廊,來保存和物理內(nèi)存的真實對應(yīng)關(guān)系蒸甜。


在磁盤和內(nèi)存之間傳送Page的活動叫做swapping或者頁面調(diào)度(paging)棠耕,被用作虛擬內(nèi)存的磁盤分區(qū)稱為swap。


可以通過在線添加swap的方式臨時緩解內(nèi)存不足的問題柠新,但一般不能直接作在線減少swap的操作窍荧,很有可能導(dǎo)致進程的crash。具體swap配置方式見5.1swap相關(guān)配置恨憎。


4. OOM

1.What is OOM?Out Of Memory Killer 是 Linux 的一種系統(tǒng)保護機制蕊退,在系統(tǒng)內(nèi)存緊張時,kill掉某些進程防止系統(tǒng)卡死憔恳。系統(tǒng)通過打分機制瓤荔,來實施對進程的殺死操作。默認機制是通過掃描所有進程的內(nèi)存占用钥组,cpu占用等因素输硝,然后打分??(badness),分數(shù)越高者铜,進程被kill的優(yōu)先級就越高。


2.哪些行為會讓系統(tǒng)對進程進行打分放椰?


進程使用fork(2)調(diào)用作烟,創(chuàng)建眾多子進程時,會加分(+) 進程已經(jīng)運行了很長時間砾医,或者和使用了大量的CPU時間拿撩,會減分(-) 進程的nice值如果比較低,會加分(+) 進程如果是特權(quán)進程(privileged),會減分(-) 進程如果對硬件設(shè)備進行直接訪問如蚜,會減分(-)

3.在哪兒可以看到進程的打分压恒?/proc/pid/oom_score


4.手動調(diào)整分數(shù)/proc//oom_adj 該文件可以用于調(diào)整在oom發(fā)生時,哪些進程應(yīng)該被kill错邦,范圍-16 -- +15 探赫,默認值為0,??


特殊值-17:表示進程永遠不會被kill撬呢。


5.我怎么知道系統(tǒng)有沒有觸發(fā)過OOM?/var/log/messages 伦吠、 /var/log/syslog 系統(tǒng)日志或者 dmesg 系統(tǒng)日志診斷工具等都能夠找到網(wǎng)圖如下:


5. 內(nèi)存相關(guān)配置

5.1 swap相關(guān)配置


通過調(diào)節(jié)系統(tǒng)參數(shù),來告訴計算機使用swap分區(qū)的權(quán)重 1. 簡介swappiness范圍0-100魂拦,默認600: 表示禁止使用swap60: 默認100: 瘋狂使用swap2. 操作方法# sysctl vm.swappiness=VALUE# sysctl vm.swappiness=20或者# echo VALUE/proc/sys/vm/swappiness# echo 30/proc/sys/vm/swappiness 通過在線增加swap分區(qū)大小毛仪,臨時控制內(nèi)存泄露,內(nèi)存不夠用等異常芯勘。 1. 需要root用戶2. 創(chuàng)建存儲文件# dd if=/dev/zero of=/home/swap2G bs=1024 count=2M3. 安全設(shè)置# chown root:root /home/swap2G# chmod 0600 /home/swap2G4. 創(chuàng)建liunx交換分區(qū)# mkswap /home/swap2G5. enable 交換分區(qū)# swapon /home/swap2G6. 更新fstab文件【注意: 部分操作系統(tǒng)不需要】# vim /etc/fstab/home/swap2G none swap sw 0 07. 檢查是否生效#free -m8. 卸載swap分區(qū)# swapoff /home/swap2G

5.2 緩存相關(guān)


sync; echo 3/proc/sys/vm/drop_caches0:不釋放1:釋放頁緩存2:釋放 dentries 和 inodes3:釋放所有緩存

5.3 OOM相關(guān)


vm.panic_on_oom 是否在觸發(fā) oom 機制時觸發(fā) kernel panic箱靴。0表示關(guān)閉(推薦),1表示打開荷愕。 kernel panic是指計算機遇到了致命的錯誤衡怀,并且他不知道該怎么處理時的一種動作——可以類比windows的藍屏棍矛。 我們當然不希望每次計算機在oom時就直接藍屏。推薦設(shè)置為0 vm.overcommit_kbytes: 用于限制進程能夠申請的最大內(nèi)存狈癞,0表示不設(shè)置茄靠,如果設(shè)置其他數(shù)值,比如400蝶桶,則進程能夠申請到的最大內(nèi)存為 swap+400kBytes vm.overcommit_ratio: 定義了進程可以使用的最大內(nèi)存(百分比模式)慨绳,默認為50。表示配置50之后真竖,進程不允許申請超過 swap + 50% * 物理內(nèi)存總量 以上的內(nèi)存 vm.oom_kill_allocating_task (Linux 2.6.24+支持) 這在內(nèi)存不足的情況下啟用或禁用殺死OOM觸發(fā)任務(wù)脐雪。0表示禁用(默認),1表示啟用恢共≌角铮可以理解為oom機制的開關(guān),默認為禁用——表示要讓oom觸發(fā)器正常執(zhí)行讨韭。 其他有興趣的話脂信,可以自行man proc

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市透硝,隨后出現(xiàn)的幾起案子狰闪,更是在濱河造成了極大的恐慌,老刑警劉巖濒生,帶你破解...
    沈念sama閱讀 222,627評論 6 517
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件埋泵,死亡現(xiàn)場離奇詭異,居然都是意外死亡罪治,警方通過查閱死者的電腦和手機丽声,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 95,180評論 3 399
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來觉义,“玉大人雁社,你說我怎么就攤上這事∩购В” “怎么了歧胁?”我有些...
    開封第一講書人閱讀 169,346評論 0 362
  • 文/不壞的土叔 我叫張陵,是天一觀的道長厉碟。 經(jīng)常有香客問我喊巍,道長,這世上最難降的妖魔是什么箍鼓? 我笑而不...
    開封第一講書人閱讀 60,097評論 1 300
  • 正文 為了忘掉前任崭参,我火速辦了婚禮,結(jié)果婚禮上款咖,老公的妹妹穿的比我還像新娘何暮。我一直安慰自己奄喂,他們只是感情好,可當我...
    茶點故事閱讀 69,100評論 6 398
  • 文/花漫 我一把揭開白布海洼。 她就那樣靜靜地躺著跨新,像睡著了一般。 火紅的嫁衣襯著肌膚如雪坏逢。 梳的紋絲不亂的頭發(fā)上域帐,一...
    開封第一講書人閱讀 52,696評論 1 312
  • 那天,我揣著相機與錄音是整,去河邊找鬼肖揣。 笑死,一個胖子當著我的面吹牛浮入,可吹牛的內(nèi)容都是我干的龙优。 我是一名探鬼主播,決...
    沈念sama閱讀 41,165評論 3 422
  • 文/蒼蘭香墨 我猛地睜開眼事秀,長吁一口氣:“原來是場噩夢啊……” “哼彤断!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起易迹,我...
    開封第一講書人閱讀 40,108評論 0 277
  • 序言:老撾萬榮一對情侶失蹤宰衙,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后赴蝇,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體菩浙,經(jīng)...
    沈念sama閱讀 46,646評論 1 319
  • 正文 獨居荒郊野嶺守林人離奇死亡巢掺,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 38,709評論 3 342
  • 正文 我和宋清朗相戀三年句伶,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片陆淀。...
    茶點故事閱讀 40,861評論 1 353
  • 序言:一個原本活蹦亂跳的男人離奇死亡考余,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出轧苫,到底是詐尸還是另有隱情楚堤,我是刑警寧澤,帶...
    沈念sama閱讀 36,527評論 5 351
  • 正文 年R本政府宣布含懊,位于F島的核電站身冬,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏岔乔。R本人自食惡果不足惜酥筝,卻給世界環(huán)境...
    茶點故事閱讀 42,196評論 3 336
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望雏门。 院中可真熱鬧嘿歌,春花似錦掸掏、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,698評論 0 25
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至步脓,卻和暖如春愿待,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背沪编。 一陣腳步聲響...
    開封第一講書人閱讀 33,804評論 1 274
  • 我被黑心中介騙來泰國打工呼盆, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人蚁廓。 一個月前我還...
    沈念sama閱讀 49,287評論 3 379
  • 正文 我出身青樓访圃,卻偏偏與公主長得像,于是被迫代替她去往敵國和親相嵌。 傳聞我的和親對象是個殘疾皇子腿时,可洞房花燭夜當晚...
    茶點故事閱讀 45,860評論 2 361

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

  • 一、學(xué)習這個命令的背景 因為最近Gitlab服務(wù)器占用內(nèi)存很多饭宾,也在下面的這篇博客里面寫了怎么減少Gitlab占用...
    歐陽鵬閱讀 836評論 0 1
  • linux下free命令詳解 free 命令顯示系統(tǒng)內(nèi)存的使用情況批糟,包括物理內(nèi)存、交換內(nèi)存(swap)和內(nèi)核緩沖區(qū)...
    GoFighting_c2f1閱讀 307評論 0 1
  • 1 內(nèi)存尋址 1.1 物理地址看铆、虛擬地址以及線性地址 物理地址: 物理內(nèi)存的內(nèi)存單元地址 虛擬地址: 程序員看到的...
    瘋狂小王子閱讀 2,820評論 3 21
  • 一徽鼎、概述 1.1 內(nèi)存指標概念 Item 全稱 含義 等價 USSUnique Set Size物理內(nèi)存進程獨占的...
    tiger桂閱讀 2,687評論 0 0
  • 今天感恩節(jié)哎,感謝一直在我身邊的親朋好友弹惦。感恩相遇否淤!感恩不離不棄。 中午開了第一次的黨會棠隐,身份的轉(zhuǎn)變要...
    迷月閃星情閱讀 10,576評論 0 11