2016-06-30 4 views
0

Я запускаю существующие программы, написанные на Java или Scala. Эти программы написаны разными авторами и служат совершенно другим целям, поэтому интеграция их в одну мега-программу не представляется возможной. Когда какая-либо из этих java-программ запускается на узле со многими ядрами (например, 32) и большой ОЗУ (например, 200G), каждый пытается взять как можно больше ресурсов в той мере, в какой узел замедляется и не может быть полезным вычислением делается. Например, запуск 32 экземпляров Beagle на разных наборах данных приводит к 32 jvms, каждый из которых пытается использовать 32 ядра и большую часть памяти. (Beagle не настроен для явной многопоточности с nthreads=1 как по умолчанию.)Можно ли настроить jvm для того, чтобы быть внимательным и делиться вычислительными ресурсами (ЦП и ОЗУ) с другими процессами?

Так как я могу настроить JVM вести себя как традиционные программы, которая использует только как много памяти и процессор, как это действительно нужно ...

Мне известны следующие флаги, но есть ли какие-либо другие флаги? -Xmx limits maximum memory -XX:+UseSerialGC disables multithreaded garbage collection

Может ли jvm быть однопоточным?

Кроме того, достаточно легкие java-программы стараются использовать по меньшей мере 30 ГБ ОЗУ на узле с 200 ГБ ОЗУ, когда им действительно нужно только < 1G ОЗУ. Я установил -Xmx1G, и эти программы выполнялись без ошибок или заметной деградации производительности; Фактически, время запуска было намного быстрее.

Есть ли более элегантное решение, чем установка жесткого верхнего предела памяти? Если я установил -Xmx слишком низко, программа выйдет из строя. Если я установил его слишком высоко, ресурсы будут потрачены впустую. Работая с программами, написанными на C++, написанными осторожными авторами, мне не нужно настраивать эти вещи. Использование памяти программ на C++ обычно масштабируется с учетом размера входных данных.

Почему jvm не может использовать столько, сколько ему нужно по умолчанию?

Помимо nice и ulimit, есть ли лучшие решения?

nice +10 java может столкнуться с проблемами при запуске новых процессов с более высоким приоритетом. ulimit java может вызывать jvm для подгонки.

Я работаю в среде без доступа к корню. Я не работаю на сервере Linux, а не на Android.

+0

Я не знаю, но андроид уже обменивается ОЗУ между процессами, я не знаю, связано ли это, но это может быть :) – niceman

+0

Вы можете управлять Beagle, используя его параметры командной строки (nthreads). Сюрприз: Чтение документов программного обеспечения, которое вы используете, помогает. – Durandal

+0

@ Durandal Beagle 'nthread' по умолчанию - 1, поэтому он должен запускаться по одному потоку по умолчанию. Фактически, версия Beagle, которую я использовал, не поддерживала многопоточность. Я связался с автором о том, что Бигл взял на себя все ядра, и он утверждает, что версия Beagle, которую я использовал, была строго однопоточной. Важно отметить, что я использовал только Бигл в качестве примера. Другие программы могут также иметь> 100% использование ЦП, вероятно, из-за многопоточной сборки мусора. Частью вопроса является то, будет ли jvm многопоточным во время других задач и как его отключить. –

ответ

1

-XX:-UseSerialGC

что отключает серийный GC, который является противоположностью того, что вы хотите.

Я работаю в среде без доступа к корню.

Если ядро ​​скомпилировано с пользовательскими пространствами имен можно использовать unshare ввести новое пространство имен пользователя, а затем использовать контрольные группы в пределах этого пространства имен, чтобы ограничить ресурсы.

+0

Согласно http://www.oracle.com/technetwork/articles/java/vmoptions-jsp-140102.html, '-XX: -UseSerialGC' использует серийную сборку мусора. –

+0

Опция 'cgroups' интересна (хотя я уверен, что мы используем ядро ​​для акций). Разве это практически не отличается от 'ulimit'? –

+1

В таблице просто описаны параметры, независимо от того, включена ли опция и выключена ли она. он упоминается в прозе над таблицей: * «Логические опции включаются с -XX: +

1

Может ли jvm быть однопоточным?

Нет, когда он может работать одновременно. Вы можете использовать набор задач, чтобы ограничить JCVM только одним байтом процессора, он будет работать довольно плохо, если вы это сделаете, поскольку для этого требуется больше одного процессора.

Есть ли более элегантное решение, чем установка жесткого верхнего предела памяти?

Я попытался бы определить, что вы имеете в виду под этим.

Почему я не могу использовать jvm столько, сколько вам нужно?

Он использует столько CPU и памяти, сколько ему нужно.

хороший +10 Java может столкнуться с проблемами, когда новые процессы постоянно запускаются

Запуск новых JVMs может создать гораздо больше накладных расходов, чем пользы. Я хотел бы запустить JVM как можно меньше, если вы хотите сохранить CPU.