Я запускаю наше весеннее загрузочное приложение в Docker-контейнере в сервисе AWS Fargate, поэтому, как только загрузка ЦП превышает 100%, контейнер останавливается Docker OOM-killer с ошибкой
Причина: OutOfMemoryError: Контейнер уничтожен из-за использования памяти
По метрикам мы видим, что процессор становится более 100%. Кажется, после некоторого времени профилирования мы обнаружили, что процессор потребляет код, но у меня вопрос: как процессор может быть больше 100%?
Можно ли сказать, что JVM использует только 100%?
Я помню, у нас была похожая проблема с потреблением памяти. Я прочитал много статей о cgroups, и было найдено решение указать
-XX: + UnlockExperimentalVMOptions -XX: + UseCGroupMemoryLimitForHeap
Таким образом, при запуске Docker с параметром -m = 512 размер кучи будет равен 1/4 размера mac. Размер кучи также можно настроить с помощью опции
-XX: MaxRAMFraction = 2
, который выделит 1/2 памяти докера для кучи.
Должен ли я использовать что-то подобное для процессора?
Я прочитал статью https://blogs.oracle.com/java-platform-group/java-se-support-for-docker-cpu-and-memory-limits,, но она говорит, что
Начиная с Java SE 8u131 и в JDK 9, JVM поддерживает Docker
Относительно ограничений Docker CPU. Это означает, что если
-XX: ParalllelGCThreads или -XX: CICompilerCount не указаны в качестве параметров командной строки, JVM будет применять ограничение ЦП Docker в качестве параметра
количество процессоров, которые JVM видит в системе. Затем JVM отрегулирует
количество потоков GC и потоков компилятора JIT, как это было бы
как будто он работает на голой железной системе с установленным количеством процессоров
в качестве предела CPU докера.
Команда Docker используется для запуска
docker run -d .... -e JAVA_OPTS='-XX:+UnlockExperimentalVMOptions -XX:+UseCGroupMemoryLimitForHeap -XX:+PrintFlagsFinal -XshowSettings:vm' -m=512 -c=256 ...
Используется Java-версия
openjdk version "1.8.0_181"
OpenJDK Runtime Environment (build 1.8.0_181-8u181-b13-1~deb9u1-b13)
OpenJDK 64-Bit Server VM (build 25.181-b13, mixed mode)
Дополнительная информация о приложении во время запуска
VM settings:
Max. Heap Size (Estimated): 123.75M
Ergonomics Machine Class: client
Using VM: OpenJDK 64-Bit Server VM
ParallelGCThreads = 0
CICompilerCount := 2
CICompilerCountPerCPU = true