На моем VPS (CentOS) 4 ГБ оперативной памяти (2 + 2 динамически назначаются при необходимости), и у меня Tomcat работает со следующими параметрами: JAVA_OPTS = "- Xms256m -Xmx2048m -XX: MaxPermSize = 256m".
Теперь, когда я пытаюсь запустить другое приложение на основе Java (например, сервер Hudson), я получаю следующую ошибку:
There is insufficient memory for the Java Runtime Environment to continue. Native memory allocation (malloc) failed to allocate 664080 bytes for Chunk::new An error report file with more information is saved as: /server/hs_err_pid26476.log
Кажется, что система не может выделить 650 КБ памяти, но должно быть около 1,2 ГБ свободной.
free -m total used free shared buffers cached Mem: 4096 2816 1279 0 0 0 -/+ buffers/cache: 2816 1279 Swap: 0 0 0
Я где-то обнаружил, что мне также следует проверить / proc / user_beancounters, который показывает failcnt на privvmpages. Понятия не имею, что это значит (провайдер дает 4 ГБ памяти, как положено? Или он обманывает?)
# cat /proc/user_beancounters Version: 2.5 uid resource held maxheld barrier limit failcnt 70692271: kmemsize 15371949 15388993 41943040 46137344 0 lockedpages 0 0 1024 1024 0 privvmpages 720030 720189 1048576 1048576 9604 shmpages 9001 9001 65536 65536 0 dummy 0 0 9223372036854775807 9223372036854775807 0 numproc 109 109 256 256 0 physpages 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 numpty 1 1 64 64 0 numsiginfo 0 0 1024 1024 0 tcpsndbuf 601840 601840 6881280 10813440 0 tcprcvbuf 491520 491520 6881280 10813440 0 othersockbuf 174600 174600 4504320 8388608 0 dgramrcvbuf 0 0 1048576 1153432 0 numothersock 117 118 1440 1440 0 dcachesize 0 0 7340032 8074035 0 numfile 3516 3516 16384 16384 0 dummy 0 0 0 0 0 dummy 0 0 0 0 0 dummy 0 0 0 0 0 numiptent 18 18 400 405 0
Провайдеры OpenVZ обычно продают объем оперативной памяти своих виртуальных машин как два числа: «гарантированная» и «пакетная». Предполагается, что вы всегда получаете «гарантированный» объем ОЗУ и можете использовать до «пакетного» объема, если позволяют ресурсы хоста. Например, VPS может продаваться как «512 МБ гарантированно 1 ГБ пакетной оперативной памяти».
У вас всегда должно быть успешное выделение памяти ниже "гарантированного" объема, но при выделении памяти иногда может произойти сбой при превышении этого количества, если другие виртуальные машины на хосте также потребляют оперативную память или если поставщик превысил подписку на машину (почти всегда) .
Чтобы узнать, что это за числа, посмотрите на barrier
для vmguarpages
что представляет собой "гарантированную" оперативную память, а limit
для privvmpages
что представляет собой «пакетную» RAM. Каждое из этих чисел выражается в количестве страниц по 4 КиБ.
Итак, в вашем случае мы видим, что у вас есть 1 ГБ (262144) «гарантированной» ОЗУ и 4 ГБ (1048576) «пакетной» ОЗУ. (Если это не те числа, которые вам обещали, вам нужно очень неприятно поговорить с вашим провайдером VPS.)
Поскольку в виртуальной машине уже используется более 2 ГБ, выделение памяти может не выполняться, поскольку оно превышает «гарантированный» объем.
Ваш провайдер, скорее всего, гарантирует только 2 ГБ памяти и еще два, если они доступны, то есть, если другим клиентам в настоящее время требуется меньше (что бывает редко). Следовательно, было бы лучше принять максимум 2, а не 4 ГБ.
Счетчик сбоев на privvmpages показывает, как часто вашей системе не удавалось выделить часть памяти (грубо говоря).