четверг, 5 марта 2009 г.

Когда робот страшнее DDoSа

Совмещение косяков различного софта иногда дает потрясающие эффекты.  Буквально пару дней назад, один из сайтов, находящихся в моем ведении стал вести себя очень подозрительно. С внешней стороны создавалось впечатление, что сайт находится под постоянной DDoS-атакой или на сервере что-то медленно умирает. Остановка сервера, перезагрузка, проверка памяти/диска и повторный запуск не помогли -- сразу после поднятия Apache эффект возобновился. Но судя по netstat'у все признаки DDoS-атаки отсутствовали. Более того, график mrtg не показывал увеличения входящих соединений, а даже их некоторое снижение.

Лишь подключение к серверу БД и show full processlist дало частичный ответ почему сайт так странно себя ведет. На нашем сайте (это онлайн игра) есть несколько страниц, связанных с отображением данных из довольно объемной таблицы. Скрипт, отвечающий за эту страницу был написал кривовато, что вызывало при обращении к этой странице небольшие lock'и у остальных запросов. Данные из таблицы отображались в количестве 100 строк на страницу; внизу страницы присутствовал индекс для перехода к остальным данным (всего там было ~10000 страниц по 100 записей на каждой). Время выполнение скрипта в обычном режиме -- около 4-х секунд на страницу, при этом многие важные таблицы lockались на 200-300мсек. Скрипт сильно устарел, таблица была с кривыми индексами и все это явно нуждалось в переделке, но возникал справедливый вопрос -- почему начало тормозить лишь позавчера, а не неделю, месяц или год назад? Страничка с этим скриптом была редкопосещаемой и до текущего момента не влияла на производительность сайта.

Быстрый взгляд в логи апача дал ответ практически сразу же: некий узел производил каждую секунду запрос именно к этой странице. Причем, судя по логам, если этот узел не успевал в течении 1 секунды скачать страницу (а он, конечно же, не успевал), то попытки не прекращались, а инициировался еще один запрос к этой странице, даже не разрывая предыдущий. На момент обнаружения, узел уже дошел до страницы с индексом 60 (из ~10000). И это за более чем двое суток!  На загрузку некоторых страниц он тратил несколько часов и порядка 8000 запросов! Более того, судя по всему загрузка проводилась в несколько потоков, т.к. одновременно шли попытки загрузить script.php?page=60, ..., script.php?page=67. nslookup ip-адреса выдавал обратную зону, принадлежащую одному не очень популярному российскому поисковику. Не умаляя моего косяка, заключащегося в том, что не сразу распознал в чем проблема, и косяков наших php/sql-программистов которые пишут кривые скрипты, мне все-таки очень хочется знать, какой квалификацией обладали люди, разрабатывавшие этот поисковый робот и о чем они думали в процессе его написания. Согласитесь, все-таки 8000 повторных попыток загрузки одной и той же страницы даже nmap в режиме -T5(insane) не производит. ;)

Комментариев нет:

Отправить комментарий