Как ограничить использование оперативной памяти ArangoDB внутри док-контейнера? - PullRequest
0 голосов
/ 29 января 2019

Мы используем ArangoDB 3.3.14 (Community Edition) с механизмом хранения MMFiles для относительно большого набора данных (чуть более 30 ГБ при резервном копировании).Мы запускаем его внутри док-контейнера, используя ECS.Наша виртуальная машина имеет 64 ГБ оперативной памяти, и мы выделили 55 ГБ исключительно для контейнера ArangoDB (мы установили жесткое ограничение для этого контейнера в 55 ГБ).

Когда ArangoDB только запускается и все коллекции загружаются вОЗУ заняло бы около 45 ГБ, поэтому у нас есть около 10 ГБ свободной ОЗУ для запросов и т. д.

Проблема в том, что через некоторое время (в зависимости от использования) ArangoDB съедает все55 ГБ ОЗУ и на этом не останавливаться.Он продолжает использовать ОЗУ сверх установленного жесткого предела, и в какой-то момент докер убивает контейнер с кодом завершения 137 и причиной состояния OutOfMemoryError: Контейнер уничтожен из-за использования памяти.

Перезапуск вызывает много проблемдля нас, потому что нам нужно ждать, пока все коллекции и графики снова загрузятся в ОЗУ.Для нашего набора данных это занимает около 1-1,5 часа, и вы не можете использовать ArangoDB, пока он «перезапускается».

Мой вопрос: как я могу ограничить использование оперативной памяти ArangoDB, скажем, до 54 ГБ, так что это никогдадостигает жесткого предела памяти, установленного для док-контейнера?

Ответы [ 2 ]

0 голосов
/ 29 января 2019

да, верно, эти конкретные параметры предназначены для RocksDB (кроме --cache.size).Вероятно, в вашем случае лучше перейти на ROcksDB, что имеет несколько преимуществ:

  • блокировки на уровне документа
  • поддержка больших наборов данных
  • постоянные индексы

И вы также можете ограничить потребление памяти (начиная с 3.3.20 в Linux).В MMFILES и коллекции, и индексы должны умещаться в памяти.

0 голосов
/ 29 января 2019

В 3.3.20 ArangoDB вводит параметр {{total-write-buffer-size}}, который ограничивает буфер записи.Вы можете попробовать добавить это в свой файл конфигурации:

[rocksdb]
block-cache-size = <value in bytes>  # 30% RAM
total-write-buffer-size = <value in bytes>  # 30% RAM
enforce-block-cache-size-limit = true

[cache]
size = <value in bytes>  # 20% RAM

или передать параметр в командную строку:

arangod --cache.size <value in bytes>  # 20% RAM \
    --rocksdb.block-cache-size <value in bytes>  # 30% RAM \
    --rocksdb.total-write-buffer-size <value in bytes>  # 30% RAM \
    --rocksdb.enforce-block-cache-size-limit true 

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

...