Linux內存管理機制說明

Linux內存管理

內核態和用戶態

在這裏插入圖片描述linux的體系架構,從宏觀來看分爲 內核態和用戶態

  • 內核態:本質是一組操作系統的程序,操作計算硬件資源,如CPU、內存、IO等資源和設備。併爲上層應用程序提供接口等服務調用。
  • 用戶態:應用程序活動空間。應用程序的執行以來內核提供的資源。應用程序通過系統調用訪問內核空間程序。以此來操作系統的資源。用戶應用程序一般通過三種方式訪問內核資源:系統調用、系統庫函數、shell程序。

用戶態和內核態的切換:

  • 系統調用
  • 異常事件: 當CPU正在執行運行在用戶態的程序時,突然發生某些預先不可知的異常事件,這個時候就會觸發從當前用戶態執行的進程轉向內核態執行相關的異常事件,典型的如缺頁異常
  • 外部設備調用:外設直接發出中斷命令,通過中斷信號跳轉至內核狀態執行。

系統調用的一般過程:
在這裏插入圖片描述
用戶態和內核態的知識架構圖整理:

在這裏插入圖片描述

linux內存管理

內存分類

linux內存類型分類有物理內存和虛擬內存

  • 物理內存: 硬件實際內存大小
  • 虛擬內存:通過磁盤技術,將硬盤資源虛擬成內存資源,當物理內存不夠用時使用的。 在linux中用作虛擬內存的磁盤空間被稱爲交換空間(Swap Space)。

linux內存運行機制

在linux的內存分配機制中,優先使用物理內存,當物理內存還有空閒時(還夠用),== 不會釋放其佔用內存 ==,就算佔用內存的程序已經被關閉了,該程序所佔用的內存用來做緩存使用,對於開啓過的程序、或是讀取剛存取過得數據會比較快。
可以理解就是儘可能的使用內存空間。實際上面的機制是linux的buffers/cache機制。

linux系統通過分頁的方式管理內存空間。 內存空間被劃分爲一系列連續的頁,當程序運行時,將程序數據加載到內存中運行。
程序運行結束之後,並不一定會立刻釋放內存,已加載的頁面一般通過“最近最少使用”算法管理,將不使用的頁cache到內存中。
所以通過top或free命令,查看內存管理的內存使用情況時,一直會發現內存使用量佔用的很高的狀態。因爲這個是cache原理纔會造成這個現象。而cache的空間通過內存管理,可以是被釋放和重用的。(至於哪些cache可以被釋放哪些不可以,後續再專門研究)

問題思考:
通過free查看物理內存還有很大空間,而swap空間也有使用的,這個是可能的原因?
1、某個時間執行了一個大程序或多個程序 ,系統內存不夠用,使用的虛擬內存swap空間。
2、程序運行結束,因爲cache機制,這些加載的頁面沒有被立刻換出內存空間,所以會佔用。
3、swap空間的使用量,統計的是歷史最大使用情況。 當swap空間在一段時間內頻繁變化時,這個就是系統內存使用不足了。

虛擬內存swap空間創建步驟

1.檢查swap文件是否存在,返回空則不存在
swapon -s
2.查看文件系統,檢查空間是否足夠創建swap
df -hal
3.創建一個swap目錄
mkdir /swap
4.創建並允許swap文件
dd if=/dev/zero of=/swap/swapfile bs=1024 count=4096000
5.格式化swap文件
mkswap -f /swap/swapfile
6.激活swap
swapon /swap/swapfile
7.設置開機啓動(vim 打開 /etc/fstab)
/swap/swapfile           swap                    swap    defaults        0 0
8.賦予Swap文件適當的權限
chown root:root /tmp/swapfile
chmod 600 /tmp/swapfile
9.查看swappiness權重(swappiness=0 的時候表示最大限度使用物理內存,然後纔是 Swap 空間,swappiness=100 的時候表示積極的使用 Swap 分區,並且把內存上的數據及時的搬運到 Swap 空間裏面。)
cat /proc/sys/vm/swappiness
10.臨時修改swappiness
sysctl vm.swappiness=10
11.要永久設置修改swappiness
vim /etc/sysctl.conf
12.在這個文檔的最後加上這樣一行
# Search for the vm.swappiness setting.  Uncomment and change it as necessary.
vm.swappiness=10
13.查看內存使用情況

swap空間一般分配的大小
根據swap空間使用原理,其實swap分配大小爲內存的2倍的黃金法則,在現代計算機可能不適用了。 因爲現在計算機的RAM大小可達到128GB等等的。
根據系統主要的使用情況動態調整纔是最好的。
網絡上整理了一些建議:
可以做參考,並非一定要這麼做。
如果根據Red Hat的建議,他們建議是分配RAM 20%的換空間,也就是RAM是8GB,分配1.6GB交換空間。

CentOS建議

如果RAM小於2GB,就分配和RAM同等大小的Swap交換空間。
如果RAM大於2GB,就分配2GB交換空間

Ubuntu考慮到系統需要休眠,

如果RAM小於1GB,Swap空間至少要和RAM一樣大,甚至是要爲RAM的兩倍大小
如果RAM大於1GB,Swap交換空間應該至少等於RAM大小的平方根,並且最多爲RAM大小的兩倍
如果要休眠,Swap交換大小應該等於RAM的大小加上RAM大小的平方根

內存使用量查看和監控

free命令

free -m
free -m 以MB來查看當前內存的使用情況

[root@~]# free -m
             total       used       free     shared    buffers     cached
Mem:         15947      15770        177          0        172       8884
-/+ buffers/cache:       6712       9234
Swap:        15999       4469      11530

說明:

  • 從內核管理的角度來看
    第一行MEM
    這一行代表從內核管理的角度來看
    total:物理內存大小
    used: 當前已使用的內存。其實這些已使用的包含緩存的佔用。當內存不足時,可逐漸將緩存佔用的內存轉變爲系統可用的。
    free: 剩餘的內存大小。 不包括buffers和cached的。
    在linux系統中看MEM這一行,used的量一直都會很高,因爲有buffers和cached機制,其內存使用是儘可能的使用。而實際上並不是物理硬件的內存不足,當需要使用的時候,操作系統會將buffers和cached的值,轉變至運行時應用程序所需要的內存的。

  • 從用戶應用角度看
    第二行 == -/+ buffers/cache: ==
    used: 已使用
    free:剩餘的可使用的
    可以看到: 第二行的free 9234 = 第一行的free + buffers + cached.。
    實際從用戶的角度來看,運行的應用程序使用的buffers/cache爲used 6712M,空閒可以被新的應用程序可用的爲9234M。
    所以,可以簡單理解爲當前可用的內存空間還有9234M

  • swap空間
    swap空間使用情況,表明當前歷史最高使用量,一般不會主動回縮。

持續監控

free -m s2 每個2秒執行一次,持續監控系統整體內存使用情況
watch -n 2 -d free -m 通過watch持續觀察

watch說明:
-n : 每隔2秒鐘執行一次
-d:高亮顯示與前一次的不同
watch命令會每兩秒執行 free -m 一次,執行前會清除屏幕,在同樣位置顯示數據。因爲 watch命令不會捲動屏幕,所以適合出長時間的監測內存使用率。可以使用 -n選項,控制執行的頻率;也可以利用 -d選項,讓命令將每次不同的地方顯示出來。Watch命令會一直執行,直到您按下 [Ctrl]-[C] 爲止。

通過top命令查看

top
top
然後執行命令 shift +m 按照RES常駐內存排序

在這裏插入圖片描述關於命令的一些說明:
MEM行和SWAP行,顯示 內存的整體使用情況,這裏的顯示其實是從內核角度查看的。所以會看到使用量非常高。而實際可使用的應該是MEM free+MEM buffers+ swap cached是當前系統的可用內存
shift+m 命令: 以RES列進行從大到小排序。查看整體內存使用情況。

選項說明 :
PID — 進程id
USER — 進程所有者
PR — 進程優先級
NI — nice值。負值表示高優先級,正值表示低優先級
VIRT — 進程使用的虛擬內存總量,單位kb。VIRT=SWAP+RES
RES — 進程使用的、未被換出的物理內存大小,單位kb。RES=CODE+DATA
SHR — 共享內存大小,單位kb
S — 進程狀態。D=不可中斷的睡眠狀態 R=運行 S=睡眠 T=跟蹤/停止 Z=殭屍進程
%CPU — 上次更新到現在的CPU時間佔用百分比
%MEM — 進程使用的物理內存百分比
TIME+ — 進程使用的CPU時間總計,單位1/100秒
COMMAND — 進程名稱(命令名/命令行)

vmstat命令

vmstat 2 5

[root@~]# vmstat 2 5
procs -----------memory---------- ---swap-- -----io---- --system-- -----cpu-----
 r  b   swpd   free   buff  cache   si   so    bi    bo   in   cs us sy id wa st
 0  0 4563528 695732 152720 8589700   19    5   140    37    0    0  3  0 96  1  0
 0  0 4563528 695964 152720 8589716    0    0  1000    58 2827 5514  1  0 99  0  0
 0  0 4563528 695980 152728 8589760    0    0  1000    86 2692 5205  1  0 99  0  0
 0  0 4563528 695864 152736 8589908    0    0  1000    68 2635 5102  1  0 99  0  0
 0  0 4563528 695740 152752 8589940    0    0  1002   148 2770 5236  1  1 98  0  0

通過vmstat查看虛擬使用的情況。默認以字節爲單位。

字段說明:
Procs(進程):
r: 運行隊列中進程數量
b: 等待IO的進程數量

Memory(內存):
swpd: 使用虛擬內存大小
free: 可用內存大小
buff: 用作緩衝的內存大小
cache: 用作緩存的內存大小

Swap:
si: 每秒從交換區寫到內存的大小。如果 這個值大於0,則表示物理內存不夠了。
so: 每秒寫入交換區的內存大小。

IO:(現在的Linux版本塊的大小爲1024bytes)
bi: 每秒讀取的塊數
bo: 每秒寫入的塊數

系統:
in: 每秒中斷數,包括時鐘中斷。【interrupt】
cs: 每秒上下文切換數。 【count/second】

CPU(以百分比表示):
us: 用戶進程執行時間(user time)
sy: 系統進程執行時間(system time)
id: 空閒時間(包括IO等待時間),中央處理器的空閒時間 。以百分比表示。
wa: 等待IO時間

備註:
如果r經常大於4,id經常少於40,表示cpu的負荷很重。
如果bi,bo長期不等於0,表示內存不足。
如果disk經常不等於0,且在b中的隊列大於3,表示io性能不好。

Linux在具有高穩定性、可靠性的同時,具有很好的可伸縮性和擴展性,能夠針對不同的應用和硬件環境調整,優化出滿足當前應用需要的最佳性能。因此企業在維護Linux系統、進行系統調優時,瞭解系統性能分析工具是至關重要的。

顯示活躍和非活躍內存
vmstat -a 2 5 -a 顯示活躍和非活躍內存,所顯示的內容除增加inact和active

ps命令查看進程使用

ps命令查看 內存使用情況

常駐內存VSZ使用情況:
ps aux|head -1;ps|grep -v PID|sort -rn -k 5|head

[root@ ~]# ps aux|head -1;ps|grep -v PID|sort -rn -k 5|head 
USER       PID %CPU %MEM    VSZ   RSS TTY      STAT START   TIME COMMAND
32322 pts/0    00:00:00 bash
22584 pts/0    00:00:00 head
22583 pts/0    00:00:00 sort
22582 pts/0    00:00:00 grep
22581 pts/0    00:00:00 ps

按照內存RSS使用情況:
ps aux|head -1;ps|grep -v PID|sort -rn -k 6|head

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章