進階 Linux 記憶體管理:完整實用指南

最後更新: 19月2026
  • Linux 會將所有可用 RAM 用於快取和頁面緩存,因此可用記憶體少並不一定意味著有問題。
  • 交換空間、zram/z​​swap 和 vm.swappiness 的適當設定相結合,可平衡效能和穩定性。
  • cgroup v2、systemd-oomd 和 earlyoom 或 nohang 等工具可以對記憶體壓力和 OOM 事件進行精細控制。
  • 使用 free、vmstat、htop、sar 或 Glances 進行監控是發現瓶頸和最佳化記憶體管理的關鍵。

進階 Linux 記憶體管理

如果你負責系統管理、容器操作或生產伺服器維護,那麼深入理解 Linux 記憶體管理已不再是可選項。它決定了伺服器能否輕鬆應對負載高峰,還是會舉步維艱、進入崩潰模式,甚至在最糟糕的時刻觸發令人頭疼的 OOM killer。

Linux 的設計目標是盡可能有效地利用記憶體:它會快取檔案、壓縮頁面、將資料移至交換空間,並根據非常精確的策略對進程進行優先權排序。從表面上看,它似乎“佔用大量記憶體”或“總是沒有可用記憶體”,但實際上,它是為了實現最佳效能和穩定性。接下來,我們將一步步地用一些簡單易懂的方式來解釋這一切是如何運作的,以及如何進行進階的微調。

Linux記憶體的基本概念與誤區

Linux 中的記憶體概念

在隨意修改核心參數或掛載 zram 之前,最好先對記憶體類型、架構以及系統如何看待 RAM有一些清晰的了解。

電腦可處理的最大實體記憶體量取決於作業系統和處理器架構。 32 位元系統通常限制為 4 GB 內存,而 64 位元系統可以輕鬆處理數十或數百 GB 內存(理論上可以處理更多,但實際限制由硬體決定)。

在 Linux 系統中,所有記憶體都以虛擬記憶體的形式進行管理,包括實體記憶體和交換空間。實體記憶體只能透過添加實體模組來擴展,而虛擬記憶體則可以透過磁碟(分割或交換檔案)以及 zram 或 zswap 等高階機制進行擴展。

La 物理記憶體(RAM) 它是速度快但成本高的資源:進程、庫、檔案快取、I/O 緩衝區、共享記憶體等等都載入到記憶體中。 Linux 的理念非常明確:如果有空閒內存,最好將其用作緩存以加快訪問速度,而不是讓它空著。這就是為什麼在諸如 之類的工具中很少看到「可用」記憶體的原因。 free 這並不意味著你遇到了問題。

磁碟記憶體(持久性儲存)速度要慢得多。 RAM 的反應速度以奈秒計,而即使是 SSD 的反應速度也以微秒或毫秒計。因此,系統會盡量將常用資料保存在 RAM 中,只有在絕對必要時才會存取磁碟:例如載入可執行檔、讀取冷資料或交換頁面。

虛擬記憶體、頁面和核心內部結構

虛擬記憶體是Linux為每個程序提供獨立、隔離且受保護的位址空間的機制。硬體和核心透過稱為頁表的結構將虛擬位址轉換為實體位址。

管理記憶體的最小單位是頁,通常為 4 KB。整個虛擬記憶體系統圍繞著頁運轉:它們被分配、釋放、交換、緩存,並被標記為不同的權限(唯讀、執行等)。

頁表是由核心維護的層級結構。它儲存每個行程的每個虛擬頁的實際實體頁的位置(如果存在)、權限和目前狀態。這種轉換機制使得進程之間可以隔離,頁面可以在進程間共享,檔案也可以直接對應到記憶體。

當進程存取有效的位址,但該頁面尚未準備好存取時,就會發生缺頁錯誤。缺頁錯誤可能很輕(頁面在記憶體中,但狀態需要更新),也可能很重(頁面在磁碟、交換空間或檔案中,必須從記憶體中調出)。如果缺頁錯誤頻繁發生,系統會因為花太多時間從磁碟讀取資料而變慢。

頁面快取是由核心維護的檔案頁面快取。它儲存檔案和目錄的資料及元數據,以減少磁碟存取。這也是Linux「看起來」會佔用所有記憶體的原因之一:實際上,它利用了應用程式未主動使用的記憶體來加速磁碟存取。

內存類型:檔案支援型內存、匿名內存,以及它們與交換空間的關係

在Linux系統中,通常區分檔案記憶體和匿名記憶體。兩者都駐留在RAM中,但它們的來源和可能的磁碟備份方式不同。

電話 文件記憶體 它由系統檔案備份:可執行二進位、共享庫、映射資料。 mmap 從檔案等位置讀取資料。如果需要空間,可以丟棄該記憶體並從原始檔案重新載入。

La 匿名記憶 它包含了進程保留的、不與檔案綁定的所有東西:動態堆疊、堆疊、私有區域等等。 MAP_ANONYMOUS以及在執行操作時透過寫入時複製的區域 fork()此記憶體僅存在於 RAM 中(如果移動則存在於交換空間中),且其唯一可能的備份也正是該交換空間。

當核心需要釋放記憶體時,它會先嘗試釋放可以重新組裝的頁面:通常是來自頁面快取或檔案支援區域的頁面。只有當沒有更多空間或記憶體壓力非常高時,它才會開始將匿名記憶體推入交換空間,雖然這樣做開銷更大,但可以讓系統得到喘息之機。

  管理資訊系統:現代商業成功的隱藏關鍵

記憶體壓力、頻繁刷新和 OOM 殺手

當空閒頁數低於某些內部閾值時,就會出現記憶體壓力。此時,核心將被迫不斷釋放記憶體:清除快取、將髒頁寫入磁碟、驅逐不常用的頁面等等。

記憶體壓力過高會產生非常明顯的症狀:Web 服務延遲高、圖形介面運作緩慢、遠端會話(SSH、VNC、RDP)反應延遲、滑鼠操作卡頓、視窗反應需要幾秒鐘等等。此時,系統更關注的是生存而不是執行有用的工作。

當記憶體不足以容納進程不斷使用的頁面時,就會發生頁面抖動。內核會開始持續交換頁面:它驅逐一個頁面插入另一個頁面,但隨後又立即需要剛剛驅逐的頁面。這會導致頁面錯誤和磁碟存取的循環,從而降低效能。

啟用交換空間後,抖動意味著匿名頁面會在記憶體和交換空間之間來回移動,導致磁碟空間飽和。停用交換空間後,問題會轉移到文件頁面:這些頁面會被重複丟棄並從檔案系統中重新加載,這也會導致機器幾乎無法使用。

如果內核仍然無法取得可用內存,則會發生以下情況: 記憶體不足(OOM)機制當所有可以丟棄、壓縮或交換的資料都用盡後,核心會計算每個行程的分數(oom_score並決定犧牲哪一個。這個過程由……完成。 OOM 殺手 釋放大量內存,避免系統完全崩潰。

交換:它是什麼,應該投入多少,以及為什麼它並非“魔鬼”

交換記憶體名聲不佳,部分原因是由於過時的建議和過於簡單化的說法,例如「如果你的記憶體很大,就不需要交換空間」。實際上,即使在記憶體充足的系統中,交換空間也是 Linux 記憶體設計的關鍵組成部分。

交換空間是磁碟上的一個區域(分區或檔案),核心用它來儲存不活躍的記憶體頁。這樣可以釋放內存,供真正需要的進程使用。它本身並不是虛擬內存,而是實現虛擬內存的機制之一。

如果沒有交換空間,當記憶體壓力增加時,匿名頁面將無處可去。核心仍然可以依賴快取和檔案支援的頁面,但一旦匿名記憶體使用量達到臨界值,它實際上會被迫更早觸發記憶體溢出殺手(OOM killer)。從技術上講,Linux 可以在沒有交換空間的情況下運行,但實際上,在大多數情況下,這是不必要的風險。

在決定交換空間的大小時,並沒有統一的標準,但根據機器的功能,有一些相當合理的現代標準:

  • 沒有休眠狀態的伺服器即使記憶體充足,4-8 GB 的交換空間通常也足以作為緩衝。對於記憶體密集型服務(例如資料庫、虛擬化),您可以將其增加到記憶體的 1,5 倍,但首要任務應該是增加實體記憶體。
  • 不休眠的桌面對於 16 GB 或以上的 RAM,2-4 GB 的交換空間作為安全保障就綽綽有餘了。
  • 具備休眠功能的設備交換空間必須等於或略大於 RAM,因為系統在休眠時會將記憶體中的所有內容轉儲到交換空間。

創建交換空間非常靈活。您可以使用專用分割區或交換文件。如果您的磁碟已經分割,或者您想要在不重新配置整個系統的情況下調整交換空間的大小,那麼交換檔案是理想的選擇。

記憶體指標:free、vmstat、ps、RSS、PSS 等

如果您不了解每一列的含義,傳統的 Linux 記憶體管理工具可能會導致誤解。 free -h 這是最簡單直觀地查看總記憶體、已使用記憶體、可用記憶體、快取和交換空間的方法。

在出口處 free 關鍵是要查看扣除緩衝區和快取的那一行,因為該列指示了… 進程實際佔用的記憶體還不包括內核用作快取的內容,內核可以根據需要快速釋放這些內容。

同 vmstat -s -S M 您可以獲得更詳細的摘要:總記憶體、已使用記憶體、可用記憶體、活動記憶體、空閒記憶體、交換快取等。您也可以查閱 /proc/meminfo 雖然輸出結果比較枯燥,不太方便使用者查看,但可以詳細查看每個指標。

為了找出哪些進程對記憶體佔用影響最大, ps aux 顯示列,例如 VSZ (如果進程載入所有內容,則可以使用的總虛擬記憶體) RSS (駐留記憶體集大小,即目前實際佔用在 RAM 中的記憶體)。注意:RSS 也包含共享庫內存,如果多個進程使用共享庫內存,則會被計算多次。

在這裡發揮作用 PSS(比例集大小)它將共享庫的成本分攤到使用這些庫的進程之間。為了方便地取得 PSS,可以使用一些工具,例如 smem這對於查看哪些應用程式真正「佔用大量資料」非常有用,而不會因為共用程式庫而扭曲資料。

記憶體碎片、堆疊、堆和 ulimit

記憶體管理的另一個不太明顯的方面是碎片化。我們可以討論內部碎片化(當以 4、8 或 16 位元組的倍數分配整數塊時,會留下無用的部分)和外部碎片化(當存在空閒內存,但被分割成小塊,從而阻止使用大的連續分配時)。

在像 Redis 這樣的應用程式中,您有時會發現系統(RSS)報告的記憶體與應用程式本身認為有用的記憶體之間存在差異(used_memory這種距離通常主要是由於 外部碎片系統將某些空間計為已佔用,但進程實際上並未使用這些空間。

過程記憶在概念上分為以下幾部分: 堆疊和堆積棧用於局部變數和函數調用,而堆用於動態分配。 malloc() 類似地,當資​​料結構的大小超過堆疊的容納能力時,它們會被從堆中取出,並使用指標進行管理。

  資料備份策略:實用且全面的指南

每個進程的最大堆疊大小可以透過以下方式調整: ulimit -a 以及系統配置。降低此值會限制大型局部變數的數量,而增加此值則允許使用更多變數或進行深度遞歸。調整此參數有助於更好地控制記憶體使用並減少某些類型的記憶體碎片,但這並非萬全之策。

進階監控與診斷:top、htop、vmstat、sar 等

要查找佔用記憶體的進程,您可以從以下方面開始: top 如果你想要更人性化的功能,那麼… htop後者顯示 CPU、記憶體和交換空間使用情況條,並允許對進程進行互動式排序和篩選。

在 Debian 及其衍生發行版中, 安裝 htop 同 sudo apt install htop在 AlmaLinux 和其他類似 Red Hat 的系統中, sudo dnf install htop進入後,您可以按記憶體排序、搜尋特定進程,並直接從介面終止問題任務。

為了進行更深入的分析和批量處理, vmstat 5 它定期提供有關進程、記憶體、分頁、區塊 I/O、中斷和 CPU 調度的資訊。它非常適合用來觀察記憶體壓力隨時間的變化。

以下 SYSSTAT 它包含以下工具: sar它允許您記錄和分析記憶體和其他資源的使用情況。例如, sar -r 1 5 它每秒顯示五次記憶體和交換空間使用。在 Debian 系統中,它是透過以下方式安裝的: sudo apt install sysstat在 AlmaLinux 中 sudo dnf install sysstat.

如果您需要進行深度內核級調試, bpftrace 這是一個基於 eBPF 的強大工具。它允許您對系統呼叫進行插樁、觀察記憶體存取並檢測瓶頸,而無需重新編譯或重新啟動。它通常隨程式一起安裝。 sudo apt install bpftrace 在類似 Debian 的系統上。

實用記憶體管理:交換空間、可交換性以及快取清理

許多伺服器上的一項基本任務是檢查 目前交換狀態。 用 swapon --show 您會看到一份活動交換設備和文件的列表,其中包含它們的大小、類型和優先順序。如果您需要動態新增交換空間,可以建立一個檔案。 fallocate獲得安全許可 chmod 600用以下格式格式化 mkswap 並用 swapon要使其永久生效,只需將相應的條目新增至 /etc/fstab.

參數 vm.swappiness 此參數控制核心優先使用交換空間而非繼續填充 RAM 的程度。取值範圍為 0 到 100。較低的值(10-20)會使系統盡量避免使用交換空間,除非絕對必要;而較高的值(60 或更高)則會促使系統更頻繁地將頁面移動到交換空間,以保持 RAM 的可用空間。

對於磁碟速度慢或資料庫龐大的伺服器來說,這通常很有意義。 降低交換頻率例如,到 10 或 20,用 sudo sysctl vm.swappiness=10對於配備快速 ZRAM 或 SSD 的桌上型電腦,30-60 等中間值可以在延遲和記憶體利用率之間提供良好的平衡。

在記憶尚可的情況下,有時需要強制… 快取釋放 同 sudo sync && sudo sysctl -w vm.drop_caches=3這會清空大部分頁面快取和目錄項目。偶爾在測試或釋放資源非常有限的系統記憶體時很有用,但不應經常使用,因為這樣也會失去快取帶來的效能提升。

進階控制工具:使用者空間中的 cgroup v2、memory.pressure 和 OOM

在採用 systemd 和cgroup v2 的現代系統中,可以透過進程組對記憶體管理進行精細調整。 cgroup v2將任務組織成層級結構,並在群組層級(而非單一進程層級)套用資源限制和優先權(CPU、記憶體、I/O)。

在記憶體層次結構中,諸如以下參數: memory.low 它們允許您指示某些 cgroup 的記憶體應該受到更多保護,免受全域壓力的影響,而其他 cgroup 的記憶體如果需要釋放 RAM 則可以更靈活地使用。

文件 memory.pressure 它揭示了一些非常有用的指標:此 cgroup 中的任務因記憶體不足而被阻塞的時長,分別以 10 秒、60 秒和 300 秒為時間間隔。該變體 一些 它表明是否至少有一項任務被延誤,以及 充分 它反映了團隊所有任務同時受到影響的時刻。

除了核心的 OOM killer 之外,還出現了使用者空間解決方案,例如: Earlyoom, 諾漢 o systemd-oomdEarlyOOM 會監控 RAM 和交換空間,當它們低於某些閾值時,它會主動終止進程。 oom_score 提高溫度,在機器當機前恢復可用性。

NoHang 更進一步:它支援更多選擇標準,可以考慮記憶體壓力,並且能夠很好地與高級配置集成,儘管其開發過程並非一帆風順。同時,systemd-oomd直接與 systemd 和 cgroup v2 集成,目前是許多發行版中用於更智能、更精細地管理低內存情況的首選方案。

現代交換機制:zram、zswap 和設備優先權

除了「經典」的磁碟交換之外,Linux 還提供了現代機制,透過結合RAM 壓縮和選擇性磁碟使用,大大提高了效能。

zram是一個核心模組,它會在 RAM 內部建立區塊設備,並將頁面以壓縮狀態儲存在這些區塊設備中。這些區塊設備通常用作超高速交換設備:壓縮和解壓縮會消耗一些 CPU 資源,但可以增加邏輯記憶體容量並大幅減少磁碟使用量。

在許多發行版中,只需安裝即可。 zram-tools o zram產生器 並啟用其服務。例如,在 Debian 系統中,您可以使用 sudo apt install zram-tools 並激活 zramswap 使用 systemd。在 AlmaLinux 中,使用 sudo dnf install zram-generator 及其相應的服務。

另一方面,zswap充當磁碟交換分割區前的壓縮快取。它首先嘗試將交換頁儲存在壓縮 RAM 中;只有當此快取已滿或頁面不再活動時,才會寫入實際的交換區域。這可以減少磁碟 I/O 並延長 SSD 的使用壽命,但會佔用一些 CPU 資源。

  Linux 中的命名空間和 cgroups:容器的真正基礎

當組合使用多個交換設備(例如,zram 和磁碟檔案)時,調整下列參數至關重要: 優先。 用 swapon -p 或選項 pri= en /etc/fstab 您需要指定哪個設備優先使用。通常的做法是賦予 ZRAM 高優先權(例如 100),給磁碟交換空間一個低優先權(10),以便核心在存取磁碟之前充分利用 RAM 中壓縮的交換空間。

伺服器記憶體管理:交換、服務和安全性

在Web伺服器(Apache、Nginx)、資料庫(MySQL、MariaDB、MongoDB)或資源密集型應用程式中,記憶體是至關重要的資源。 RAM和交換空間的配置直接決定了系統在開始出現瓶頸之前能夠處理多少並發請求。

對於像 MongoDB 這樣的資料庫引擎來說,實體記憶體必須大於資料庫的需求,這一點至關重要;否則,資料庫將開始使用交換空間,由於記憶體存取和磁碟存取之間的顯著差異,效能將急劇下降。 MySQL/MariaDB 也有相同的問題,像 MySQLTuner 這樣的工具會根據可用記憶體推薦記憶體參數。

為避免浪費內存,建議停止未使用的服務,並清理不再需要的容器、映像和 Docker 磁碟區。在開發和測試環境中,很容易累積一些被遺忘的資源,這些資源會在無人察覺的情況下佔用數 GB 的記憶體和磁碟空間。

安全因素也發揮了作用: 打開不必要的連接埠 它們會擴大攻擊面。例如,成功入侵系統的惡意軟體可以啟動佔用 CPU 和記憶體的挖礦進程,並在系統中調度任務。 crontab 並可能導致系統崩潰。檢查傳入和傳出的連接埠、關閉所有非必要的進程以及清理可疑的定時任務都是基本的系統衛生措施,這些措施也有助於保護記憶體資源。

記憶體和檔案系統:ext4、XFS、Btrfs 和日誌記錄

雖然這看似是一個獨立的問題,但檔案系統的選擇及其配置也會影響記憶體行為和 I/O 負載。例如,Ext4 使用日誌,根據負載情況,這可能會對磁碟造成額外的壓力,從而影響快取管理。

在對伺服器效能要求較高的環境中,許多管理員會選擇XFS甚至Btrfs。 XFS通常在處理大型檔案和高效能係統時表現出色。 Btrfs 提供快照、透明壓縮和子卷等高級功能,但代價是其複雜性較高,並且根據版本和發行版的不同,其在所有工作負載下的成熟度仍存在爭議。

核心會根據檔案系統的特性調整其快取和回寫策略,因此從 ext4 切換到 XFS 或 Btrfs 不僅會影響原始 I/O,還會影響 RAM 和頁面快取如何使用來緩衝讀寫操作。

管理員必備的圖形工具和實用程序

雖然終端仍然是管理員的瑞士軍刀,但也有一些工具可以大大簡化記憶體和資源的管理。其中之一就是Glances,它是一款即時監控工具,可以在單一螢幕上顯示 CPU、記憶體、磁碟、網路和進程,並提供可選的 Web 介面,方便用戶透過瀏覽器監控多台伺服器。

在 Debian 系統上快速安裝,只需… sudo apt install glances眼神交流與…非常相配 htop, vmstat y sar從而更直觀地展現系統在負載下的運作。

在圖形化伺服器管理領域,Cockpit提供了一個使用者友善的 Web 介面,用於監控記憶體、進程和服務。它允許您從單一控制台管理多台伺服器,啟動和停止 systemd 單元,監控交換空間和 zram 使用情況,並在不離開瀏覽器的情況下查看日誌。

在桌面系統中,許多發行版都整合了自己的資源監視器,但對於沒有 GUI 的環境或需要輕量級工具的情況,將這些控制台工具與自訂腳本結合使用,可以讓你隨時清楚地了解記憶體的使用情況。

Linux 中正確的記憶體管理需要理解核心如何使用 RAM、交換空間、zram 和 zswap 的作用、cgroup v2 和各種 OOM 事件如何應對記憶體壓力,以及有哪些工具可以用來監控和最佳化系統。當你把所有這些要素整合起來——從free、vmstat、PSS 和 memory.pressure 到 zram、swappiness 和 systemd-oomd——你就能擺脫“Linux 佔用大量內存”的困擾,擁有一個經過精心調校、穩定可靠的系統,能夠在任何角色(伺服器、桌面或高負載環境)下最大限度地發揮硬體環境)最大限度地發揮硬體。

進階記憶體診斷
相關文章:
進階記憶體診斷:檢測真正故障的完整指南