утечка соединения mgo после нескольких session.Copy()

Я пишу REST API на Go, используя MongoDB в качестве базы данных и mgo в качестве драйвера. Для роутера я использую пользовательский: pi.

При запуске программы я создаю мастер-сеанс 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, но действительно ли это решение?


person pikanezi    schedule 13.04.2015    source источник


Ответы (1)


Я немного расстроен и одновременно взволнован, но я нашел свой ответ сразу после того, как опубликовал свой вопрос...

После проверки сеансов mgo я вижу, что Dial установил по умолчанию maxPoolSize 4096... После попытки уменьшить размер пула он решил мою проблему.

person pikanezi    schedule 13.04.2015