Всем mongo, пацаны!

Тут такое дело — я пытаюсь сговнякать один сервис, и чтобы не показаться мудаком, скажу что черновую версию я решил сговнякать на PHP + MongoDB, чтобы проверить как оно вообще будет работать. Потом конечно же перепишу это на NodeJS, но суть не в этом.

Mongo постоянно падает с ошибкой connection refused because too many open connections: 819 of 819, я уже не знаю что делать, хнык. 🙁

Подробнее инсайде.

18 Responses to Всем mongo, пацаны!

  1. Enooff:

    То, что мое приложение создает коннекшны быстрее чем они успевают закрываться — это очевидно, поэтому первое что я сделал это прописал флажок для создания persistent коннекшнов.

    $Mongo = new Mongo(«localhost:27017»,array(«persist» => «trololo»));

    Но всё равно! В логах как появлялись пачками сообщения типа
    connection accepted from 127.0.0.1:33858 #35675
    так и появляются! 🙁
    Далее я прописал во всех курсорах timeout = 100, чтобы они умирали как можно быстрее, но это тоже не помогло.
    И что самое тупое — MongoPool::info() возвращает мне какую-то хуету, говоря что размер пула у меня неограничен, и число активных соединений всегда 1.

    Я не знаю что делать. 🙁 Версия Mongo 1.6.4, операционка — Debian.

  2. Xxxno:

    Закрывает ли за собой скрипт дверь?
    Есть ли класс, в деструкторе которого прописан дисконнект от базы?

  3. Enooff:

    Ну вот я может туповат, но не нашел способа явно дисконнектнуться от монги:

    http://www.php.net/manual/en/class.mongo

    Connect есть, а disconnect-а нету.

  4. Xxxno:

    какой же ты молодец, бро!
    правильно, оставь базе данных отключать твой тупак по таймауту.

  5. Enooff:

    , : О, господи, какой же я тупорылый. 🙁 Надо больше спать.

    Спасибо, друзья. 🙂

  6. KapCap:

    в мане написано: You do under normal circumstance never have to do this. If you are connected to a replica set, close() will only close the connection to the primary.
    это какбэ подразумевает, что в нормальных условиях соединение закроется автоматом. видимо у тебя это не происходит. тогда нужно искать причину, а не городить городушку из костылей.
    может при формировании ответа ты генеришь новый коннкет для каждого обращения к монге? или 1 коннект на 1 запрос, тогда подумай почему он не дохнет.

  7. Enooff:

    Эээ, «тогда подумай почему он не дохнет» — это то чем я, собственно занимаюсь. 🙂 Потому что по всем приметам — должен дохнуть. А еще я обновился до 2.0.4, сейчас попробую еще раз — посмотрим что получится.

  8. KapCap:

    а сколько у тебя php-шных процессов запущено?

  9. Enooff:

    Он как модуль апача работает, так что по количеству одновременных запросов. Где-то 30-50. Но не 819 точно.

  10. Enooff:

    Хм, да. Если их закрывать руками, то она закрываются нормально.

  11. Xxxno:

    прикинь, да?

  12. Enooff:

    Ну, если честно я по наивности считал, что persist решит все мои проблемы и каждый раз я буду цепляться к тому же самому коннекшну. Ан нет, пришлось открывать и закрывать каждый раз. Нет в мире совершенства. 🙁

  13. DraSwet:

    ulimit не повышал? обычно коннектов мало бывает из-за этого

  14. Enooff:

    Нет, не стал — пока все решилось принудительным закрыванием коннекшна. 🙂

  15. PitMega:

    Выкинь монгу, реальные посоны юзают редиску.

  16. Enooff:

    У меня данные меняются не так часто, так что Монго — ок. Между ней и клиентом еще мемкэш висит.
    Я больше в сторону membase смотрю.

  17. PitMega:

    я пробовал Membase, когда он еще им был (не Couchbase)
    *) Проседание по перформансу ~20%
    *) Регулярное падение при full import / flush
    *) Очень долгое время поднятия и «разогрева» кеша
    В итоге еще немного погоняли и отказались от этого решения, так как business critical.
    Как сейчас дела обстоят, не скажу, не знаю.

Добавить комментарий