Почему Кассандра занимает столько памяти, несмотря на параметр -Xmx heap? - PullRequest
1 голос
/ 24 мая 2019

Я запускаю Cassandra (процесс Java) на моем сервере, который имеет ограниченную память.Я редактирую конфигурацию Cassandra (config/jvm.options), чтобы передать эти аргументы виртуальной машине Java, чтобы ограничить размер кучи.

-Xms180M -Xmx180M

Я вижу их в выводе ps ax | grep java, который показывает:

[...] /usr/lib/jvm/java-8-openjdk-amd64/bin/java [...] 
   -Xms180M -Xmx180M [...] org.apache.cassandra.service.CassandraDaemon

Но, похоже, он использует намного больше, чем 180 МБ, и другой серверный процесс продолжает исчезать.Я предполагаю, что ядро ​​убивает другой процесс из-за ограниченной памяти.

Вот фрагмент экрана в top:

KiB Mem :  1009128 total,    87072 free,   643488 used,   278568 buff/cach
KiB Swap:        0 total,        0 free,        0 used.   222228 avail Mem 

  PID USER      PR  NI    VIRT    RES    SHR S %CPU %MEM     TIME+ COMMAND                                                                                 
20410 cassand+  20   0 2048132 433828   8456 S  0.3 43.0  41:25.22 java          

Не RES 433828 Имеется в виду, чем 433 МБ ОЗУ используется Кассандрой?Кажется ли это возможным после того, как якобы ограничил кучу Java до 180 МБ?Если размер кучи ограничен 180 МБ, то для чего нужны остальные 433-180 = 253 МБ?И можно ли это тоже ограничить?

1 Ответ

3 голосов
/ 24 мая 2019

Кассандра имеет часть в куче (контролируемую -Xmx) и часть вне кучи. Большинство структур данных вне кучи обычно масштабируются в зависимости от размера данных - такие, как индекс раздела, фильтр Блума и данные блока сжатия, хранятся в областях прямой памяти и увеличиваются с использованием диска.

Вы можете немного их настроить, но они менее очевидны и имеют компромисс с производительностью. Например, повышение bloom_filter_fp_chance с 0.01 до 0.1 будет использовать значительно меньше памяти, но вы можете прочитать дополнительные sstables на пути чтения.

...