深入理解Linux內(nèi)存管理之free命令的使用
在 Linux 系統(tǒng)中,內(nèi)存是關(guān)鍵的資源之一,管理和監(jiān)控內(nèi)存的使用情況對系統(tǒng)的穩(wěn)定性和性能至關(guān)重要。free 命令是 Linux 中用于查看內(nèi)存使用情況的重要工具,它可以讓我們快速了解系統(tǒng)中物理內(nèi)存和交換分區(qū)(Swap)的使用狀態(tài)。
本文介紹 free 命令的輸出、各個字段的含義和內(nèi)存的使用率計算等。幫助更好地理解和管理 Linux 系統(tǒng)中的內(nèi)存資源。
1. free命令的基本用法
運行 free 命令,系統(tǒng)會輸出當(dāng)前內(nèi)存的使用情況。常用的 free 命令選項包括:
free:顯示內(nèi)存和交換分區(qū)的使用情況。free -h:以人類可讀的格式顯示(自動選擇合適的單位,如 GB、MB)。free -m:以 MB 為單位顯示內(nèi)存使用情況。free -g:以 GB 為單位顯示內(nèi)存使用情況。
運行 free -h 命令后,得到如下輸出:
free -h
total used free shared buff/cache available
Mem: 31G 9.0G 12G 326M 9.8G 21G
Swap: 7.9G 3.9G 4.0G
2. free命令輸出字段詳解
free 命令的輸出通常分為兩部分:物理內(nèi)存(Mem) 和 交換分區(qū)(Swap)。它們各自包含幾個關(guān)鍵字段,幫助我們了解系統(tǒng)內(nèi)存的使用情況。
2.1. 物理內(nèi)存(Mem)
- total:物理內(nèi)存總量。該字段表示系統(tǒng)中所有的物理內(nèi)存(RAM)的總大小。在上例中,系統(tǒng)有 31GB 的物理內(nèi)存。
- used:已使用的物理內(nèi)存。該字段表示已使用的物理內(nèi)存,在現(xiàn)代 Linux 系統(tǒng)中(kernel 2.6.28 及以后,已經(jīng)不包含
buff/cache,僅僅表示真正被應(yīng)用程序和系統(tǒng)內(nèi)核占用的內(nèi)存。上例中,已使用內(nèi)存為 9.0GB。 - free:空閑的物理內(nèi)存。當(dāng)前沒有被使用的物理內(nèi)存。在上例中,空閑內(nèi)存為 12GB。
- shared:共享內(nèi)存。該字段表示用于進程間共享內(nèi)存的部分,通常是
tmpfs或類似機制分配的內(nèi)存。在上例中,共享內(nèi)存為 326MB。 - buff/cache:緩沖和緩存占用的內(nèi)存。Linux 系統(tǒng)會盡量利用空閑內(nèi)存來緩存文件系統(tǒng)中的數(shù)據(jù),以加速文件讀取。這部分內(nèi)存可以在需要時快速釋放給應(yīng)用程序使用。上例中,緩存和緩沖占用了 9.8GB。
- available:可用的內(nèi)存。該字段表示系統(tǒng)中實際可供新進程使用的內(nèi)存,包括
free內(nèi)存和可以隨時回收的buff/cache內(nèi)存。上例中,可用內(nèi)存為 21GB。這個字段比free更能準確反映系統(tǒng)的內(nèi)存可用性。
2.2. 交換分區(qū)(Swap)
交換分區(qū)是當(dāng)物理內(nèi)存不足時,Linux 將部分內(nèi)存頁交換到硬盤上的區(qū)域。交換分區(qū)雖然能夠幫助系統(tǒng)在內(nèi)存不足時繼續(xù)運行,但訪問速度遠不如物理內(nèi)存快,頻繁使用交換分區(qū)可能會影響系統(tǒng)性能。
- total:交換分區(qū)總量。表示系統(tǒng)中的交換分區(qū)大小。在上例中,系統(tǒng)有 7.9GB 的交換分區(qū)。
- used:已使用的交換分區(qū)。顯示當(dāng)前被使用的交換分區(qū)大小。在上例中,3.9GB 的交換分區(qū)已經(jīng)被使用。
- free:空閑的交換分區(qū)。顯示剩余可用的交換分區(qū)大小。在上例中,4.0GB 的交換分區(qū)仍然可用。
3. 如何正確計算內(nèi)存使用率
現(xiàn)代 Linux 系統(tǒng)中,used 字段已經(jīng)排除了緩存和緩沖內(nèi)存,所以 (used / total) 和((total - free - buff/cache) / total) 本質(zhì)上是等價的,計算結(jié)果幾乎相同。
3.1. 使用used計算內(nèi)存使用率
內(nèi)存使用率 = (used / total) * 100
根據(jù)上面的數(shù)據(jù):
內(nèi)存使用率 = (9.0G / 31G) * 100 ≈ 29.03%
3.2. 使用free、 buff/cache計算內(nèi)存使用率
內(nèi)存使用率 = ((total - free - buff/cache) / total) * 100
根據(jù)上面的數(shù)據(jù):
內(nèi)存使用率 = ((31G - 12G - 9.8G) / 31G) * 100
= (9.2G / 31G) * 100 ≈ 29.68%
free 命令的結(jié)果是四舍五入的,所以結(jié)果看起來不一致,可以使用更精確小單位去計算,這里就不展示了。
3.3. 使用 available字段
直接使用 available 字段也可以快速判斷系統(tǒng)的內(nèi)存可用性。available 包含了當(dāng)前空閑內(nèi)存、可以快速回收的緩存內(nèi)存、部分可釋放的slab內(nèi)存,所以這個是參考內(nèi)存還能使用多少的靠譜指標。內(nèi)存使用率不是官方定義的,也不是官方標準,只能作為參考。畢竟linux的內(nèi)存哲學(xué)是:空閑內(nèi)存是浪費的,少不等于不可以用。
4. 交換分區(qū)的作用與使用
交換分區(qū)(Swap)是物理內(nèi)存的延伸,當(dāng) RAM 不足時,系統(tǒng)會將部分不常用的內(nèi)存頁寫入交換分區(qū)。雖然交換分區(qū)可以緩解內(nèi)存不足的情況,但由于磁盤的速度遠低于物理內(nèi)存,頻繁使用交換分區(qū)可能會導(dǎo)致系統(tǒng)變慢。
因此,當(dāng)發(fā)現(xiàn)系統(tǒng)頻繁使用交換分區(qū)時,可能需要考慮增加物理內(nèi)存,或者優(yōu)化內(nèi)存密集型的應(yīng)用程序。
如何查看 Swap 使用情況:
free -h
total used free shared buff/cache available
Mem: 31G 9.0G 12G 326M 9.8G 21G
Swap: 7.9G 3.9G 4.0G
系統(tǒng)有 7.9GB 的交換分區(qū),其中 3.9GB 已經(jīng)被使用,剩下 4.0GB 可用。
5.free命令的其他選項詳解及組合使用
除了 free 命令的基本用法外,它還提供了多個選項用于不同的場景??梢酝ㄟ^不同的參數(shù)組合來獲取更精確的內(nèi)存信息。以下是 free 的一些常用選項及其組合使用方法:
5.1. 常用選項
-b:以字節(jié)(bytes)為單位顯示內(nèi)存信息。-k:以千字節(jié)(kilobytes)為單位顯示內(nèi)存信息。這是默認單位。-m:以兆字節(jié)(megabytes)為單位顯示內(nèi)存信息。-g:以千兆字節(jié)(gigabytes)為單位顯示內(nèi)存信息。-h:以人類可讀(human-readable)格式顯示內(nèi)存信息,自動選擇合適的單位(B、KB、MB、GB)。-t:顯示內(nèi)存和交換分區(qū)的 總計 信息。
使用 -t 選項時,free 會額外添加一行 Total,顯示物理內(nèi)存和交換分區(qū)的總和。
free -h -t
輸出結(jié)果:
total used free shared buff/cache available
Mem: 31G 9.0G 12G 326M 9.9G 21G
Swap: 7.9G 3.9G 4.0G
Total: 39G 12G 16G
-s [秒數(shù)]:每隔指定的時間間隔(以秒為單位)重復(fù)顯示內(nèi)存信息,對于持續(xù)監(jiān)控內(nèi)存使用情況特別有用。
例:每隔 2 秒打印一次內(nèi)存使用情況:
free -s 2
輸出結(jié)果:
total used free shared buff/cache available
Mem: 31G 9.0G 12G 326M 9.9G 21G
Swap: 7.9G 3.9G 4.0G
total used free shared buff/cache available
Mem: 31G 9.0G 12G 326M 9.9G 21G
Swap: 7.9G 3.9G 4.0G
……
-c [次數(shù)]:與 -s 選項一起使用,用于指定重復(fù)顯示的次數(shù)。
例:每隔 2 秒顯示一次內(nèi)存使用情況,總共顯示 5 次:
free -h -s 2 -c 5
-w:顯示內(nèi)存的額外列, 現(xiàn)代系統(tǒng)的默認輸出已經(jīng)相對完整,-w選項的作用不明顯, 默認輸出已經(jīng)是寬模式。-l: 顯示低端和高端內(nèi)存的詳細統(tǒng)計信息。在 32 位系統(tǒng)上,它能提供有用的信息,但在 64 位系統(tǒng)上,它的作用可能不大,輸出的低端和高端內(nèi)存數(shù)值可能相同。
6.交換分區(qū)(Swap)的清除與影響
6.1. 交換分區(qū)可以清除嗎?
交換分區(qū)(Swap)可以手動清除(即關(guān)閉交換分區(qū))。在某些情況下,想要釋放硬盤空間或調(diào)整系統(tǒng)性能時,可能需要臨時關(guān)閉交換分區(qū)。
在 Linux 中,交換分區(qū)可以通過以下命令來清除(關(guān)閉):
sudo swapoff -a
swapoff -a:這個命令會關(guān)閉系統(tǒng)中所有的交換分區(qū)和交換文件。所有在交換分區(qū)中的數(shù)據(jù)會被遷移回物理內(nèi)存。如果物理內(nèi)存不足,可能會導(dǎo)致系統(tǒng)性能下降,甚至進程崩潰。
6.2. 清除交換分區(qū)的影響
交換分區(qū)是物理內(nèi)存的延伸,當(dāng)內(nèi)存不足時,系統(tǒng)會將一些不常用的內(nèi)存頁寫入交換分區(qū)。如果清除(關(guān)閉)交換分區(qū),系統(tǒng)會嘗試將這些內(nèi)容重新加載回物理內(nèi)存。如果物理內(nèi)存足夠多,通常不會有太大問題,但如果內(nèi)存不足,可能會導(dǎo)致以下影響:
- 內(nèi)存不足:如果物理內(nèi)存不足,關(guān)閉交換分區(qū)后可能會導(dǎo)致系統(tǒng)內(nèi)存用光,進而引發(fā) OOM(Out of Memory,內(nèi)存溢出) 事件。Linux 內(nèi)核中的 OOM 殺手(OOM Killer)會強制終止一些進程,從而釋放內(nèi)存空間??赡軐?dǎo)致某些重要的應(yīng)用程序被意外終止。
- 系統(tǒng)變慢或無響應(yīng):在內(nèi)存不足時,交換分區(qū)可以緩解內(nèi)存壓力。如果沒有交換分區(qū),當(dāng)物理內(nèi)存用盡時,系統(tǒng)可能會變得非常緩慢,甚至無響應(yīng)。
- 性能提升或下降:在某些情況下,關(guān)閉交換分區(qū)可以提升性能,當(dāng)系統(tǒng)依賴交換分區(qū)時,因為硬盤(或 SSD)的速度遠低于物理內(nèi)存。如果系統(tǒng)頻繁使用交換分區(qū),性能會顯著下降,因此關(guān)閉交換分區(qū)可以強制系統(tǒng)使用更快的物理內(nèi)存。但只能在物理內(nèi)存充足的情況下才有效。
6.3. 重啟后交換分區(qū)會自動清除嗎?
在大多數(shù) Linux 系統(tǒng)中,交換分區(qū)在重啟后不會被自動清除,而是會自動重新啟用。這是因為在系統(tǒng)啟動時,/etc/fstab 文件中定義了需要掛載的交換分區(qū)或交換文件。系統(tǒng)啟動時會根據(jù)這個文件自動啟用交換分區(qū)。
可以通過以下命令查看系統(tǒng)中當(dāng)前啟用的交換分區(qū):
sudo swapon --show
輸出結(jié)果:
NAME TYPE SIZE USED PRIO
/dev/dm-1 partition 7.9G 3.9G -1
/dev/dm-1是一個邏輯卷管理器(LVM)設(shè)備,作為交換分區(qū)使用。partition表示該交換空間位于磁盤上的一個分區(qū),而非文件。7.9G是該交換分區(qū)的總大小。3.9G是當(dāng)前已使用的交換空間,表明系統(tǒng)內(nèi)存壓力較大,部分數(shù)據(jù)被寫入了交換分區(qū)。-1是交換分區(qū)的優(yōu)先級,表示它的默認優(yōu)先級較低(可以調(diào)整)。
6.4. 如何永久禁用交換分區(qū)
如果想讓系統(tǒng)在重啟后不再啟用交換分區(qū),可以編輯 /etc/fstab 文件并注釋掉(或刪除)與交換分區(qū)相關(guān)的行。
打開 /etc/fstab 文件:
sudo vim /etc/fstab
找到類似于以下內(nèi)容的行(具體的設(shè)備名稱可能不同):
/dev/sda2 swap swap defaults 0 0
注釋掉這一行(在行前加上 #):
# /dev/sda2 swap swap defaults 0 0
保存并退出文件。
重啟系統(tǒng)后,交換分區(qū)將不會再自動啟用。如果希望再次啟用交換分區(qū),可以取消該行的注釋,或者手動運行以下命令啟用:
sudo swapon -a
6.5. 如何手動清除交換分區(qū)
如果希望在系統(tǒng)運行的過程中手動清除交換分區(qū),可以通過以下步驟實現(xiàn):
關(guān)閉交換分區(qū):
sudo swapoff -a
清除所有交換分區(qū)中的數(shù)據(jù),并將其數(shù)據(jù)移回物理內(nèi)存。
如果想要釋放交換分區(qū)的空間(如刪除交換文件),可以在關(guān)閉交換后刪除對應(yīng)的交換分區(qū)或交換文件。
- 若使用交換分區(qū),可以通過
fdisk或gparted刪除交換分區(qū)。 - 若使用交換文件,可以刪除該文件:
如果不想永久禁用交換分區(qū),只是臨時清除,可以在需要時重新啟用:
sudo swapon -a
6.6. 總結(jié)
- 清除交換分區(qū)(swapoff) 是可以的,如果物理內(nèi)存不足,關(guān)閉交換分區(qū)可能導(dǎo)致系統(tǒng)性能下降或進程終止。
- 重啟后交換分區(qū)不會自動清除,它會根據(jù)
/etc/fstab文件中的配置重新啟用。 - 永久禁用交換分區(qū),可以編輯
/etc/fstab文件并注釋掉與交換分區(qū)相關(guān)的行。 - 手動關(guān)閉交換分區(qū)后,系統(tǒng)會將交換分區(qū)中的數(shù)據(jù)移回物理內(nèi)存。如果物理內(nèi)存不夠,可能會引發(fā) OOM 事件,導(dǎo)致進程被強制終止,所以生產(chǎn)環(huán)境要慎用。
- 物理內(nèi)存充足的情況下,禁用交換分區(qū)可能會提高系統(tǒng)性能,因為減少了使用較慢的磁盤 I/O。交換分區(qū)提供了額外的緩沖,防止內(nèi)存耗盡,所以禁用操作需要根據(jù)具體情況決定。
7. 小結(jié)
free 命令是 Linux 系統(tǒng)中監(jiān)控內(nèi)存使用情況的常用工具。理解 free 命令輸出中的各個字段,尤其是 used、buff/cache 和 available,對于正確評估系統(tǒng)內(nèi)存狀況至關(guān)重要。
核心要點:
- 物理內(nèi)存:包括總內(nèi)存、已使用內(nèi)存、空閑內(nèi)存、共享內(nèi)存、緩存/緩沖內(nèi)存,以及可用內(nèi)存。
- 交換分區(qū):當(dāng)物理內(nèi)存不足時,系統(tǒng)會將部分數(shù)據(jù)交換到硬盤上的交換分區(qū)。過度使用交換分區(qū)會影響系統(tǒng)性能。
- 內(nèi)存使用率計算:排除緩存和緩沖的內(nèi)存后,內(nèi)存使用率會更準確地反映系統(tǒng)的實際壓力。
free的其他命令選項:free提供了多種選項來滿足不同的內(nèi)存監(jiān)控需求,組合使用這些選項可以幫助我們更加靈活和全面地監(jiān)控系統(tǒng)內(nèi)存。
到此這篇關(guān)于深入理解Linux內(nèi)存管理之free命令的使用的文章就介紹到這了,更多相關(guān)Linux free命令內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
Linux內(nèi)核設(shè)備驅(qū)動之字符設(shè)備驅(qū)動筆記整理
今天小編就為大家分享一篇關(guān)于Linux內(nèi)核設(shè)備驅(qū)動之字符設(shè)備驅(qū)動筆記整理,小編覺得內(nèi)容挺不錯的,現(xiàn)在分享給大家,具有很好的參考價值,需要的朋友一起跟隨小編來看看吧2018-12-12
Ubuntu Linux系統(tǒng)下輕松架設(shè)nginx+php服務(wù)器應(yīng)用
一直一來,在Ubuntu Linux系統(tǒng)下調(diào)試php的web程序都是使用的apache+php+mysql的開發(fā)環(huán)境,近來看到網(wǎng)上大家都在討論nginx架設(shè)的web服務(wù)器,據(jù)說性能比apache要高上十幾倍。所以自己想也想嘗嘗鮮,在自己的電腦上先裝一個體驗一下!2009-08-08
Gzip在apache2中的設(shè)置和squid對它的處理
gzip可以級大的加速網(wǎng)站.有時壓縮比率高到80%,近來測試了一下,最少都有40%以上,還是相當(dāng)不錯的.在Apache2之后的版本,模塊名不叫g(shù)zip,而叫mod_deflate2011-12-12

