全部產品
Search
文件中心

:Linux系統的ECS執行個體的系統、記憶體或進程出現異常,查看系統日誌提示"page allocation failure"錯誤怎麼辦?

更新時間:Feb 26, 2025

本文介紹Linux系統的ECS執行個體在系統、記憶體或進程出現異常,查看系統日誌提示"page allocation failure"錯誤的問題原因及解決方案。

問題現象

Linux系統的ECS執行個體的系統、記憶體或進程出現異常,通過查看系統日誌提示"page allocation failure"錯誤,表示系統因記憶體不足導致無法為新的記憶體頁分配記憶體空間,記憶體頁分配失敗。

什麼是記憶體頁

記憶體頁(Memory Page)是作業系統中對記憶體進行管理的最小單位。在虛擬記憶體系統中,實體記憶體被劃分為固定大小的塊,每個塊被稱為記憶體頁。一般情況下,記憶體頁的大小為4KB或者8KB。作業系統使用記憶體頁來進行記憶體的分配和管理。當程式需要使用記憶體時,作業系統將相應的記憶體頁分配給該程式。記憶體頁的大小是根據硬體和作業系統的設計來決定的,它的選擇考慮了記憶體的利用率、地址空間大小和作業系統的記憶體管理機制等因素。

image.png

關於如何查看系統日誌的具體操作,請參見查看執行個體的系統日誌和螢幕截圖

問題原因

該問題可能是由於ECS執行個體的系統記憶體不足或片段化嚴重,導致無法分配所需的記憶體頁。

解決方案

建議您首先嘗試方案一:記憶體異常排查與最佳化,以解決記憶體使用量問題。如果經過排查最佳化後問題仍然存在或無法解決,那麼可以考慮方案二:升配執行個體規格(vCPU和記憶體),以解決執行個體系統記憶體不足或片段化嚴重的問題。

方案一:記憶體異常排查與最佳化

  1. 遠端連線Linux執行個體。

    具體操作,請參見使用Workbench工具以SSH協議登入Linux執行個體

  2. 排查佔用大量記憶體的異常進程。

    1. 執行freetop命令確認不存在佔用大量記憶體的進程。

    2. 執行如下命令,統計所有進程佔用的實體記憶體,相加後與free命令結果進行核對,確認是否有偏差。

      ps aux|awk '{sum+=$6} END {print sum/1024}'

      如果確認無偏差後,為了進一步排查進程消耗記憶體,可執行如下命令,根據rss列排序結果,核實最大消耗記憶體進程。

      ps -eo pid,rss,pmem,pcpu,vsz,args --sort=rss

      若以上步驟中,均未尋找出異常進程,則繼續執行下述操作。

    3. 執行以下命令,檢測slab記憶體 Clerk的佔用情況。

      cat /proc/meminfo | awk '{sum=$2/1024} {print $1 sum " MB"}'
      說明

      {print $1 sum " MB"}命令是將輸出結果轉換為以MB為單位的形式進行顯示。

    4. 執行atop命令,使用atop工具分析slab列的記憶體佔用情況,核實記憶體佔用是否較高。

      返回樣本如下圖所示:

      image

      根據顯示資訊,判斷為slab佔用記憶體過高。

    5. 執行slabtop命令,以更詳細地分析系統中slab的佔用情況。

      返回樣本如下圖所示:

      image

  3. 執行以下操作進行記憶體最佳化。

    • 釋放記憶體

      重要

      在執行記憶體釋放操作之前,建議首先手動執行sync命令,以確保所有未寫入的系統緩衝區(包括已修改的i-node、已延遲的塊I/O和讀寫對應檔)都被寫入到磁碟中。

      為釋放頁緩衝,請執行以下命令:

      • 釋放頁緩衝:sudo echo 1 > /proc/sys/vm/drop_caches

      • 釋放目錄和索引節點緩衝:sudo echo 2 > /proc/sys/vm/drop_caches

      • 同時釋放頁、目錄、索引節點緩衝:sudo echo 3 > /proc/sys/vm/drop_caches

      說明
      • 以上操作並不會對系統造成損害,因為它們僅釋放完全未使用的記憶體對象,而髒資料將繼續在記憶體中使用,直到寫入磁碟。

      • 如果多次執行sudo echo 3 > /proc/sys/vm/drop_caches未能再次釋放緩衝,您可以嘗試先執行sudo echo 0 > /proc/sys/vm/drop_caches,然後再執行sudo echo 3 > /proc/sys/vm/drop_caches

    • 記憶體規整

      當系統釋放記憶體後仍然存在記憶體不足的情況時,您可以執行以下命令進行記憶體整理,解決部分記憶體片段化問題。

      說明

      該操作會消耗較多的CPU資源。

      sudo echo 1 > /proc/sys/vm/compact_memory
    • 合理配置系統參數

      檢查/etc/sysctl.conf檔案中的如下欄位,並設定合適的閾值。當系統記憶體達到閾值時,觸發自動回收。

      vm.min_free_kbytes

方案二:升配執行個體規格(vCPU和記憶體)

如果經過記憶體異常排查並最佳化後問題仍然存在或無法解決,您可以考慮升級ECS執行個體規格(vCPU和記憶體)來解決Linux執行個體系統記憶體不足或片段化嚴重的問題。以確保系統能夠分配所需的記憶體頁,從而避免執行個體的系統、記憶體或進程出現異常。更多資訊,請參見升降配方式概述