Я запускаю существующие программы, написанные на 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.
Я не знаю, но андроид уже обменивается ОЗУ между процессами, я не знаю, связано ли это, но это может быть :) – niceman
Вы можете управлять Beagle, используя его параметры командной строки (nthreads). Сюрприз: Чтение документов программного обеспечения, которое вы используете, помогает. – Durandal
@ Durandal Beagle 'nthread' по умолчанию - 1, поэтому он должен запускаться по одному потоку по умолчанию. Фактически, версия Beagle, которую я использовал, не поддерживала многопоточность. Я связался с автором о том, что Бигл взял на себя все ядра, и он утверждает, что версия Beagle, которую я использовал, была строго однопоточной. Важно отметить, что я использовал только Бигл в качестве примера. Другие программы могут также иметь> 100% использование ЦП, вероятно, из-за многопоточной сборки мусора. Частью вопроса является то, будет ли jvm многопоточным во время других задач и как его отключить. –