У меня есть топология Apache Storm (v1.2.1), которая использует ShellBolt для выполнения сценария Python (также использует storm-multilang: 1.2.1).
Проблема заключается в том, что на машине заканчиваетсяпамять и рабочий сбой.
/var/log/syslog
показывает, что ядро жертвует дочерним процессом (обычно процессом python), потому что ему не хватает памяти.
При просмотре top
я вижу, что процессы python остаются стабильно используемыми в памяти, но процесс штормового Java постоянно увеличивается, пока рабочий не падает.
Рабочий падает, потому что ShellBolt умирает(потому что ядро убивает процесс python).
При просмотре сводных панелей netdata я вижу, что использование ОЗУ просто увеличивается, и увеличивается и увеличивается количество обработанных кортежей.
Когда я подключаю VisualVMдля работника я вижу, что куча используется только на 50%.Таким образом, похоже, что проблема связана с использованием памяти вне кучи (?).
Я не использую специальный сериализатор для передачи сообщений в / из болта.
Кортеж содержит: [string, jsonified map, base 64 encoded string]
Мой питон-болт испускает дважды, по одному разу на два разных потока.Один испускает: [string, dict]
, а другой: [string, dict, dict]
Ни один из диктов не очень большой.Самый большой из них имеет 5 ключей, все значения малы.
Я попытался резко уменьшить размеры буфера и уменьшить параллелизацию болтов.Поскольку используется только половина кучи, я попытался уменьшить размер кучи.Поскольку куча никогда не заканчивается, рабочий никогда не создает дамп кучи.Поскольку использование памяти кажется нерегулярным, я не вижу, что это было бы полезно в любом случае.
Как я могу найти утечку памяти и устранить ее?Это проблема ShellBolt?