在linux中,實體記憶體是指系統硬體提供的記憶體大小,是真實的記憶體。 Linux的記憶體管理採取的是分頁存取機制,為了確保實體記憶體能得到充分的利用,核心會在適當的時候將實體記憶體中不常使用的資料區塊自動交換到虛擬記憶體中,而將經常使用的資訊保留到實體記憶體。
本教學操作環境:linux7.3系統、Dell G3電腦。
我們都知道,直接從記憶體讀寫資料要比從硬碟讀寫資料快得多,因此更希望所有資料的讀取和寫入都在記憶體中完成,然而記憶體是有限的,這樣就引出了物理記憶體與虛擬記憶體的概念。
實體記憶體就是系統硬體提供的記憶體大小,是真正的記憶體。相對於實體內存,在 Linux 下還有一個虛擬記憶體的概念,虛擬記憶體是為了滿足物理記憶體的不足而提出的策略,它是利用磁碟空間虛擬出的一塊邏輯記憶體。用作虛擬記憶體的磁碟空間稱為交換空間(又稱 swap 空間)。
作為實體記憶體的擴展,Linux 會在物理記憶體不足時,使用交換分割區的虛擬內存,更詳細地說,就是核心會將暫時不用的記憶體區塊資訊寫到交換空間,這樣一來,實體記憶體得到了釋放,這塊記憶體就可以用於其他目的,當需要用到原始的內容時,這些資訊會被重新從交換空間讀入物理記憶體。
Linux 的記憶體管理採取的是分頁存取機制,為了確保實體記憶體能得到充分的利用,核心會在適當的時候將實體記憶體中不常使用的資料區塊自動交換到虛擬記憶體中,而將經常使用的資訊保留到實體記憶體。
要深入了解Linux 記憶體運行機制,需要知道下面提到的幾個面向:
首先,Linux 系統會不時地進行頁面交換操作,以保持盡可能多的空閒實體內存,即使沒有什麼事情需要內存,Linux 也會交換出暫時不用的內存頁面,因為這樣可以大大節省等待交換所需的時間。
其次,Linux 進行頁面交換是有條件的,不是所有頁面在不用時都交換到虛擬內存,Linux 內核根據“最近最經常使用”演算法,僅僅將一些不經常使用的頁面檔案交換到虛擬記憶體。
有時我們會看到這麼一個現象,Linux 物理記憶體還有很多,但是交換空間也使用了很多,其實這並不奇怪。例如,一個佔用很大內存的進程運行時,需要耗費很多內存資源,此時就會有一些不常用頁面文件被交換到虛擬內存中,但後來這個佔用很多內存資源的進程結束並釋放了很多內存時,剛才被交換出去的頁面檔案並不會自動交換進實體記憶體(除非有這個必要),那麼此時系統物理記憶體就會空閒很多,同時交換空間也在被使用,就出現了剛才所說的現象了。
最後,交換空間的頁面在使用時會首先被交換到物理內存,如果此時沒有足夠的物理內存來容納這些頁面,它們又會被馬上交換出去,如此一來,虛擬內存中可能沒有足夠的空間來儲存這些交換頁面,最終會導致Linux 出現假死機、服務異常等問題。 Linux 雖然可以在一段時間內自行恢復,但恢復後的系統自己基本上不可用了。
因此,合理規劃和設計Linux 記憶體的使用是非常重要的,關於物理記憶體和交換空間的大小設定問題,取決於實際所使用的硬碟大小,但大致遵循這樣一個基本原則:
如果記憶體較小(根據經驗,物理記憶體小於4GB),一般設定swap 分割區大小為記憶體的2 倍;
如果物理記憶體大於4GB,而小於16GB,可以設定swap 分割區大小等於物理記憶體;
#如果記憶體大小在16GB 以上,可以設定swap 為0,但不建議這麼做,因為設定一定大小的swap 分割區是有一定作用的。
Windows及帶有GUI的Linux作業系統中,我們通常可以使用UI來查看系統記憶體及空間使用情況,但是對於開發或維運人員來說,常常要工作在沒有GUI的Linux的伺服器,命令列能比GUI提供更多功能和彈性。
特別當我們的系統中某個應用程式異常,或系統佔用異常,抑或linux開發需要記憶體裁切時,我們就要了解下系統記憶體及空間使用情況,就需要掌握幾個常用的查看工具。
free
指令可以顯示目前系統未使用的和已使用的記憶體大小,也可以顯示被核心使用的記憶體緩衝區。在終端機中輸入free
(參數稍後說明)可以看到我們伺服器記憶體狀況,如下:
Mem: 記憶體的使用資訊
#Swap: 交換空間的使用資訊
total :總計物理記憶體的大小。
used:已使用實體記憶體。
free:可用實體記憶體。
shared:多個行程共享的記憶體總額。
buffers/cached:快取緩衝使用實體記憶體大小。
available:也可以被應用程式使用的實體記憶體大小。
#total = used free buffer/cache
#avaiable = free buffer/cache(一般來說是這樣,個人電腦是這樣,但伺服器或公有雲一般使用者有部分buffer/cache是用不了的就會有avaiable
#free是正在未使用的記憶體
available 是應用程式認為可用的記憶體
Linux為了提升讀寫效能,消耗一部分記憶體資源作為快取或緩衝內存,在核心看來這部分buffer/cache屬於已被使用的內存;在應用程式申請內存,而free內存不夠時,就會讓內核回收buffer和cache來滿足應用程式的內存需求。
buffers和cache是有一定差別的:
#free指令下顯示的單位是k,可以在free後面加上-m(即free -m
)顯示單位為Mb,如下圖:
可以透過free --help
查看free的詳細指令:
透過free -h可以自動搭配適合人閱讀習慣的單位,其中h是humanity之意。
ps:
第3行swap為交換分區,類似windows系統中的虛擬內存,當記憶體不足的時候,把一部分硬碟空間虛擬成內存使用,從而解決內存容量不足的情況。
top -X
-b:以批处理模式操作; -c:显示完整的治命令; -d:屏幕刷新间隔时间; -I:忽略失效过程; -s:保密模式; -S:累积模式; -i<时间>:设置间隔时间; -u<用户名>:指定用户名; -p<进程号>:指定进程; -n<次数>:循环显示的次数。
h:显示帮助画面,给出一些简短的命令总结说明; k:终止一个进程; i:忽略闲置和僵死进程,这是一个开关式命令; q:退出程序; r:重新安排一个进程的优先级别; S:切换到累计模式; s:改变两次刷新之间的延迟时间(单位为s),如果有小数,就换算成ms。输入0值则系统将不断刷新,默认值是5s; f或者F:从当前显示中添加或者删除项目; o或者O:改变显示项目的顺序; l:切换显示平均负载和启动时间信息; m:切换显示内存信息; t:切换显示进程和CPU状态信息; c:切换显示命令名称和完整命令行; M:根据驻留内存大小进行排序; P:根据CPU使用百分比大小进行排序; T:根据时间/累计时间进行排序; w:将当前设置写入~/.toprc文件中。
直接在終端機中輸入top指令,可以看到下列介面
top - 10:14:31 当前系统时间
up 3 days, 22:36 系统已经运行了3天22h36min
1 users 共有1个用户为登录状态
load average: 0.57, 0.74, 0.65 系统负载,即任务队列的平均长度,load average后面的三个数字分别表示距离现在一分钟,五分钟,十五分钟的负载情况。
注意:load average数据是每隔5秒钟检查一次活跃的进程数,然后按特定算法计算出的数值。如果这个数除以逻辑CPU的数量,结果高于5的时候就表明系统在超负荷运转了。
Tasks: 322 total 总进程数
2 running 正在运行的进程数
320 sleeping 睡眠的进程数
0 stopped 停止的进程数
0 zombie 冻结进程数
%Cpu(s): 2.7 us, 用户空间占用CPU百分比(用户态使用CPU占比)
2.7 sy 内核空间占用CPU百分比 (系统态使用CPU占比)
0.0 ni 用做nice加权的进程分配的用户态cpu时间比
94.0 id 空闲的cpu时间比
0.0 wa IO wait ,cpu等待磁盘写入完成时间
0.0 hi Hardware IRQ,硬中断消耗时间
0.0 si Software IRQ,软中断消耗时间
0.7 st 被hypervisor(管理程序,一般为服务器或者虚拟机)偷取时间
MiB Mem : 11995.2 total 物理内存总量,单位:Mb
360.9 free 空闲内存总量
6766.0 used 使用的物理内存总量,此处需要注意的是:used实际指的是现在系统内核控制的内存数,空闲内存总量(free)是内核还未纳入其管控范围的数量。纳入内核管理的内存不见得都在使用中,还包括过去使用过的现在可以被重复利用的内存,内核并不把这些可被重新使用的内存交还到free中去,因此在linux上free内存会越来越少,但不用为此担心。
4868.3+buff/cache 用作内核缓存的内存量
MiB Swap: 7680.0 total 交换区总量
7433.1 free 空闲交换区总量
246.9 used 使用的交换区总量
3665.4 avail Mem 在不交换的情况下,对启动新应用程序可用内存的估计
(网上也有说法是交换区的可用容量)
top命令第六行为空。
top命令第七行是各个进程的监控:
从左到右依次为:
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 — 进程名称(命令名/命令行)
需要注意的是,此界面显示的并不是所有进程,由于页面显示限制仅仅显示了这几行,我们可以通过top -b -n 1
查看系统的所有进程的快照。
命令:cat /proc/meminfo
注:initrd和初始化代码init在引导完成之后会被释放掉,所以最终的内核可管理内存(total)会比dmesg显示的available更多一点,相应的源代码可参见: free_initrd_mem() 和 free_initmem()。
优化可以主要从优化保留内存和优化used内存两个方面进行,具体的需要结合代码。
查看磁盘命令比较多,最常用的为: df -lh
命令
命令:lsmod
相关推荐:《Linux视频教程》
以上是linux物理記憶體是指什麼的詳細內容。更多資訊請關注PHP中文網其他相關文章!