Linux

VPS 上的 Linux 記憶體不足

  • November 26, 2012

在我的 VPS (CentOS) 4GB ram(需要時動態分配 2 + 2)上,並且我使用以下選項 JAVA_OPTS="-Xms256m -Xmx2048m -XX:MaxPermSize=256m" 執行 tomcat。

現在,當我嘗試啟動其他基於 java 的應用程序(如 hudson 伺服器)時,出現以下錯誤:

Java 執行時環境沒有足夠的記憶體來繼續。
本機記憶體分配 (malloc) 未能為 Chunk::new 分配 664080 字節
包含更多資訊的錯誤報告文件保存為:
/server/hs_err_pid26476.log

似乎系統無法分配 650KB 的記憶體,但它應該有 1.2 GB 的可用空間。

免費-m
記憶體的已用空閒共享緩衝區總數
記憶體:4096 2816 1279 0 0 0
-/+ 緩衝區/記憶體:2816 1279
交換:0 0 0

我發現某個地方我還應該檢查 /proc/user_beancounters,它在 privvmpages 上顯示了 failcnt。我不知道這意味著什麼(提供商是否按照他的預期提供了 4GB 記憶體?還是他在作弊?)

# cat /proc/user_beancounters
版本:2.5
uid 資源持有 maxheld 屏障限制 failcnt
70692271:kmemsize 15371949 15388993 41943040 46137344 0
鎖定頁面 0 0 1024 1024 0
privvmpages 720030 720189 1048576 1048576 9604
shmpages 9001 9001 65536 65536 0
假人 0 0 9223372036854775807 9223372036854775807 0
數字程序 109 109 256 256 0
物理頁面 173670 173780 9223372036854775807 9223372036854775807 0
vmguarpages 0 0 262144 262144 0
oomguarpages 174598 174708 9223372036854775807 262144 0
numtcpsock 30 30 1440 1440 0
numflock 14 14 752 826 0
數字 1 1 64 64 0
數字資訊 0 0 1024 1024 0
tcpsndbuf 601840 601840 6881280 10813440 0
tcprcvbuf 491520 491520 6881280 10813440 0
其他sockbuf 174600 174600 4504320 8388608 0
dgramrcvbuf 0 0 1048576 1153432 0
numothersock 117 118 1440 1440 0
記憶體大小 0 0 7340032 8074035 0
數字文件 3516 3516 16384 16384 0
假人 0 0 0 0 0
假人 0 0 0 0 0
假人 0 0 0 0 0
數字 18 18 400 405 0

OpenVZ 提供商通常以兩個數字出售其虛擬機的 RAM 容量:“保證”和“突發”RAM。您應該始終獲得“保證”數量的 RAM,並且如果主機資源允許,可能會使用最多“突發”數量。例如,VPS 可能以“512MiB 保證 1GiB 突發 RAM”的形式出售。

您應該始終成功分配低於“保證”數量的記憶體,但如果主機上的其他虛擬機也在消耗 RAM,或者如果提供者超額訂閱了機器(幾乎總是),記憶體分配有時可能會在超過該數量時失敗.

要了解這些數字是什麼,請查看barrier代表vmguarpages“保證”RAM 的代表,以及limit代表privvmpages“突發”RAM 的代表。這些數字中的每一個都以許多 4KiB 頁面表示。

因此,在您的情況下,我們可以看到您有 1GiB(262144)“保證”RAM 和 4GiB(1048576)“突發”RAM。(如果這些不是您承諾的數字,您需要與您的 VPS 提供商進行一次非常不愉快的談話。)

由於您已經在 VM 中使用了超過 2GiB,因此您的記憶體分配可能會失敗,因為它高於“保證”數量。

引用自:https://serverfault.com/questions/452042