Почему тормозит сайт или как Seahost искал иголку в стоге сена

Не редкость, когда клиенты обращаются с просьбами «Сайт тормозит, не знаем в чем причина. Гляньте,а», «перепробовали всё, пересмотрели любые закоулки сайта — проблемы не нашли, а сайт всё равно тормозит, страницы грузятся еле-еле».

У нас, как у специалистов, которые не раз и не два решали такие проблемы тоже есть свой чеклист. Сначала смотрим на очевидные вещи, затем выискиваем проблемы позаковыристей, ну а если и это не помогает, перелопачиваем чуть не весь сайт в поисках проблемы. Но этот случай был из ряда вон выходящим.

Новый клиент обратился с типичной проблемой: сайт тормозит под нагрузкой, касса сайта не работает, платежи не проходят. Админы хостинга, на котором размещался сайт клиента, сделать ничего не смогли. Поначалу мы тоже ничего не поняли.

Сайт тормозит, а должен летать. Не летает. Почему?

Стандартная проверка результатов не дала: всё на месте, всё работает. LA невелик, медленных запросов к базе нет. Сайт просто не должен тормозить, а должен, что называется «летать», обрабатывая запросы мгновенно или близко к тому, но…на практике картина была совсем другой.

Решили дождаться ночи, чтобы дать нагрузочные тесты (ночью посещаемость ниже и если вдруг случится непредвиденное, это не приведет к ощутимым для клиента проблемам). Результаты ночного тестирования просто шокировали: на 8-ми ядерном сервере работа не параллелится вообще! 1 запрос в секунду работает секунду. 2 запроса в секунду — отрабатывают уже 2 секунды каждый. 10 — 10 секунд. Это не лезет ни в какие ворота! Такая работа сервера говорит о явной проблеме, нестыковке, баге.

Как найти ошибку, если ошибок не выявлено?

как Seahost искал иголку в стоге сена

как Seahost искал иголку в стоге сена

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

Может проблема где-то в логике приложения?

Полезли изучать код, и наткнулись на папку files с бесчисленным множеством файлов внутри. В коде нашли на каждый запрос fopen() в эту папку с уникальным именем файла и запись данных. Ларчик открывался просто — программист забыл выключить отладочный лог. Поначалу это не представляло никаких трудностей: сайт работал отлично, никаких тормозов не было. Но со временем количество файлов в папке выросло и отладочный лог проявился во всей красе: сайт начал работать всё хуже и хуже, а видимых проблем так никто и не обнаружил, пока специалисты Seahost не перелопатили весь сайт и добрались даже до его кода. Не говоря уже о том, что сервер заоптимизирован вусмерть, из него выжаты последние капли.

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

Мораль этой поучительной истории — в оптимизации сайта, сервера не бывает мелочей. Любая самая незначительная «мелочь» сейчас может отразиться на работе сайта и бизнесе в целом весьма печально. И такую «мелкую» проблему будет ох как непросто обнаружить. Как иголку в стоге сена.