Как я боролся с лагами на сайте

Обзор проблемы и её возможный источник

Началось всё довольно невинно, проверял в очередной раз работу пагинатора, думал как бы улучшить его так, чтобы не лезть на сервер. Как вдруг жду загрузку страницы уже как 10 секунд, потом 20, потом минуту. Я так и не дождался.
Ну класс, наверное опять напортачил в JS или ещё хуже в Django представлении. Сделав быструю интроспекцию кода и протестировав его несколько раз, я не нашёл ошибки.
Это вдруг стало интересно и п****ц как угнетать _(┐「ε:)_. Ведь с такой работой сайта мои поведенческие факторы резко упадут. И я начал думать, что могло статься с сайтом. Есть 4 возможных источника проблем:
  • У меня просто плохой интернет и плохо ловит.
  • Какие-то проблемы с сайтом
  • Какие-то проблемы с браузером
  • Какие-то проблемы с сервером
Первый вариант отпал, проверив скорость связи, я двинулся дальше.

Возможно проблема в моём сайте

Со вторым вариантом, предстояло разобраться. Видишь ли, задержка была не только на страницах пагинации, а на всём сайте. Даже админка, и та испытывала задержки. Что общее связывало обычные статические страницы, пагинатор, статьи и django-админку? Только одна вещь - это модели. Я подумал, хм …, а может я как-то плохо делаю запросы в базу данных? И этот вариант то же отпал, ибо я ни как не влияю на то как делаются запросы в базу данных со стороны админки, но она тоже лагает.
Тогда, может дело в самих моделях? Я недавно очень сильно их менял и создал не мало миграций. Что конечно могло повлиять на общую скорость, но единственным способом проверить это, значит снести всю базу данных и пере заполнить её ещё раз ВРУЧНУЮ. Да, конечно, она не сильно большая, 25 статей 65 определений, 30 вопросов ещё 20 инструментов и архивов. Но чёрт, я отложил этот вариант на потом. Да и судя по проектам которые я видел, мои 10 миграций это ничто, по сравнению с ними.
Шеврон Забавный факт. Я обнаружил пару проблем с пагинатором в ходе этого расследования. Например, я плюсовал строку и число, там где проводилась проверка на необходимость добавлять триггер-элемент, который бы подгружал новые посты. Как до этого пагинатор работал я бес понятия (⁄ ⁄•⁄ω⁄•⁄ ⁄)
Шеврон Ещё один забавный факт. Несмотря на то, что мой сайт не являлся причиной проблем задержек, я протестировал большую часть кода на время выполнения. И там где оно было очень большим, я оптимизировал его и сделал быстрее.

Может, браузер проблема

Третьим вариантом было то, что у меня что-то с браузером. По этому я пересел на хром, и не поверите, сработало. Ну ..., то есть почти. Лаги и задержки остались, но хром дождался и в конце концов возвращал мне необходимые страницы. С админкой было то же самое.
пример задержавшегося запроса в хроме
Как ты можешь видеть, целых десять секунд хром просто ждал. И в документации хрома сказано, что Stalled состояние значит, цитата:
Шеврон
Chrome documentation
  • Есть запросы с более высоким приоритетом.
  • Для этого источника уже открыто шесть TCP-соединений, что является пределом.Применяется только к HTTP/1.0 и HTTP/1.1.
  • Браузер ненадолго выделяет место в дисковом кеше.
Теперь нужно узнать какая ошибка возникает при попытке достучаться до сервера. Для этого нужно сделать дамп сетевой активности, во время запроса на сервер. Введём chrome://net-export такой запрос в поиск и начнём записывать наш дамп.
После того как я поймал очередной простой и записал дамп нужно будет его ещё прочитать. Откроем https://netlog-viewer.appspot.com/#import и перейдём в EVENTS. Найдём соответствующее событие. В моём случае это был запрос страницы пагинации статей.
причина появления ERR_HTTP2_PING_FAILED
Откроется ещё одно окно в котором можно найти огромный скачок во времени:
пример вывода результата работы сетевого дампа хрома
Здесь можно выделить ошибку ERR_HTTP2_PING_FAILED. Эта ошибка говорит, что «клиент», то есть браузер, не дождался ответа на запрос. По этому он попытался сделать ещё один запрос и о чудо, сервер ответил. И чтобы наверняка убедиться что эта проблема не связана с работой браузера я ещё сделал следующие вещи, которые не помогли:
  • Обновил браузеры до последних версий (они уже были у меня)
  • Очистил кеш и куки
  • Отключил все расширения
  • Отключил эксперементальную фичу QUICK (только для хрома)
  • Очистил DNS кеш
Полный список, того что можно было бы сделать в такой ситуации ты найдёшь на сайте https://10web.io/blog/resolving-the-err_http2_protocol_error/

Тогда, дело в хостинге

Всё это оставило меня с последним вариантом, что-то с сервером и хостингом. Но я так ничего и не нашёл. Ни в одном из доступных мне конфигурационных файлах. И начал думать о том, чтобы обратиться в службу поддержки хостинга. Хотя перед этим шагом, чтобы не обвинять их зря, ведь возможно я что-то упустил или не досмотрел. Было решено развернуть сайт на другом хостинге и посмотреть что будет там.
Славу всем ДНС серверам и двоичному коду, до этого не дошло.
Давай вернёмся в самое начало, где я проверял качество интернета. Так вот, я решил проверить сам IP. То есть поменять его используя VPN и прокси. И вот свершилось, без каких-либо задержек (учитывая тот факт, что я использую VPN). То есть мой IP, каким-то образом попал в чёрный список beget и теперь нужно его от туда вытащить, или просто использовать прокси для доступа к сайту.
Вот такое вот небольшое расследование я провёл. Чувствую себя как мамин хацкер или даже пентестер ( ^◡^)

сердце
0
3 соединённые точки
0

Использованные термины

Релевантные вопросы