Я вижу слишком высокое потребление памяти в моем экземпляре elasticsearch.
Я установил ES_HEAP_SIZE = 4g.
Команда запуска ES начинается с: /usr/lib/jvm/java-8-oracle/jre/bin/java -Xms4g -Xmx4g
Все идет нормально.
Но я вижу, что потребление памяти RSS превышает 7 ГБ.
Вот вывод / proc / status: http://pastebin.com/mXW6Vnfc
Но когда я бегу jstat -gc
все выглядит нормально, я вижу около 3,7 ГБ в OC и 270 МБ в EC (http://pastebin.com/c84urvSM).
Это отсортированный вывод pmap: http://pastebin.com/GG92Ercr
Вы хоть представляете, почему такое высокое потребление памяти?
Также ES запускается на виртуальном сервере под OpenVZ.
Что вы устанавливаете с помощью ES_HEAP_SIZE, это размер кучи Java, доступный для программы, выполняемой на JVM. Вдобавок к этому JVM имеет свои собственные накладные расходы, накладные расходы от GC (его данные не учитываются как куча Java), и каждому запущенному потоку требуется память для своего стека (сколько потоков у вас есть и каков размер стека?). ElasticSearch, вероятно, не использует хранилище вне кучи, но всегда стоит на него обратить внимание.
Я слышал о случаях, когда изменение распределителя памяти помогло уменьшить общий объем JVM (jemalloc против glibc malloc). Наконец, я бы попробовал другую (более свежую?) Версию JVM или другой алгоритм GC, если возможно ...
Использовать jvisualvm
чтобы увидеть потребление кучи (и многое другое), это официальный инструмент отладки и профилирования для java, установленный по умолчанию вместе с java.
Присоедините его к процессу elasticsearch, проверьте, что флаги -Xmx и -Xms имеют правильное значение, и посмотрите на графики. Это очень просто.
У процесса java всегда должно быть 4 ГБ кучи, потому что вы устанавливаете как минимальную, так и максимальную кучу. Он должен занимать 4-4,5 ГБ в системе, потому что есть некоторые накладные расходы на управление кучей, которая не учитывается как часть кучи.
В любом случае, java не позволяет процессу использовать больше кучи, чем настроено (это убило бы процесс, если бы он попытался). Вероятно, что-то еще использует память вашего компьютера. Использовать top
или htop
чтобы посмотреть на другие запущенные процессы.
Проблема, вероятно, в JVM, и если вы запускаете несколько экземпляров ES, изучите ее с помощью Java Mission Control. http://www.oracle.com/technetwork/java/javaseproducts/mission-control/java-mission-control-1998576.html или jconsole https://docs.oracle.com/javase/8/docs/technotes/guides/management/jconsole.html. Это даст вам представление о том, почему он потребляет так много памяти.
Помните, что JVM использует сборщик мусора и другие процессы за пределами кучи. Запустите ES с -xms 1024, а затем оставьте его расти. Кроме того, насколько я помню, java принимает аргументы -xms, -xmx как МБ, а не как ГБ, просто на всякий случай конвертирует все в МБ.