Инженерный день
Воскресенье, 23 марта. Хроника событий, посвященная техническим работам над сервером Hello ACY.
Черт меня дернул с утра посмотреть top на сервере. Вверху списка висело процессов 20 python’a, старательно раздающих контент пользователям. Для Hello ACY такое количество инстансов — это чертовски много.
tail -f access.log мгновенно засыпал экран записями о том, что раз в секунду чей-то RSS клиент забирает нашу ленту. Лента — это около 23 килобайт на запрос, в час - около 80 мегабайт, и так далее.
Первая часть проблемы была решена банально: кеширование отдаваемых данных. На стороне сервера генерировался результирующий xml файл и складывался в memcached на пять минут.
from django.core.cache import cache
from django.http import HttpResponse
from syndication.feeds import ComicsAndBlogFeed
def comics_and_blog(request):
content = cache.get('helloacy:rss')
if not content:
feed = ComicsAndBlogFeed()
content = feed(request).content
cache.set('helloacy:rss', content, 300)
return HttpResponse(content, mimetype='application/rss+xml')
nginx получил соответствующее правило, по которому он брал данные напрямую из памяти, не трогая django. Если данные отсутствовали в memcached, запрос направлялся к бэкенду.
location ~* ^/rss/$ {}
set $memcached_key "helloacy:rss";
add_header Content-Type "application/rss+xml; charset=utf-8";
memcached_pass 127.0.0.1:11211;
error_page 404 502 504 = @fallback;
}
Нагрузка на сервер вернулась к прошлым значениям, оставалось только одно: по-прежнему уходил трафик. Проблема разрешилась весьма неожиданно, из access.log был найден IP адрес клиента, и внезапно, по нему найден и сам владелец RSS читалки. Не пользуйтесь, в общем, RSS reader’ом для Miranda IM, он невероятно кривой.
После этого я наконец-то прибрался на сервере и в конце концов решил перезагрузить VPS.
Когда через минуту ssh продолжал отказываться подключаться, ссылаясь на то, что нет на той стороне никакого сервера, я начал слегка паниковать и открыл контрольную панель хостера.
Я начал нервничать еще больше, потому что сайт хостера тоже перестал открываться. Беглый поиск по твиттеру показал, что у хостера упал один дата-центр в Далласе и еще два из-за этого теперь перегружены. Клиенты хостера уже начали ругаться, а я неудомевая пытался понять, действительно ли я перезагрузил вместе с VPS и весь дата-центр?
Через двадцать минут хостер сообщил, что у их collocation провайдера лег один из роутеров, и все системы уже работают в обычном режиме.
После этого я точно решил поставить что-нибудь для мониторинга работы демонов и установил monit. Отличное воскресенье.