Можно ли настроить jvm так, чтобы он был внимательным и разделял вычислительные ресурсы (ЦП и ОЗУ) с другими процессами?
Я использую существующие программы, написанные на Java или Scala. Эти программы написаны разными авторами и служат совершенно разным целям, поэтому объединить их в одну мегапрограмму невозможно. Когда любая из этих java-программ запускается на узле со многими ядрами (например, 32) и большим объемом оперативной памяти (например, 200 ГБ), каждая пытается взять как можно больше ресурсов, насколько это возможно, чтобы узел замедлялся и не производил полезных вычислений. сделано Например, запуск 32 экземпляров Beagle в разных наборах данных приводит к 32 jvms, каждый из которых пытается использовать 32 ядра и большую часть памяти. (Beagle не настроен для явного многопоточности с nthreads=1
по умолчанию.)
Итак, как я могу настроить jvm так, чтобы он вел себя как традиционная программа, которая использует столько памяти и процессора, сколько ей действительно нужно...
Мне известны следующие флаги, но есть ли другие флаги для рассмотрения?
-Xmx limits maximum memory
-XX:+UseSerialGC disables multithreaded garbage collection
Может ли jvm действительно быть однопоточным?
Кроме того, все довольно легкие Java-программы пытаются использовать как минимум 30 ГБ ОЗУ на узле с 200 ГБ ОЗУ, когда им действительно требуется <1 ГБ ОЗУ. Я поставил -Xmx1G
и эти программы работали без ошибок или заметного снижения производительности; На самом деле, время запуска было намного быстрее.
Есть ли более элегантное решение, чем установка жесткого верхнего предела для памяти? Если я установлю -Xmx
слишком низко, программа вылетает. Если я установлю его слишком высоко, ресурсы будут потрачены впустую. Работая с программами, написанными на C++, написанными внимательными авторами, мне не нужно настраивать эти вещи. Использование памяти программ на C++ обычно предсказуемо масштабируется с учетом размера входных данных.
Почему jvm не может использовать столько, сколько ему нужно по умолчанию?
Помимо nice
а также ulimit
Есть ли лучшие решения?
nice +10 java
может столкнуться с проблемами, когда новые процессы постоянно запускаются с более высоким приоритетом.ulimit java
может заставить JVM бросить приступы.
Я работаю в среде без корневого доступа. Я не работаю на сервере Linux и не на Android.
2 ответа
-XX:-UseSerialGC
это отключает последовательный GC, который противоположен тому, что вы хотите.
Я работаю в среде без корневого доступа.
Если ядро скомпилировано с пользовательскими пространствами имен, вы можете использовать unshare
ввести новое пространство имен пользователя, а затем использовать cgroups в этом пространстве имен для ограничения ресурсов.
Может ли jvm действительно быть однопоточным?
Нет, когда он может работать одновременно, он работает. Вы можете использовать набор задач, чтобы ограничить JCVM только одним байтом ЦП, он будет работать очень плохо, если вы сделаете это, так как ему требуется более одного ЦП.
Есть ли более элегантное решение, чем установка жесткого верхнего предела для памяти?
Я бы попытался определить, что вы имеете в виду под этим.
Почему jvm не может использовать столько, сколько ему нужно?
Он использует столько процессора и памяти, сколько ему нужно.
Хорошая +10 Java может столкнуться с проблемами при постоянном запуске новых процессов
Запуск новых JVM может создать гораздо больше накладных расходов, чем выгод. Я хотел бы запустить JVM как можно меньше, если вы хотите сохранить процессор.