Настроить, Войти
Работа Индимедии
автор a., дата 2010-02-03 11:32, исходное сообщение, textile, комментариев: 2

Первоисточник обоих проблем — утечка памяти в движке Samizdat. Сайт начинает использовать столько памяти, что сервер сначала тормозит, а потом просто останавливает движок (срабатывает система Linux Out-of-memory Killer). Повторить эту утечку в лабораторных условиях, то есть на собственном компьютере, до сих пор никому так и не удалось, а вести отладку прямо на хостинге мы не можем. Из-за этого невозможно выяснить, связано ли это с особенностями хостинга (виртуальный сервер на Linux+vserver), ошибкой в коде Samizdat, в версии интерпретатора Ruby, или порождается каким-либо хитроумным запросом (возможно, злоумышленным, но маловероятно, иначе бы Индимедия ложилась гораздо чаще). Пока мы только заметили, что утечка чаще всего начинается вскоре после появления на сайте новых сообщений, так что если мы включим публикацию сообщений гостями и опять начнётся поток спама, сайт будет ложиться гораздо чаще.

Не имея возможности устранить конкретную причину проблемы, исправить ситуацию можно только радикальным образом — изменить систему публикации так, чтобы утечка памяти стала невозможной. Например, реализовать кэширование всего содержимого сайта в виде статического HTML, который можно зеркалировать и раздавать вообще без участия движка. Чтобы это сделать, надо где-то найти опытного Ruby-программиста, у которого найдётся месяц-другой свободного времени для этого проекта. Пока разработкой движка занимается только один человек, всё что мы можем делать — ждать пока это время появится у него.

Комментарии
  • автор seriyvolk, дата 2010-02-03 13:08, ссылка

    А возможна ли смена движка? И почему, например, в других Индимедиях такого не бывает?

  • автор lumpen, дата 2010-02-03 14:25, ссылка

    Эх, генерация статического контента. Священный Грааль самиздата.

    Ошибка действительно может оказаться в runtime Ruby. Вспоминая из опыта как OpenSSL обвязка в Ruby сначала иногда падала в случайный момент времени, а после - просто иногда вставала колом и останавливала исполнение всех потоков.

    Не-освобождение памяти само по себе может привести к такому эффекту на динамических языках. Как то эксплуатировал в промышленных маштабах одну систему на Python - после нескольких сотен тысяч соединений выедало всю память и останавливалось (даже не падало). Впоследствии - разработчики обнаружили ошибку в обработке завершённых SASL/TLS-сессий и теперь система работает как часы.