tft每日頭條

 > 科技

 > linux系統内存參數

linux系統内存參數

科技 更新时间:2024-08-31 17:24:39

簡介: Linux系統診斷-内存基礎

1. 背景

談及linux内存,很多時候,我們會關注free,top等基礎命令。當系統遇到異常情況時,内存問題的根因追溯,現場診斷時,缺乏深層次的debug能力。本篇幅不做深層讨論,能把當前系統的問題描述清楚,是每個SRE應該具備的最基礎能力。

2. free

2.1 free命令原理

free是通過查看 /proc/meminfo 來獲取内存的使用情況。但是 /proc/meminfo 這個文件又是怎麼來的?我們先了解下 /proc 目錄:

  • /proc 是一個虛拟文件系統,該目錄下的所有文件都是僞文件,該類文件隻存在于内存中,并不占用空間——使用 du -sh 即可驗證,該模具路下的磁盤占用都是0。
  • /proc 下的所有文件都是内核調用proc_create() 接口來創建的虛拟條目。
  • /proc 中的文件,大多反饋系統信息的實時情況(進程、内存、cpu、設備信息等)。

結論: /proc/meminfo 是 /proc 文件系統下保存你内存相關信息的"僞文件"。

2.2 命令輸出簡介

每個發行版輸出都有一定差異,我們以debian8 4.19.x發行版為例。

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: 已使用的内存 used = total - free -buffers -cached
  • free: 未使用的内存 memFree & swapFree in /proc/meminfo
  • shared: tmpfs使用的内存 shmem in /proc/meminfo
  • buffers:被内核緩沖去使用的内存
  • cached: 被頁緩存和slabs使用的内存
  • buffers/cache: 表示buffers和cache的總和
  • swap: 交換分區的使用量

2.3 buffer和cache會使用内存嗎?

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

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

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

總之,buffer和cache使用的内存都是用來加速Linux讀寫性能,如果有新的進程需要内存,系統會将buffer和cache占用的内存回收,并重新分配給進程使用。

2.4 其他内存概念

RSS & VSZ & PSS & USS

  • RSS(Resident Set Size):進程實際使用的物理内存大小,包括sharedMem。
  • VSZ(Virtual Memory Size):進程所有能夠訪問到的内存大小,包括因為缺頁中斷,被swap出去的内存大小,以及sharedMem。
  • PSS(Proportional Set Size):按照比例将内存的大小加到RSS中。
  • USS(Unique Set Size):進程獨占的物理内存大小。

usedMem分為 active & inactive

  • active:表示這部分的内存正在被某個特定的進程使用,不太可能被收回。
  • inactive:表示這部分内存是被分配到某個不在running狀态的進程,有可能會被回收。

Linux會維護一個LRU List用來管理活動頁和非活動頁的回收。 簡單講, 越接近該List的末尾,該頁面被回收的概率就越大,反之,越接近列首,則更不易被回收。 linux内核會維護兩類LRUList——active list和inactive list,剛訪問過的頁面放入active list,長時間未訪問的頁面放入inactive list,内核線程kswapd會定期将active list中的頁面移至 inactive list中。

如果系統的inactive的内存過大,可以通過如下操作對其做回收。sync; echo 3 > /proc/sys/vm/drop_caches

3. 虛拟内存

現代x86系統,計算機能夠使用的内存會大于其物理内存的上限,依靠的就是虛拟内存機制。Linux支持虛拟内存機制和實模式機制。

實模式下,計算機會直接申請物理内存, 虛拟内存機制下,系統會把磁盤當成内存的擴展,已增加可使用的内存大小。并通過映射map的機制,來保存和物理内存的真實對應關系。

在磁盤和内存之間傳送Page的活動叫做swapping或者頁面調度(paging),被用作虛拟内存的磁盤分區稱為swap。

可以通過在線添加swap的方式臨時緩解内存不足的問題,但一般不能直接作在線減少swap的操作,很有可能導緻進程的crash。具體swap配置方式見5.1swap相關配置。

4. OOM

1.What is OOM?Out Of Memory killer 是 Linux 的一種系統保護機制,在系統内存緊張時,kill掉某些進程防止系統卡死。系統通過打分機制,來實施對進程的殺死操作。默認機制是通過掃描所有進程的内存占用,cpu占用等因素,然後打分  (badness),分數越高,進程被kill的優先級就越高。

2.哪些行為會讓系統對進程進行打分?

  • 進程使用fork(2)調用,創建衆多子進程時,會加分( )
  • 進程已經運行了很長時間,或者和使用了大量的CPU時間,會減分(-)
  • 進程的nice值如果比較低,會加分( )
  • 進程如果是特權進程(privileged),會減分(-)
  • 進程如果對硬件設備進行直接訪問,會減分(-)

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

4.手動調整分數/proc//oom_adj 該文件可以用于調整在oom發生時,哪些進程應該被kill,範圍-16 -- 15 ,默認值為0,  

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

5.我怎麼知道系統有沒有觸發過OOM?/var/log/messages 、 /var/log/syslog 系統日志或者 dmesg 系統日志診斷工具等都能夠找到網圖如下:

linux系統内存參數(Linux系統診斷-内存基礎)1

5. 内存相關配置

5.1 swap相關配置

  • 通過調節系統參數,來告訴計算機使用swap分區的權重

1. 簡介 swappiness範圍0-100,默認60 0: 表示禁止使用swap 60: 默認 100: 瘋狂使用swap 2. 操作方法 # sysctl vm.swappiness=VALUE # sysctl vm.swappiness=20 或者 # echo VALUE > /proc/sys/vm/swappiness # echo 30 > /proc/sys/vm/swappiness

  • 通過在線增加swap分區大小,臨時控制内存洩露,内存不夠用等異常。

1. 需要root用戶 2. 創建存儲文件 # dd if=/dev/zero of=/home/swap2G bs=1024 count=2M 3. 安全設置 # chown root:root /home/swap2G # chmod 0600 /home/swap2G 4. 創建liunx交換分區 # mkswap /home/swap2G 5. enable 交換分區 # swapon /home/swap2G 6. 更新fstab文件【注意: 部分操作系統不需要】 # vim /etc/fstab /home/swap2G none swap sw 0 0 7. 檢查是否生效 #free -m 8. 卸載swap分區 # swapoff /home/swap2G

5.2 緩存相關

sync; echo 3 > /proc/sys/vm/drop_caches 0:不釋放 1:釋放頁緩存 2:釋放 dentries 和 inodes 3:釋放所有緩存

5.3 OOM相關

  • vm.panic_on_oom
  • 是否在觸發 oom 機制時觸發 kernel panic。0表示關閉(推薦),1表示打開。 kernel panic是指計算機遇到了緻命的錯誤,并且他不知道該怎麼處理時的一種動作——可以類比windows的藍屏。 我們當然不希望每次計算機在oom時就直接藍屏。推薦設置為0
  • vm.overcommit_kbytes:
  • 用于限制進程能夠申請的最大内存,0表示不設置,如果設置其他數值,比如400,則進程能夠申請到的最大内存為 swap 400kBytes
  • vm.overcommit_ratio:
  • 定義了進程可以使用的最大内存(百分比模式),默認為50。表示配置50之後,進程不允許申請超過 swap 50% * 物理内存總量 以上的内存
  • vm.oom_kill_allocating_task (Linux 2.6.24 支持)
  • 這在内存不足的情況下啟用或禁用殺死OOM觸發任務。0表示禁用(默認),1表示啟用。可以理解為oom機制的開關,默認為禁用——表示要讓oom觸發器正常執行。
  • 其他有興趣的話,可以自行man proc

6. 結語

如有纰漏歡迎指正。

作者:SRE團隊技術小編-小淩

本文為阿裡雲原創内容,未經允許不得轉載

,

更多精彩资讯请关注tft每日頭條,我们将持续为您更新最新资讯!

查看全部

相关科技资讯推荐

热门科技资讯推荐

网友关注

Copyright 2023-2024 - www.tftnews.com All Rights Reserved