не хватает памяти - PullRequest
       18

не хватает памяти

2 голосов
/ 19 июня 2019

Я пытаюсь выяснить, почему моему приложению kafka-streams не хватает памяти.Я уже обнаружил, что rocksDB потребляет много встроенной памяти, и я попытался ограничить ее следующей конфигурацией:

# put index and filter blocks in blockCache to avoid letting them grow unbounded (https://github.com/facebook/rocksdb/wiki/Block-Cache#caching-index-and-filter-blocks)
cache_index_and_filter_blocks = true;

# avoid evicting L0 cache of filter and index blocks to reduce performance impact of putting them in the blockCache (https://github.com/facebook/rocksdb/wiki/Block-Cache#caching-index-and-filter-blocks)
pinL0FilterAndIndexBlocksInCache=true

# blockCacheSize should be 1/3 of total memory available (https://github.com/facebook/rocksdb/wiki/Setup-Options-and-Basic-Tuning#block-cache-size)
blockCacheSize=1350 * 1024 * 1024

# use larger blockSize to reduce index block size (https://github.com/facebook/rocksdb/wiki/RocksDB-Tuning-Guide#difference-of-spinning-disk)
blockSize=256 * 1024

, но, тем не менее, использование памяти кажется неограниченным, и мой контейнерв конце концов получает OOMKilled.

Я использовал jemalloc для профилирования использования памяти (, как описано здесь ), и результат ясно показывает, что ответственность лежит за rockDB, но я понятия не имею, как еще больше ограничить использование памятиof rocksDB.

jemalloc profiling

Не знаю, полезно ли это, но для полноты вот статистика, собранная из работающего экземпляра rocksdb:

rocksDB statistics

Рад любым подсказкам

Ответы [ 2 ]

1 голос
/ 19 июня 2019

Видите ли вы рост использования памяти быстро или в течение более длительного периода времени?

Мы нашли и исправили несколько утечек ресурсов в RocksDB, которые могли бы вызвать утечки памяти:

Есть некоторые признаки того, что могут быть и другие (https://issues.apache.org/jira/browse/KAFKA-8367), либо в нашем использовании RocksDB, либо в самом RocksDB.

О, еще одна идея заключается в том, что если вы используете итераторы из хранилищ состояний, либо в ваших процессорах, либо в Interactive Query, вы должны их закрыть.

Помимо поиска утечек, боюсь, у меня нет особого понимания диагностики использования памяти RocksDB. Вы также можете ограничить размер Memtable, но я не думаю, что мы все равно установим его очень большим по умолчанию.

Надеюсь, это поможет,

-John

0 голосов
/ 09 июля 2019

Я выяснил, что вызвало это.

Я думал, что в моем приложении kafka streams будет только один экземпляр rockDB. Но есть один экземпляр на раздел потока . Итак, эта конфигурация:

blockCacheSize=1350 * 1024 * 1024

Не обязательно означает, что объем памятиcksDB ограничен 1350 МБ. Если приложение имеет, например, 8 назначенных потоковых разделов также имеют 8 blockCache и, следовательно, могут занимать до 1350 * 8 = ~ 11 ГБ памяти.

...