共計(jì) 3973 個(gè)字符,預(yù)計(jì)需要花費(fèi) 10 分鐘才能閱讀完成。
這篇文章主要講解了“Linux 內(nèi)存基礎(chǔ)知識(shí)點(diǎn)有哪些”,文中的講解內(nèi)容簡單清晰,易于學(xué)習(xí)與理解,下面請(qǐng)大家跟著丸趣 TV 小編的思路慢慢深入,一起來研究和學(xué)習(xí)“Linux 內(nèi)存基礎(chǔ)知識(shí)點(diǎn)有哪些”吧!
1. 背景
談及 linux 內(nèi)存,很多時(shí)候,我們會(huì)關(guān)注 free,top 等基礎(chǔ)命令。當(dāng)系統(tǒng)遇到異常情況時(shí),內(nèi)存問題的根因追溯,現(xiàn)場診斷時(shí),缺乏深層次的 debug 能力。本篇幅不做深層討論,能把當(dāng)前系統(tǒng)的問題描述清楚,是每個(gè) SRE 應(yīng)該具備的最基礎(chǔ)能力。
2. free
2.1 free 命令原理
free 是通過查看 /proc/meminfo 來獲取內(nèi)存的使用情況。但是 /proc/meminfo 這個(gè)文件又是怎么來的?我們先了解下 /proc 目錄:
/proc 是一個(gè)虛擬文件系統(tǒng),該目錄下的所有文件都是偽文件,該類文件只存在于內(nèi)存中,并不占用空間——使用 du -sh 即可驗(yàn)證,該模具路下的磁盤占用都是 0。
/proc 下的所有文件都是內(nèi)核調(diào)用 proc_create() 接口來創(chuàng)建的虛擬條目。
/proc 中的文件,大多反饋系統(tǒng)信息的實(shí)時(shí)情況(進(jìn)程、內(nèi)存、cpu、設(shè)備信息等)。
結(jié)論:/proc/meminfo 是 /proc 文件系統(tǒng)下保存你內(nèi)存相關(guān)信息的 偽文件。
2.2 命令輸出簡介
每個(gè)發(fā)行版輸出都有一定差異,我們以 debian8 4.19.x 發(fā)行版為例。
root@4f996feeb851:~# free -m
total used free shared buffers cached
Mem: 1991 1909 81 4 155 836
-/+ buffers/cache: 917 1073
Swap: 1023 1 1022
大部分的命令輸出意思,大家可以在 man 文檔中找到解析,這里不做贅述。
used: 已使用的內(nèi)存 used = total – free -buffers -cached
free: 未使用的內(nèi)存 memFree swapFree 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 會(huì)使用內(nèi)存嗎?
答案是肯定的,先來了解下 buffer 和 cache。
cache(緩存)官方定義是用來彌補(bǔ)高速設(shè)備和低速設(shè)備之間的訪問速度不匹配而預(yù)留的一段空間,用來加快資源的訪問。簡單講就是讀的更快。
buffer(緩沖)是為了做資源寫入整形,計(jì)算機(jī)遇到大量的“小規(guī)模 IO”時(shí),會(huì)將其整形為少量的“大規(guī)模 IO”,降低寫入次數(shù)。從而達(dá)到“寫資源”合理利用的效果。
然而,free 命令所展示的 buffer 和 cache 有點(diǎn)狹義的意思——free 展示的 buffer 表示 塊設(shè)備所占用的緩存、free 展示的 cache 表示普通文件占用的 the page cache(緩存頁)。
總之,buffer 和 cache 使用的內(nèi)存都是用來加速 Linux 讀寫性能,如果有新的進(jìn)程需要內(nèi)存,系統(tǒng)會(huì)將 buffer 和 cache 占用的內(nèi)存回收,并重新分配給進(jìn)程使用。
2.4 其他內(nèi)存概念
RSS VSZ PSS USS
RSS(Resident Set Size):進(jìn)程實(shí)際使用的物理內(nèi)存大小,包括 sharedMem。
VSZ(Virtual Memory Size):進(jìn)程所有能夠訪問到的內(nèi)存大小,包括因?yàn)槿表撝袛啵?swap 出去的內(nèi)存大小,以及 sharedMem。
PSS(Proportional Set Size):按照比例將內(nèi)存的大小加到 RSS 中。
USS(Unique Set Size):進(jìn)程獨(dú)占的物理內(nèi)存大小。
usedMem 分為 active inactive
active:表示這部分的內(nèi)存正在被某個(gè)特定的進(jìn)程使用,不太可能被收回。
inactive:表示這部分內(nèi)存是被分配到某個(gè)不在 running 狀態(tài)的進(jìn)程,有可能會(huì)被回收。
Linux 會(huì)維護(hù)一個(gè) LRU List 用來管理活動(dòng)頁和非活動(dòng)頁的回收。簡單講,越接近該 List 的末尾,該頁面被回收的概率就越大,反之,越接近列首,則更不易被回收。linux 內(nèi)核會(huì)維護(hù)兩類 LRUList——active list 和 inactive list,剛訪問過的頁面放入 active list,長時(shí)間未訪問的頁面放入 inactive list,內(nèi)核線程 kswapd 會(huì)定期將 active list 中的頁面移至?inactive list 中。
如果系統(tǒng)的 inactive 的內(nèi)存過大,可以通過如下操作對(duì)其做回收。
sync; echo 3 /proc/sys/vm/drop_caches
3. 虛擬內(nèi)存
現(xiàn)代 x86 系統(tǒng),計(jì)算機(jī)能夠使用的內(nèi)存會(huì)大于其物理內(nèi)存的上限,依靠的就是虛擬內(nèi)存機(jī)制。Linux 支持虛擬內(nèi)存機(jī)制和實(shí)模式機(jī)制。
實(shí)模式下,計(jì)算機(jī)會(huì)直接申請(qǐng)物理內(nèi)存,虛擬內(nèi)存機(jī)制下,系統(tǒng)會(huì)把磁盤當(dāng)成內(nèi)存的擴(kuò)展,已增加可使用的內(nèi)存大小。并通過映射 map 的機(jī)制,來保存和物理內(nèi)存的真實(shí)對(duì)應(yīng)關(guān)系。
在磁盤和內(nèi)存之間傳送 Page 的活動(dòng)叫做 swapping 或者頁面調(diào)度 (paging),被用作虛擬內(nèi)存的磁盤分區(qū)稱為 swap。
可以通過在線添加 swap 的方式臨時(shí)緩解內(nèi)存不足的問題,但一般不能直接作在線減少 swap 的操作,很有可能導(dǎo)致進(jìn)程的 crash。具體 swap 配置方式見 5.1swap 相關(guān)配置。
4. OOM
1.What is OOM?
Out Of Memory Killer 是 Linux 的一種系統(tǒng)保護(hù)機(jī)制,在系統(tǒng)內(nèi)存緊張時(shí),kill 掉某些進(jìn)程防止系統(tǒng)卡死。系統(tǒng)通過打分機(jī)制,來實(shí)施對(duì)進(jìn)程的殺死操作。默認(rèn)機(jī)制是通過掃描所有進(jìn)程的內(nèi)存占用,cpu 占用等因素,然后打分??(badness),分?jǐn)?shù)越高,進(jìn)程被 kill 的優(yōu)先級(jí)就越高。
2. 哪些行為會(huì)讓系統(tǒng)對(duì)進(jìn)程進(jìn)行打分?
進(jìn)程使用 fork(2) 調(diào)用,創(chuàng)建眾多子進(jìn)程時(shí),會(huì)加分 (+)
進(jìn)程已經(jīng)運(yùn)行了很長時(shí)間,或者和使用了大量的 CPU 時(shí)間,會(huì)減分 (-)
進(jìn)程的 nice 值如果比較低,會(huì)加分 (+)
進(jìn)程如果是特權(quán)進(jìn)程(privileged), 會(huì)減分 (-)
進(jìn)程如果對(duì)硬件設(shè)備進(jìn)行直接訪問,會(huì)減分 (-)
3. 在哪兒可以看到進(jìn)程的打分?
/proc/ pid /oom_score
4. 手動(dòng)調(diào)整分?jǐn)?shù)
/proc//oom_adj 該文件可以用于調(diào)整在 oom 發(fā)生時(shí),哪些進(jìn)程應(yīng)該被 kill,范圍 -16 — +15,默認(rèn)值為 0,
特殊值 -17:表示進(jìn)程永遠(yuǎn)不會(huì)被 kill。
5. 我怎么知道系統(tǒng)有沒有觸發(fā)過 OOM?
/var/log/messages、/var/log/syslog 系統(tǒng)日志或者 dmesg 系統(tǒng)日志診斷工具等都能夠找到
5. 內(nèi)存相關(guān)配置
5.1 swap 相關(guān)配置
通過調(diào)節(jié)系統(tǒng)參數(shù),來告訴計(jì)算機(jī)使用 swap 分區(qū)的權(quán)重
1. 簡介
swappiness 范圍 0 -100,默認(rèn) 60
0: 表示禁止使用 swap
60: 默認(rèn)
100: 瘋狂使用 swap
2. 操作方法
# sysctl vm.swappiness=VALUE
# sysctl vm.swappiness=20
# echo VALUE /proc/sys/vm/swappiness
# echo 30 /proc/sys/vm/swappiness
通過在線增加 swap 分區(qū)大小,臨時(shí)控制內(nèi)存泄露,內(nèi)存不夠用等異常。
1. 需要 root 用戶
2. 創(chuàng)建存儲(chǔ)文件
# dd if=/dev/zero of=/home/swap2G bs=1024 count=2M
3. 安全設(shè)置
# chown root:root /home/swap2G
# chmod 0600 /home/swap2G
4. 創(chuàng)建 liunx 交換分區(qū)
# mkswap /home/swap2G
5. enable 交換分區(qū)
# swapon /home/swap2G
6. 更新 fstab 文件【注意: 部分操作系統(tǒng)不需要】# vim /etc/fstab
/home/swap2G none swap sw 0 0
7. 檢查是否生效
#free -m
8. 卸載 swap 分區(qū)
# swapoff /home/swap2G
5.2 緩存相關(guān)
sync; echo 3 /proc/sys/vm/drop_caches
0: 不釋放
1: 釋放頁緩存
2: 釋放 dentries 和 inodes
3: 釋放所有緩存
5.3 OOM 相關(guān)
vm.panic_on_oom
是否在觸發(fā) oom 機(jī)制時(shí)觸發(fā) kernel panic。0 表示關(guān)閉(推薦),1 表示打開。kernel panic 是指計(jì)算機(jī)遇到了致命的錯(cuò)誤,并且他不知道該怎么處理時(shí)的一種動(dòng)作——可以類比 windows 的藍(lán)屏。我們當(dāng)然不希望每次計(jì)算機(jī)在 oom 時(shí)就直接藍(lán)屏。推薦設(shè)置為 0
vm.overcommit_kbytes:
用于限制進(jìn)程能夠申請(qǐng)的最大內(nèi)存,0 表示不設(shè)置,如果設(shè)置其他數(shù)值,比如 400,則進(jìn)程能夠申請(qǐng)到的最大內(nèi)存為 swap+400kBytes
vm.overcommit_ratio:
定義了進(jìn)程可以使用的最大內(nèi)存(百分比模式),默認(rèn)為 50。表示配置 50 之后,進(jìn)程不允許申請(qǐng)超過 swap + 50% * 物理內(nèi)存總量 以上的內(nèi)存
vm.oom_kill_allocating_task (Linux 2.6.24+ 支持)
這在內(nèi)存不足的情況下啟用或禁用殺死 OOM 觸發(fā)任務(wù)。0 表示禁用(默認(rèn)),1 表示啟用。可以理解為 oom 機(jī)制的開關(guān),默認(rèn)為禁用——表示要讓 oom 觸發(fā)器正常執(zhí)行。
其他有興趣的話,可以自行 man proc
感謝各位的閱讀,以上就是“Linux 內(nèi)存基礎(chǔ)知識(shí)點(diǎn)有哪些”的內(nèi)容了,經(jīng)過本文的學(xué)習(xí)后,相信大家對(duì) Linux 內(nèi)存基礎(chǔ)知識(shí)點(diǎn)有哪些這一問題有了更深刻的體會(huì),具體使用情況還需要大家實(shí)踐驗(yàn)證。這里是丸趣 TV,丸趣 TV 小編將為大家推送更多相關(guān)知識(shí)點(diǎn)的文章,歡迎關(guān)注!