About

И снова переезд

Начитавшись Ивана Сагалаева решил переехать с TekTonic на Linode.

Основными аргументом в пользу переезда было то, что у Linode есть датацентры в Лондоне, а это должно значительно ускорить доступ к сайту (67 ms у Linode против 146 у TekTonic). Были, конечно и другие проблемы: довольно частые перезагрузки, некоторая кривизна дистрибутива и другие мелкие глюки. Ещё говорят, что Xen VDS работает несколько лучше, чем Virtuozzo.

Но в процессе переезда я столкнулся просто с ужасной работой TekTonic: sales не отвечал неделями, «терялись» письма системе поддержки, ломалось их собственное доменное имя и не синхронизировались ns-сервера.

В целом переезд, практически, закончен. Были освоены новые инструменты: runit — прекрасная система запуска сервисов, не нуждающийся в представлении ngnix и rdiff-backup в качестве замены rsync. Ещё немного ранее был установлен прекрасный fail2ban, который просто работает (хотя можно выполнить тонкую настройку). Не обошлось, правда, без косяков: так webdav nginx’а не может использоваться для синхронизации Zotero, пришлось запускать за nginx’ом lighttpd. А rdiff-backup имеет ужасно многословный синтаксис (почти везде приходится писать абсолютные пути) и выводит странные сообщения об ошибках.

Пока Linode работает просто отлично, сервер стал намного отзывчивее.

P. S.Основное имя теперь xkcd.ru (без www).

Исходники xkcd.ru

Под влиянием LiveJournal userhoverhell‘а наконец-то выложил исходники архива на bitbucket. Если кому-то это интересно, изучайте: bitbucket.org/Davydov/xkcdru.

Помимо этого я начал прикручивать постинг в LJ для архива. В связи с чем я выдрал из Zapys файл lj.py. Теперь lj.py живёт независимой жизнью: bitbucket.org/Davydov/ljpy. Из того, что добавил я, следует отметить (безопасную) challenge-response авторизацию. Написал маленький пример использования. Тимофей Бабич собирается включить обновлённую версию lj.py обратно в Zapys.

Ну и до кучи выложил исходники grtoolkit там же. Исходники самого расширения легко достаются из .XPI, интерес представляет лишь система сборки, которая в .XPI не попадает. Система довольно странная (на основе препроцессора GPP), но для меня удобная.

Проблемы Google Reader

Некоторое время назад решил сделать главную страницу архива редиректом HttpResponseRedirect на последний переведённый комикс.

Столкнулся с двумя проблемами. Во-первых, Google теперь не знает, как называется сайт, и в поиске выдаётся ссылка на главную страницу с заголовком последнего проиндексированного перевода. Во-вторых, если в Google Reader добавить RSS по адресу http://www.xkcd.ru (а не http://www.xkcd.ru/feeds/xkcd), то Reader берёт название подписки не из соответствующего поля фида, а по названию сайта, то есть по названию последнего переведённого комикса.

Интересно, что с этим теперь делать?

Стресс-тест

Напомню, что недавно я столкнулся с тем, что в какой-то момент сервер затыкался и переставал отдавать данные наружу. Перезагрузка Apache, как правило, помогала.

Мои наблюдения показали, что дело было в расходе оперативной памяти. Постфактум я попытался удостовериться, что правильно диагностировал проблему.

Сначала решил попробовать httperf от HP, но нагрузка, которую он создаёт, слишком далека от реальной (вероятно, можно что-то сделать, чтобы приблизить условия к боевым, но сходу ничего не придумалось).

Решил сделать свой небольшой стресс-тест:

#!/bin/sh
COUNT=5
for site in $@; do
  for num in `seq $COUNT`; do
    out=`mktemp -d -p .`
    wget --append-output=log --no-verbose --mirror -P $out $site &
  done
done

Этот скрипт на каждый URL, переданный ему в качестве параметра, создаёт COUNT Wget’ов, рекурсивно выкачивающих сайт. Никакой статистики скрипт не отдаёт, но можно в живую понаблюдать за расходом памяти, например, при помощи htop.

На моём сервере крутится архив переводов (два экземпляра), этот блог и несколько редко используемых legacy PHP скриптов. На всё это отводится 294 Mb.

Для тестирования я передавал скрипту 3 URL’а: архив, блог и один из PHP скриптов. Итого 15 Wget’ов. Помимо этого я периодически при помощи Firefox’а проверял, откликается ли сервер.

Итак, что же показал тест? При работе Apache через 5 минут свободная память заканчивалась, и начинал расти своп. На запросы сервер отвечал, но иногда с огромной задержкой. В том случае, если в качестве сервера выступал lighty, максимум, которого мне удалось достичь — это 142 Mb.

В общем, ничего удивительного. Насколько я понимаю, высокое потребление памяти
mod_python — это общеизвестный факт. И, наверняка, есть масса способов уменьшить потребление памяти в Apache. С другой стороны, мне нужно лишь небольшое подмножество функций Apache, так что переход на lighttpd — это неплохо: там и конфигурация чуть более очевидная, и ресурсов ему нужно меньше, и со статикой он работает лучше.

lighttpd

За некоторое время MySQL и Apache 2 съедали всю доступную память. Решил вопрос радикально: установил lighttpd с FastCGI.

Потребление памяти радикально уменьшилось. Посмотрим, что будет под нагрузкой. В статье пишут, что lighty течёт.

Документация по настройке django+lighttpd есть, но она не подробная и не актуальная.

mod_rewrite у lighttpd не так крут, но мне его хватило.

Проблема reCAPTCHA

Проект reCAPTCHA фактически стал стандартом в мире «капч». На мой взгляд, главная проблема состоит в том, что программа не умеет по-настоящему скрывать, какие слова она уже знает, а какие — пока нет.

Приведу несколько примеров:

reCAPTCHA

reCAPTCHA

reCAPTCHA

Выше мы можем легко определить, что нечитаемое слово — это то, которое reCAPTCHA не знает.

reCAPTCHA

А в этом случае всё ещё более тривиально: незачёркнутое слово пока не распознано.

Во всех четырёх случаях мы можем ввести только одно из двух слов, и reCAPTCHA будет считать, что мы всё сделали правильно. Если эффект халтурного ввода капчи станет массовым, то это может существенно ухудшить качество распознавания книжек.

GB2312

Нет. Я не пользуюсь и не буду пользоваться этой ужасной почтой.

Однако меня поражает упорство этой компании. Если отсутствие RSS и изобретение нестандартных полузакрытых протоколов ещё как-то можно объяснить экономической целесообразностью, то абсолютное нежелание поддерживать кодировку GB 2312 я понять не могу.

Да, это безусловно странно, что google mail иногда использует именно эту китайскую кодировку для отправления исходящих писем на русском языке. Однако учитывая линейные размеры моськи по отношению к слону, они бы могли позаботиться о такой мелочи как кодировка.

Естественно, я писал письма в поддержку и получил гордое молчание в ответ. Как решить проблему? А очень просто, настроить переадресацию на нормальный почтовый ящик.

Обновление архива

Очередное небольшое обновление архива.

Список изменений:

  • Кнопка добавления в закладки.
  • Теперь кликнув на непереведённый комикс можно попасть на страничку с ним. Только для залогиненных.

И самое главное, Андрей любезно согласился выделить нам домен xkcd.ru.

Спасибо, Андрей!

Обновление архива

Сегодня был свободный час, так что я обновил архив переводов xkcd.

Список изменений:

  • По умолчанию теперь показывается последний переведённый комикс.
  • Как побочный эффект, теперь записи в RSS сортирются по дате публикации. Вероятно, пользователи некоторых RSS-читалок это заметят.
  • Кстати, RSS фид теперь указывает на правильный адрес архива.
  • Убрана дурацкая ссылка на википедию из меню навигации.
  • Теперь старые ссылки на неопубликованные переводы (вида http://xkcd.myths.ru/777/1223398281/) продолжают работать после публикации перевода.

Время простоя, как всегда, маленькое. На этот раз несколько секунд (с момента изменения таблицы до перезапуска Apache).

Прикладная география

Ping до нового сервера идёт около 180 мс. Думаю, неприятные задержки при открытии страниц во многом связаны именно с этим.

Хостинг TekTonic находится в Атланте (Джорджия). Расстояние от Москвы до Атланты составляет порядка 8700 км.

Если поделить расстояние на скорость распространения электромагнитного сигнала, то мы получим задержку порядка 30 мс. А если учесть то, что сигнал передается отнюдь не по кратчайшему маршруту (возможно, даже через спутник), и огромное количество оборудования стоящего на пути (traceroute показывает 18 прыжков), то отличие всего в шесть раз кажется не таким уж плохим.

Эх, как же сделать, чтобы сайт по-быстрее открывался?