VPS 上的 Linux 記憶體不足
在我的 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,因此您的記憶體分配可能會失敗,因為它高於“保證”數量。