Фон
У нас есть пул примерно 20 linux-дисков. Некоторые из них запускают Suse, некоторые работают с Redhat. ВСЕ разделяют пространство NAS, которое содержит следующие 3 папки:
- /NAS/app/java - символическая ссылка, которая указывает на установку Java JDK. В настоящее время версия 1.5.0_10
- /NAS/app/lib - символическая ссылка, указывающая на версию нашего приложения.
- /NAS/data - каталог, в котором написан наш вывод
Все наши машины имеют 2 процессора (hyperthreaded) с 4 ГБ физической памяти и 4 ГБ пространства подкачки. Мы ограничиваем количество "заданий", которые каждая машина может обрабатывать в данный момент времени до 6 (это число, вероятно, должно измениться, но это не входит в текущую проблему, поэтому пока игнорируйте его).
Некоторые из наших заданий задают размер Max Heap размером 512 МБ, некоторые другие резервируют размер Max Heap размером 2048 МБ. Опять же, мы понимаем, что мы можем перейти к нашей доступной памяти, если на той же машине началось 6 заданий с размером кучи, установленным на 2048, но, насколько нам известно, этого еще не произошло.
Проблема
Время от времени задание будет немедленно сбой со следующим сообщением:
Error occurred during initialization of VM
Could not reserve enough space for object heap
Could not create the Java virtual machine.
Мы использовали для этого слишком много заданий, выполняемых одновременно на одной машине. Проблема возникла нечасто (MAYBE раз в месяц), что мы просто перезапустили ее, и все будет хорошо.
Проблема в последнее время значительно ухудшилась. Все наши задания, которые запрашивают максимальный размер кучи 2048 м, немедленно срабатывают почти каждый раз и должны быть перезагружены несколько раз до завершения.
Мы отправились на отдельные машины и попытались выполнить их вручную с тем же результатом.
Отладка
Оказывается, проблема существует только для наших ящиков SuSE. Причина, по которой это происходит чаще, состоит в том, что мы добавляем больше машин, а новые - SuSE.
'cat/proc/version' в окне SuSE:
Linux version 2.6.5-7.244-bigsmp ([email protected]) (gcc version 3.3.3 (SuSE Linux)) #1 SMP Mon Dec 12 18:32:25 UTC 2005
'cat/proc/version' в блоках RedHat дайте нам:
Linux version 2.4.21-32.0.1.ELsmp ([email protected]) (gcc version 3.2.3 20030502 (Red Hat Linux 3.2.3-52)) #1 SMP Tue May 17 17:52:23 EDT 2005
'uname -a' дает нам следующие типы BOTH машин:
UTC 2005 i686 i686 i386 GNU/Linux
На компьютере нет заданий, и никакие другие процессы не используют много памяти. Все запущенные процессы могут использовать 100 мб.
'top' в настоящее время показывает следующее:
Mem: 4146528k total, 3536360k used, 610168k free, 132136k buffers
Swap: 4194288k total, 0k used, 4194288k free, 3283908k cached
'vmstat' в настоящее время показывает следующее:
procs -----------memory---------- ---swap-- -----io---- --system-- ----cpu----
r b swpd free buff cache si so bi bo in cs us sy id wa
0 0 0 610292 132136 3283908 0 0 0 2 26 15 0 0 100 0
Если мы запускаем задание со следующей командной строкой (Max Heap 1850mb), он начинает нормально:
java/bin/java -Xmx1850M -cp helloworld.jar HelloWorld
Hello World
Если мы увеличиваем максимальный размер кучи до 1875 мб, он терпит неудачу:
java/bin/java -Xmx1875M -cp helloworld.jar HelloWorld
Error occurred during initialization of VM
Could not reserve enough space for object heap
Could not create the Java virtual machine.
Совершенно ясно, что используемая память используется для буферизации/кэширования и поэтому так мало отображается как "свободный". Неясно, почему существует магическая линия 1850mb, где что-то более высокое означает, что Java не может запускаться.
Любые объяснения будут с благодарностью.