本文介紹Linux系統的ECS執行個體在系統、記憶體或進程出現異常,查看系統日誌提示"page allocation failure"錯誤的問題原因及解決方案。
問題現象
Linux系統的ECS執行個體的系統、記憶體或進程出現異常,通過查看系統日誌提示"page allocation failure"錯誤,表示系統因記憶體不足導致無法為新的記憶體頁分配記憶體空間,記憶體頁分配失敗。

關於如何查看系統日誌的具體操作,請參見查看執行個體的系統日誌和螢幕截圖。
問題原因
該問題可能是由於ECS執行個體的系統記憶體不足或片段化嚴重,導致無法分配所需的記憶體頁。
解決方案
建議您首先嘗試方案一:記憶體異常排查與最佳化,以解決記憶體使用量問題。如果經過排查最佳化後問題仍然存在或無法解決,那麼可以考慮方案二:升配執行個體規格(vCPU和記憶體),以解決執行個體系統記憶體不足或片段化嚴重的問題。
方案一:記憶體異常排查與最佳化
遠端連線Linux執行個體。
具體操作,請參見使用Workbench工具以SSH協議登入Linux執行個體。
排查佔用大量記憶體的異常進程。
執行
free和top命令確認不存在佔用大量記憶體的進程。執行如下命令,統計所有進程佔用的實體記憶體,相加後與free命令結果進行核對,確認是否有偏差。
ps aux|awk '{sum+=$6} END {print sum/1024}'如果確認無偏差後,為了進一步排查進程消耗記憶體,可執行如下命令,根據rss列排序結果,核實最大消耗記憶體進程。
ps -eo pid,rss,pmem,pcpu,vsz,args --sort=rss若以上步驟中,均未尋找出異常進程,則繼續執行下述操作。
執行以下命令,檢測slab記憶體 Clerk的佔用情況。
cat /proc/meminfo | awk '{sum=$2/1024} {print $1 sum " MB"}'說明{print $1 sum " MB"}命令是將輸出結果轉換為以MB為單位的形式進行顯示。執行
atop命令,使用atop工具分析slab列的記憶體佔用情況,核實記憶體佔用是否較高。返回樣本如下圖所示:

根據顯示資訊,判斷為slab佔用記憶體過高。
執行
slabtop命令,以更詳細地分析系統中slab的佔用情況。返回樣本如下圖所示:

執行以下操作進行記憶體最佳化。
釋放記憶體
重要在執行記憶體釋放操作之前,建議首先手動執行
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執行個體系統記憶體不足或片段化嚴重的問題。以確保系統能夠分配所需的記憶體頁,從而避免執行個體的系統、記憶體或進程出現異常。更多資訊,請參見升降配方式概述。