Тупик в Mongodb Java-драйвер - PullRequest
0 голосов
/ 29 декабря 2018

У меня есть многопоточное Java-приложение с моими ~ 5 потоками (а также многими потоками с веб-сервера Jetty), некоторые из них время от времени читают / пишут mongodb.Некоторые записи интенсивны, когда я читаю 200K mongodb объектов, но они не происходят непрерывно, они происходят раз в несколько минут.Несколько часов приложение работает отлично, но позже я вижу такую ​​ситуацию:

enter image description here

Монго не выполняет никакой работы, насколько я понимаю:

enter image description here

Вот мой вывод jstack:

https://gist.github.com/stiv-yakovenko/06b0d235fd2c32d839788edf56aaa6cd

Вы можете видеть, что все темыждет одного потока, который, в свою очередь, ожидает монго, в то время как монго ничего не делает .До возникновения проблем здоровая ситуация такова, что никто больше не ждет потоков, потому что нагрузка не так высока, чтобы все блокировать.До mongo я использовал mapdb для хранения одних и тех же данных, и у меня никогда не возникало подобных проблем.

Я видел такую ​​же ситуацию с несколькими потоками, ожидающими mongo, поэтому я решил поместить все вызовы mongodb в один ReentrantLock (правда).Я надеялся, что rootcause - слишком много потоков, которые хотят получить доступ к Монго, но это не помогает.Я не знаю, что делать, пытался воспроизвести проблему простым кодом, но не могу.Любые идеи?

UPD: вот вывод jstat как один из запрошенных комментариев:

enter image description here

1 Ответ

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

Ну наконец-то оказалось, что это была сборка мусора.Я закончил тем, что использовал сборщик мусора G1.Но этого было недостаточно, потому что он не мог обеспечить требуемую задержку (хотя она была близка к ней).Мне пришлось разделить приложение на две части: одну для интенсивных вычислений, генерирующих мусор, другую для веб-ответов с малой задержкой.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...