Утечка соединения MGO после нескольких сессий.
Я пишу REST API в Go, используя MongoDB в качестве базы данных и mgo в качестве драйвера. Для роутера я использую обычный: пи.
При запуске программы я создаю мастер-сессию mgo.Session, а затем, для каждого обработанного запроса, копирую мастер-сессию и закрываю ее по завершении.
Но, когда несколько запросов обрабатываются одновременно, я наблюдаю, что соединение MongoDB все еще открыто, хотя я закрывал каждую скопированную сессию mgo.Session.
Вот пример вывода команды lsof:
milano-ru 18790 neel_v 118u IPv4 34115804 0t0 TCP localhost:44238->localhost:27017 (ESTABLISHED)
milano-ru 18790 neel_v 119u IPv4 34115812 0t0 TCP localhost:44241->localhost:27017 (ESTABLISHED)
milano-ru 18790 neel_v 120u IPv4 34115813 0t0 TCP localhost:44242->localhost:27017 (ESTABLISHED)
milano-ru 18790 neel_v 121u IPv4 34115814 0t0 TCP localhost:44243->localhost:27017 (ESTABLISHED)
milano-ru 18790 neel_v 122u IPv4 34115815 0t0 TCP localhost:44244->localhost:27017 (ESTABLISHED)
Итак, через пару часов мое приложение работает, оно перестает работать, так как не может открыть другое соединение с MongoDB, поскольку достигнут предел (1024).
Я читал об увеличении ulimit MongoDB, но действительно ли это решение?
1 ответ
Я немного расстроен и в то же время испытал облегчение, но я нашел свой ответ сразу после того, как опубликовал свой вопрос...
После проверки сеансов mgo, я вижу, что набор Dial, по умолчанию, maxPoolSize 4096... После попытки уменьшить размер пула это решило мою проблему.