CPU 管理一樣,內(nèi)存管理也是操作系統(tǒng)最核心的功能之一。內(nèi)存主要用來(lái)存儲(chǔ)系統(tǒng)和應(yīng) 用程序的指令、數(shù)據(jù)、緩存等。
1.內(nèi)存原理
1.1.內(nèi)存映射
1.1.1.日常生活常說(shuō)的內(nèi)存是什么?
- 我的筆記本電腦內(nèi)存就是 8GB 的
- 這個(gè)內(nèi)存其實(shí)是物理內(nèi)存
- 物理內(nèi)存也稱(chēng)為主存,大多數(shù)計(jì)算機(jī)用的主存都是動(dòng)態(tài)隨機(jī)訪問(wèn)內(nèi)存(DRAM)
1.1.2.虛擬地址空間
Linux 內(nèi)核給每個(gè)進(jìn)程都提供了一個(gè)獨(dú)立的虛擬地址空間,并且這個(gè)地址空間是連續(xù)的。 這樣,進(jìn)程就可以很方便地訪問(wèn)內(nèi)存,更確切地說(shuō)是訪問(wèn)虛擬內(nèi)存。
虛擬地址空間內(nèi)部
- 虛擬地址空間的內(nèi)部又被分為內(nèi)核空間和用戶(hù)空間兩部分
- 不同字長(zhǎng)(單個(gè) CPU 指令可以處理數(shù)據(jù)的最大長(zhǎng)度)的處理器,地址空間的范圍也不同
比如最常見(jiàn)的 32 位和 64 位,如下所示:
- 32 位系統(tǒng)的內(nèi)核空間占用 1G,位于最高處,剩下的 3G 是用戶(hù)空間
- 而 64 位系統(tǒng)的內(nèi)核空間和用戶(hù)空間都是 128T,分別占據(jù)整個(gè)內(nèi)存空間的最高和最低處,剩下的中間部分是未定義的
1.1.3.進(jìn)程的用戶(hù)態(tài)和內(nèi)核態(tài)
進(jìn)程在用戶(hù)態(tài)時(shí),只能訪問(wèn)用戶(hù)空間內(nèi)存;只有進(jìn)入內(nèi)核態(tài)后,才可以訪問(wèn)內(nèi)核空間內(nèi)存。雖然每個(gè)進(jìn)程的地址空間都包含了內(nèi)核空間,但這些內(nèi)核空間,其實(shí)關(guān)聯(lián)的都是相同的物理內(nèi)存。這樣,進(jìn)程切換到內(nèi)核態(tài)后,就可以很方便地訪問(wèn)內(nèi)核空間內(nèi)存。
1.1.4.內(nèi)存映射
既然每個(gè)進(jìn)程都有一個(gè)這么大的地址空間,那么所有進(jìn)程的虛擬內(nèi)存加起來(lái),自然要比實(shí)際的物理內(nèi)存大得多。
所以,并不是所有的虛擬內(nèi)存都會(huì)分配物理內(nèi)存,只有那些實(shí)際使用的虛擬內(nèi)存才分配物理內(nèi)存,并且分配后的物理內(nèi)存,是通過(guò)內(nèi)存映射來(lái)管理的。
內(nèi)存映射,其實(shí)就是將虛擬內(nèi)存地址映射到物理內(nèi)存地址。為了完成內(nèi)存映射,內(nèi)核為每個(gè)進(jìn)程都維護(hù)了一張頁(yè)
表,記錄虛擬地址與物理地址的映射關(guān)系,如下圖所示:
- 頁(yè)表實(shí)際上存儲(chǔ)在 CPU 的內(nèi)存管理單元 MMU 中
- 正常情況下,處理器就可以直接通過(guò)硬件,找出要訪問(wèn)的內(nèi)存
- 在頁(yè)表的映射下,進(jìn)程就可以通過(guò)虛擬地址來(lái)訪問(wèn)物理內(nèi)存了
1.2.虛擬內(nèi)存空間分布
以 32 位系統(tǒng)為例,如下圖所示:
通過(guò)這張圖你可以看到,用戶(hù)空間內(nèi)存,從低到高分別是五種不同的內(nèi)存段。
- 只讀段,包括代碼和常量等;
- 數(shù)據(jù)段,包括全局變量等;
- 堆,包括動(dòng)態(tài)分配的內(nèi)存,從低地址開(kāi)始向上增長(zhǎng);
- 文件映射段,包括動(dòng)態(tài)庫(kù)、共享內(nèi)存等,從高地址開(kāi)始向下增長(zhǎng);
- 棧,包括局部變量和函數(shù)調(diào)用的上下文等。棧的大小是固定的,一般是 8MB
在這五個(gè)內(nèi)存段中,堆和文件映射段的內(nèi)存是動(dòng)態(tài)分配的。
1.3 SWAP運(yùn)行原理
Swap 是把一塊磁盤(pán)空間或者一個(gè)本地文件,當(dāng)成內(nèi)存來(lái)使用。它包括換出和換入兩個(gè)過(guò)程。
- 換出,就是把進(jìn)程暫時(shí)不用的內(nèi)存數(shù)據(jù)存儲(chǔ)到磁盤(pán)中,并釋放這些數(shù)據(jù)占用的內(nèi)存。
- 換入,則是在進(jìn)程再次訪問(wèn)這些內(nèi)存的時(shí)候,把它們從磁盤(pán)讀到內(nèi)存中來(lái)。
一個(gè)很典型的場(chǎng)景就是,即使內(nèi)存不足時(shí),有些應(yīng)用程序也并不想被 OOM 殺死,而是希望能緩一段時(shí)間,等待人工介入,或者等系統(tǒng)自動(dòng)釋放其他進(jìn)程的內(nèi)存,再分配給它。除此之外,我們常見(jiàn)的筆記本電腦的休眠和快速開(kāi)機(jī)的功能,也基于 Swap 。休眠時(shí),把系統(tǒng)的內(nèi)存存入磁盤(pán),這樣等到再次開(kāi)機(jī)時(shí),只要從磁盤(pán)中加載內(nèi)存就可以這樣就省去了很多應(yīng)用程序的初始化過(guò)程,加快了開(kāi)機(jī)速度。話說(shuō)回來(lái),既然 Swap 是為了回收內(nèi)存,那么** Linux**到底在什么時(shí)候需要回收內(nèi)存呢?前面一直在說(shuō)內(nèi)存資源緊張,又該怎么來(lái)衡量?jī)?nèi)存是不是緊張呢?
一個(gè)最容易想到的場(chǎng)景就是,有新的大塊內(nèi)存分配請(qǐng)求,但是剩余內(nèi)存不足。這個(gè)時(shí)候系統(tǒng)就需要回收一部分內(nèi)
存,進(jìn)而盡可能地滿足新內(nèi)存請(qǐng)求。這個(gè)過(guò)程通常被稱(chēng)為 直接內(nèi)存回收 。
除了直接內(nèi)存回收,還有一個(gè)專(zhuān)門(mén)的內(nèi)核線程用來(lái) 定期回收內(nèi)存 ,也就是 kswapd0。為了衡量?jī)?nèi)存的使用情況,
kswapd0 定義了三個(gè)內(nèi)存閾值(watermark,也稱(chēng)為水位),分別是頁(yè)最小閾值(pages_min)、頁(yè)低閾值
(pages_low)和頁(yè)高閾值(pages_high)。剩余內(nèi)存,則使用 pages_free 表示
kswapd0 定期掃描內(nèi)存的使用情況,并根據(jù)剩余內(nèi)存落在這三個(gè)閾值的空間位置,進(jìn)行內(nèi)存的回收操作。
- 剩余內(nèi)存小于頁(yè)最小閾值,說(shuō)明進(jìn)程可用內(nèi)存都耗盡了,只有內(nèi)核才可以分配內(nèi)存。
- 剩余內(nèi)存落在頁(yè)最小閾值和頁(yè)低閾值中間,說(shuō)明內(nèi)存壓力比較大,剩余內(nèi)存不多了。這時(shí) kswapd0 會(huì)執(zhí)行內(nèi)
存回收,直到剩余內(nèi)存大于高閾值為止。
- 剩余內(nèi)存落在頁(yè)低閾值和頁(yè)高閾值中間,說(shuō)明內(nèi)存有一定壓力,但還可以滿足新內(nèi)存請(qǐng)求。
- 剩余內(nèi)存大于頁(yè)高閾值,說(shuō)明剩余內(nèi)存比較多,沒(méi)有內(nèi)存壓力。
/proc/sys/vm/min_free_kbytes 來(lái)間接設(shè)置。min_free_kbytes 設(shè)置了頁(yè)最小閾值,而其他兩個(gè)閾值,都是根據(jù)頁(yè)最
小閾值計(jì)算生成的,計(jì)算方法如下 :
pages_low = pages_min*5/4
pages_high = pages_min*3/2
2.內(nèi)存性能統(tǒng)計(jì)信息
2.1.系統(tǒng)內(nèi)存使用量
2.2.1內(nèi)存的使用情況
顯示系統(tǒng)內(nèi)存情況
[root@centos7-2 ~]# free
total used free shared buff/cache available
Mem: 999720 550508 283544 6844 165668 279124
Swap: 2097148 0 2097148
所有數(shù)值默認(rèn)都是以字節(jié)(kb)為單位
- 第一行 Mem:物理內(nèi)存
- 第二行 Swap:交換分區(qū)
你可以看到,free 輸出的是一個(gè)表格,其中的數(shù)值都默認(rèn)以字節(jié)為單位。表格總共有兩行 六列,這兩行分別是物理
內(nèi)存 Mem 和交換分區(qū) Swap 的使用情況,而六列中,每列數(shù)據(jù) 的含義分別為:
- 第一列,total 是總內(nèi)存大小;
- 第二列,used 是已使用內(nèi)存的大小,包含了共享內(nèi)存;
- 第三列,free 是未使用內(nèi)存的大??;
- 第四列,shared 是共享內(nèi)存的大小;
- 第五列,buw /cache 是緩存和緩沖區(qū)的大??;
- 最后一列,available 是新進(jìn)程可用內(nèi)存的大小。
2.2.free命令參數(shù)
簡(jiǎn)寫(xiě) | 完成寫(xiě)法 | 作用 |
---|---|---|
-b | –bytes | 所有數(shù)值單位是bytes |
-k | –kibi | 所有數(shù)值單位是kb |
-m | –mebi | 所有數(shù)值單位是mb |
-g | –gibi | 所有數(shù)值單位是gb |
-h | –human | 人性化輸出 |
-W | –wide | 將buff和cache拆分為單獨(dú)的兩個(gè)列顯示 |
-C | –count | 統(tǒng)計(jì)次數(shù),默認(rèn)是1次 |
-l | –lohi | 顯示詳細(xì)的低內(nèi)存和高內(nèi)存統(tǒng)計(jì)信息 |
-S | –seconds | 每次統(tǒng)計(jì)數(shù)據(jù)間隔時(shí)間 |
-t | –total | 添加一行顯示數(shù)據(jù)總和 |
–help | ||
幫助文檔 | ||
-V | –version | 版本號(hào) |
舉例:
每隔 2s 輸出一次統(tǒng)計(jì)信息,總共輸出 2 次,并且人性化輸出所有數(shù)值
[root@centos7-2 ~]# free -h -c 2 -s 2
total used free shared buff/cache available
Mem: 976M 537M 276M 6.7M 161M 272M
Swap: 2.0G 0B 2.0G
total used free shared buff/cache available
Mem: 976M 537M 276M 6.7M 161M 272M
Swap: 2.0G 0B 2.0G
[root@centos7-2 ~]#
?
2.3.top指令
[root@centos7-2 ~]# top
top - 11:49:39 up 50 min, 1 user, load average: 0.12, 0.08, 0.06
Tasks: 104 total, 2 running, 102 sleeping, 0 stopped, 0 zombie
%Cpu(s): 0.2 us, 0.2 sy, 0.0 ni, 99.7 id, 0.0 wa, 0.0 hi, 0.0 si, 0.0 st
KiB Mem : 999720 total, 283960 free, 549672 used, 166088 buff/cache
KiB Swap: 2097148 total, 2097148 free, 0 used. 279848 avail Mem
PID USER PR NI VIRT RES SHR S %CPU %MEM TIME+ COMMAND
1554 root 20 0 157836 2180 1540 R 0.3 0.2 0:00.05 top
1 root 20 0 125248 3716 2508 S 0.0 0.4 0:02.84 systemd
2 root 20 0 0 0 0 S 0.0 0.0 0:00.01 kthreadd
3 root 20 0 0 0 0 S 0.0 0.0 0:00.02 ksoftirqd/0
5 root 0 -20 0 0 0 S 0.0 0.0 0:00.00 kworker/0:0H
6 root 20 0 0 0 0 S 0.0 0.0 0:00.00 kworker/u256:0
7 root rt 0 0 0 0 S 0.0 0.0 0:00.03 migration/0
8 root 20 0 0 0 0 S 0.0 0.0 0:00.00 rcu_bh
9 root 20 0 0 0 0 R 0.0 0.0 0:00.97 rcu_sched
10 root rt 0 0 0 0 S 0.0 0.0 0:00.07 watchdog/0
11 root rt 0 0 0 0 S 0.0 0.0 0:00.02 watchdog/1
12 root rt 0 0 0 0 S 0.0 0.0 0:00.01 migration/1
13 root 20 0 0 0 0 S 0.0 0.0 0:00.04 ksoftirqd/1
15 root 0 -20 0 0 0 S 0.0 0.0 0:00.00 kworker/1:0H
17 root 20 0 0 0 0 S 0.0 0.0 0:00.00 kdevtmpfs
18 root 0 -20 0 0 0 S 0.0 0.0 0:00.00 netns
19 root 20 0 0 0 0 S 0.0 0.0 0:00.00 khungtaskd
20 root 0 -20 0 0 0 S 0.0 0.0 0:00.00 writeback
21 root 0 -20 0 0 0 S 0.0 0.0 0:00.00 kintegrityd
22 root 0 -20 0 0 0 S 0.0 0.0 0:00.00 bioset
23 root 0 -20 0 0 0 S 0.0 0.0 0:00.00 kblockd
24 root 0 -20 0 0 0 S 0.0 0.0 0:00.00 md
第一行:輸出系統(tǒng)任務(wù)隊(duì)列信息
- 11:49:39:系統(tǒng)當(dāng)前時(shí)間
- up 50 min:系統(tǒng)開(kāi)機(jī)后到現(xiàn)在的總運(yùn)行時(shí)間
- 1 user:當(dāng)前登錄用戶(hù)數(shù)
- load average: 0.12, 0.08, 0.06:系統(tǒng)負(fù)載,系統(tǒng)運(yùn)行隊(duì)列的平均利用率,可認(rèn)為是可運(yùn)行進(jìn)程的平均數(shù);三個(gè)數(shù)值分別為 1分鐘、5分鐘、15分鐘前到現(xiàn)在的平均值
第二行:任務(wù)進(jìn)程信息
-
total
:系統(tǒng)全部進(jìn)程的數(shù)量 -
running
:運(yùn)行狀態(tài)的進(jìn)程數(shù)量 -
sleeping
:睡眠狀態(tài)的進(jìn)程數(shù)量 -
stoped
:停止?fàn)顟B(tài)的進(jìn)程數(shù)量 -
zombie
:僵尸進(jìn)程數(shù)量
第三行:CPU信息
-
us
:用戶(hù)空間占用CPU百分比 -
sy
:內(nèi)核空間占用CPU百分比 -
ni
:已調(diào)整優(yōu)先級(jí)的用戶(hù)進(jìn)程的CPU百分比 -
id
:空閑CPU百分比,越低說(shuō)明CPU使用率越高 -
wa
:等待IO完成的CPU百分比 -
hi
:處理硬件中斷的占用CPU百分比 -
si
:處理軟中斷占用CPU百分比 -
st
:虛擬機(jī)占用CPU百分比
第四行:物理內(nèi)存信息
以下內(nèi)存單位均為**MB **
- total:物理內(nèi)存總量
- free:空閑內(nèi)存總量
- used:使用中內(nèi)存總量
- buw /cache:用于內(nèi)核緩存的內(nèi)存量
第五行:交換區(qū)內(nèi)存信息
- total:交換區(qū)總量
- free:空閑交換區(qū)總量
- used:使用的交換區(qū)總量
- avail Mem:可用交換區(qū)總量
**注:**如果used
不斷在變化, 說(shuō)明內(nèi)核在不斷進(jìn)行內(nèi)存和swap的數(shù)據(jù)交換,說(shuō)明內(nèi)存真的不夠用了
進(jìn)行信息區(qū)
- PID:進(jìn)程號(hào)
- USER:運(yùn)行進(jìn)程的用戶(hù)
- PR:優(yōu)先級(jí)
- NI:nice值。負(fù)值表示高優(yōu)先級(jí),正值表示低優(yōu)先級(jí)
- **VIRT 是進(jìn)程虛擬內(nèi)存的大小,只要是進(jìn)程申請(qǐng)過(guò)的內(nèi)存,即便還沒(méi)有真正分配物理內(nèi)存,也會(huì)計(jì)算在內(nèi)。 **
- **RES 是常駐內(nèi)存的大小,也就是進(jìn)程實(shí)際使用的物理內(nèi)存大小,但不包括 Swap 和共享 內(nèi)存。 **
- **SHR 是共享內(nèi)存的大小,比如與其他進(jìn)程共同使用的共享內(nèi)存、加載的動(dòng)態(tài)鏈接庫(kù)以及 程序的代碼段等。 **
- S:進(jìn)程狀態(tài) (R運(yùn)行狀態(tài) S睡眠狀態(tài) D不可中斷狀態(tài) T跟蹤/停止 Z僵尸進(jìn)程)
- %CPU:CPU 使用率
- **%MEM:進(jìn)程使用武力內(nèi)存占系統(tǒng)總內(nèi)存的百分比 **
- TIME+:上次啟動(dòng)后至今的總運(yùn)行時(shí)間
- COMMAND:命令名or命令行
在查看 top
輸出時(shí),你還要注意兩點(diǎn)。
第一,虛擬內(nèi)存通常并不會(huì)全部分配物理內(nèi)存。從上面的輸出,你可以發(fā)現(xiàn)每個(gè)進(jìn)程的虛 擬內(nèi)存都比常駐內(nèi)存大得多
第二,共享內(nèi)存SHR
并不一定是共享的,比方說(shuō),程序的代碼段、非共享的動(dòng)態(tài)鏈接庫(kù),也都算在 SHR
里。當(dāng)然SHR也包括了進(jìn)程間真正共享的內(nèi)存。所以在計(jì)算多個(gè)進(jìn)程的內(nèi)存使用時(shí),不要把所有進(jìn)程的 SHR
直接相加得出結(jié)果。
2.4.緩存與緩沖區(qū)命中率
緩存是Buffer
和Cache
兩部分的總和Buffer
和 Cache
的設(shè)計(jì)目的,是為了提升系統(tǒng)的 I/O
性能。它們利用內(nèi)存充當(dāng)起慢速磁盤(pán)與快速 CPU
之間的橋梁,可以加速 I/O
的訪問(wèn)速度。Buffer
和 Cache
分別緩存的是對(duì)磁盤(pán)和文件系統(tǒng)的讀寫(xiě)數(shù)據(jù)。
[root@centos7-2 ~]# free
total used free shared buff/cache available
Mem: 999720 542500 291348 6876 165872 290028
Swap: 2097148 0 2097148
字面意思,Buffer是緩存區(qū),Cache 是緩存,兩者都是數(shù)據(jù)在內(nèi)存中的臨時(shí)存儲(chǔ)
2.4.1.Buffer 和 Cache 的區(qū)別
Buffer:內(nèi)核緩沖區(qū)用到的內(nèi)存,對(duì)應(yīng)的是 /proc/meminfo
中的Buffer值;
Cache: 內(nèi)核頁(yè)緩存和 Slab 用到的內(nèi)存,對(duì)應(yīng)的是 /proc/meminfo
中的 **Cached **與 Slab之和;
Buffer
- 對(duì)原始磁盤(pán)塊的臨時(shí)存儲(chǔ),也就是用來(lái)緩存磁盤(pán)的數(shù)據(jù),通常不會(huì)特別大(20MB左右)
- 內(nèi)核就可以把分散的寫(xiě)集中起來(lái),統(tǒng)一優(yōu)化磁盤(pán)的寫(xiě)入,比如可以把多次小的寫(xiě)合并成單次大的寫(xiě)等等
Cached
- 從磁盤(pán)讀取文件的頁(yè)緩存,也就是用來(lái)緩存從文件讀取的數(shù)據(jù)
- 下次訪問(wèn)這些文件數(shù)據(jù)時(shí),就可以直接從內(nèi)存中快速獲取,而不需要再次訪問(wèn)緩慢的磁盤(pán)。
2.4.2.proc 文件系統(tǒng)
-
/proc
是 Linux 內(nèi)核提供的一種特殊文件系統(tǒng),是用戶(hù)跟內(nèi)核交互的接口。比方說(shuō),用戶(hù)可以從/proc
中查詢(xún)內(nèi)核的運(yùn)行狀態(tài)和配置選項(xiàng),查詢(xún)進(jìn)程的運(yùn)行狀態(tài)、統(tǒng)計(jì)數(shù)據(jù)等,也可以通過(guò)/proc
來(lái)修改內(nèi)核的配置 - proc 文件系統(tǒng)同時(shí)也是很多性能工具的最終數(shù)據(jù)來(lái)源
2.4.3.緩沖命中率
緩存命中率,是指直接通過(guò)緩存獲取數(shù)據(jù)的請(qǐng)求次數(shù),占所有數(shù)據(jù)請(qǐng)求次數(shù)的百分比。
命中率越高,表示使用緩存帶來(lái)的收益越高,應(yīng)用程序的性能也就越好。
下面是查看系統(tǒng)緩存命中情況的工具:
-
cachestat
提供了整個(gè)操作系統(tǒng)緩存的讀寫(xiě)命中情況。 -
cachetop
提供了每個(gè)進(jìn)程的緩存命中情況。
$ cachestat 1 3
TOTAL MISSES HITS DIRTIES BUFFERS_MB CACHED_MB
2 0 2 1 17 279
2 0 2 1 17 279
2 0 2 1 17 279
-
TOTAL
:表示總的I/O
次數(shù); -
MISSES
:表示緩存未命中的次數(shù); -
HITS
:表示緩存命中的次數(shù); -
DIRTIES
:表示新增到緩存中的臟頁(yè)數(shù); -
BUFFERS_MB
:表示Buffers
的大小,以 MB 為單位; -
CACHED_MB
:表示Cache
的大小,以 MB 為單位。
$ cachetop
11:58:50 Buffers MB: 258 / Cached MB: 347 / Sort: HITS / Order: ascending
PID UID CMD HITS MISSES DIRTIES READ_HIT% WRITE_HIT%
13029 root python 1 0 0 100.0% 0.0%
它的輸出跟 top
類(lèi)似,默認(rèn)按照緩存的命中次數(shù)(HITS)排序,展示了每個(gè)進(jìn)程的緩存命中情況。具體到每一個(gè)指標(biāo),這里的 HITS
、MISSES
和 DIRTIES
,跟 cachestat
里的含義一樣,分別代表間隔時(shí)間內(nèi)的緩存命中次數(shù)、未命中次數(shù)以及新增到緩存中的臟頁(yè)數(shù)。
3.性能分析
首先,你最容易想到的是 系統(tǒng)內(nèi)存使用情況 ,比如已用內(nèi)存、剩余內(nèi)存、共享內(nèi)存、可用內(nèi)存、緩存和緩沖區(qū)的用量等。
- 已用內(nèi)存和剩余內(nèi)存很容易理解,就是已經(jīng)使用和還未使用的內(nèi)存;
- 共享內(nèi)存是通過(guò)
tmpfs
(內(nèi)存的文件系統(tǒng) )實(shí)現(xiàn)的所以它的大小也就是tmpfs
使用的內(nèi)存大小。tmpfs
其實(shí)也是一種特殊的緩存; - 可用內(nèi)存是新進(jìn)程可以使用的最大內(nèi)存,它包括剩余內(nèi)存和可回收緩存;
- 緩存包括兩部分,一部分是磁盤(pán)讀取文件的頁(yè)緩存,用來(lái)緩存從磁盤(pán)讀取的數(shù)據(jù),可以加快以后再次訪問(wèn)的速度。另一部分,則是
Slab
分配器中的可回收內(nèi)存; - 緩沖區(qū)是對(duì)原始磁盤(pán)塊的臨時(shí)存儲(chǔ),用來(lái)緩存將要寫(xiě)入磁盤(pán)的數(shù)據(jù)。這樣內(nèi)核就可以把分散的寫(xiě)集中起來(lái),統(tǒng)一優(yōu)化磁盤(pán)寫(xiě)入。
第二類(lèi)很容易想到的,應(yīng)該是 進(jìn)程內(nèi)存使用情況,比如進(jìn)程的虛擬內(nèi)存、常駐內(nèi)存、共享內(nèi)存以及Swap
內(nèi)存等。
- 虛擬內(nèi)存,包括了進(jìn)程代碼段、數(shù)據(jù)段、共享內(nèi)存、已經(jīng)申請(qǐng)的堆內(nèi)存和已經(jīng)換出的內(nèi)存等。這里要注意,已經(jīng)申請(qǐng)的內(nèi)存,即使還沒(méi)有分配物理內(nèi)存,也算作虛擬內(nèi)存;
- 常駐內(nèi)存是進(jìn)程實(shí)際使用的物理內(nèi)存,不過(guò),它不包括 Swap 和共享內(nèi)存;
- 共享內(nèi)存,既包括與其他進(jìn)程共同使用的真實(shí)的共享內(nèi)存,還包括了加載的動(dòng)態(tài)鏈接庫(kù)以及程序的代碼段等;
-
Swap
內(nèi)存,是指通過(guò)Swap
換出到磁盤(pán)的內(nèi)存。
第三類(lèi) 缺頁(yè)異常 ,系統(tǒng)調(diào)用內(nèi)存分配請(qǐng)求后,并不會(huì)立刻為其分配物理內(nèi)存,而是在請(qǐng)求首次訪問(wèn)時(shí),通過(guò)缺頁(yè)異常來(lái)分配。缺頁(yè)異常又分為下面兩種場(chǎng)景。
- 可以直接從物理內(nèi)存中分配時(shí),被稱(chēng)為次缺頁(yè)異常。
- 需要磁盤(pán)
I/O
介入(比如Swap
)時(shí),被稱(chēng)為主缺頁(yè)異常。
第四類(lèi)重要指標(biāo)就是** Swap的使用情況** ,比如 Swap
的已用空間、剩余空間、換入速度和換出速度等。
- 已用空間和剩余空間很好理解,就是字面上的意思,已經(jīng)使用和沒(méi)有使用的內(nèi)存空間。
- 換入和換出速度,則表示每秒鐘換入和換出內(nèi)存的大小。
4.調(diào)優(yōu)工具
4.1.根據(jù)內(nèi)存指標(biāo)
4.2.性能工具
文章來(lái)源:http://www.zghlxwxcb.cn/news/detail-765238.html
5.內(nèi)存調(diào)優(yōu)策略
常見(jiàn)的優(yōu)化思路有這么幾種。文章來(lái)源地址http://www.zghlxwxcb.cn/news/detail-765238.html
- 最好禁止
Swap
。如果必須開(kāi)啟Swap
,降低swappiness
的值,減少內(nèi)存回收時(shí)Swap
的使用傾向。 - 減少內(nèi)存的動(dòng)態(tài)分配。比如可以使用內(nèi)存池、**大頁(yè)(HugePage)**等。
- 盡量使用緩存和緩沖區(qū)來(lái)訪問(wèn)數(shù)據(jù)。比如可以使用堆棧明確聲明內(nèi)存空間,來(lái)存儲(chǔ)需要緩存的數(shù)據(jù);或者用Redis 這類(lèi)的外部緩存組件,優(yōu)化數(shù)據(jù)的訪問(wèn)。
- 使用
cgroups
等方式限制進(jìn)程的內(nèi)存使用情況。這樣可以確保系統(tǒng)內(nèi)存不會(huì)被異常進(jìn)程耗盡。 - 通過(guò)
/proc/pid/oom_adj
,調(diào)整核心應(yīng)用的oom_score
。這樣,可以保證即使內(nèi)存緊張,核心應(yīng)用也不會(huì)被OOM
殺死。
到了這里,關(guān)于linux 性能優(yōu)化-內(nèi)存優(yōu)化的文章就介紹完了。如果您還想了解更多內(nèi)容,請(qǐng)?jiān)谟疑辖撬阉鱐OY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!