Назад | Перейти на главную страницу

Странный случай мистера Время до первого байта

У меня есть веб-сервер на Linode 1024 VPS на основе

И еще пара блогов на основе WordPress 3.3.1. Один из них - обычный блог с конфигурацией по умолчанию, темой и просто сообщением «Hello World» для тестирования сервера. Другой - это блог, клонированный с другого сервера, с почти 10 тысячами сообщений и более чем 10 тысячами комментариев. Этот блог собирает около 5 тысяч уникальных посетителей в день.

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

Htop показывает также "нормальную" нагрузку в Нормальная операция, но аномально большая нагрузка во время теста ab.

Происходит еще одна странная вещь (для меня самая важная): время до первого байта чрезвычайно велико, но после этого подождите, сайт загрузится очень быстро. Это можно легко проверить с помощью таких сервисов, как tools.pingdom.com, что дает этот результат. Обратите внимание на эту желтую область, означающую «Время ожидания».

Почему это происходит? Возможные идеи:

Если кому-то нужна дополнительная информация,

Во-первых, это не ответ, а скорее диагностический подход.

Это ни в коем случае не исчерпывающе - или даже близко, это всего лишь отправная точка.

Время до первого байта

Время до первого байта (TTFB) состоит из нескольких компонентов:

  • Поиск DNS: Найдите IP-адрес домена (возможное улучшение: большее количество / распределенных / отзывчивых DNS-серверов)
  • Время подключения: откройте сокет для сервера, согласовайте подключение (типичное значение должно быть около времени ping - обычно требуется двусторонний обход - keepalive должен помочь для последующих запросов)
  • Ожидание: перед отправкой первого байта требуется начальная обработка (это то место, где должны быть ваши улучшения - это будет наиболее важно для динамического контента.

Когда вы смотрите на вывод ApacheBench, вы также видите:

  • Обработка: это сумма ожидания + полной передачи содержимого (если время передачи значительно больше, чем ожидалось, чтобы загрузить полученное количество данных, происходит дальнейшая обработка (после получения первого байта) (например, страница промывка содержимого по мере его доступности)

Сравнения для исключения компонентов

За некоторыми исключениями, ваша проблема будет заключаться в бэкэнд-обработке, которая обычно сводится к слишком сложному / неэффективному коду или плохо настроенному MySQL.

Хороший способ подойти к этой проблеме - провести серию сравнений, которые устранят различные аспекты вашей установки. Хорошее сравнение должно быть как можно более постоянным, чтобы помочь сузить проблему. В настоящее время вы предоставили следующие сравнения:

  1. Идентичный (клонированный) сайт, работающий на старом и новом сервере:
    • Разница: Сервер
    • Результат: старый сервер работает быстро; новый сервер медленный
    • Примечания: Здесь вам нужно количественно оценить различия между этими серверами - как с точки зрения используемого стека (Nginx и т. Д.), Так и оборудования (старый сервер быстрее, потому что это более мощная машина?)
    • Вывод: код может работать быстро при правильной настройке
  2. Тестовый сайт против полноценного сайта на новом сервере
    • Разница: контент, темы, плагины и т. Д.
    • Результат: тестовый сайт быстрый, полный сайт медленный
    • Примечания: теоретически этот тест должен помочь вам устранить многие аспекты вашей настройки - DNS, сеть, даже настройку nginx / php / mysql - однако это не совсем «честно».
    • Вывод: дополнительный контент оказывает значительное влияние на производительность

Идеальным тестом было бы продублировать весь сайт, а затем удалить все содержимое, кроме одной статьи и связанных с ней комментариев. Цель этого теста - окончательно определить, является ли проблема большим объемом контента или причиной являются другие аспекты вашей настройки (плагины WordPress, тема и т. Д.). По сути, вы сравниваете производительность идентичных сайтов на одном (новом) сервере - загружая одну и ту же страницу (такой же длины и т. Д.) - с той лишь разницей, что общее содержание сайта (например, есть большая вероятность, что какой-то плагин не хорошо масштабируется при увеличении содержания).

Ничего не меняя, вы можете сделать еще несколько сравнений:

  • Тестирование из удаленного места по сравнению с локальным - это поможет определить, является ли причиной сеть, задержка, DNS и т. Д.
    • Вы уже (в некоторой степени) это сделали и в основном пришли к выводу, что у вас нет проблем с сетью.
  • Тестируйте через Varnish (то есть порт 80) против nginx напрямую (порт 8080) - постарайтесь не менять конфигурацию между тестами - просто используйте правильный порт. Это покажет вам влияние лака. Поскольку Varnish является слоем кеширования, он должен очень быстро обслуживать все запросы после первого - по сути, он должен обходить серверную часть и обработку, необходимую для создания динамической страницы, и очень быстро обслуживать кешированную копию.
    • Вы сделали это (хотя и не на месте) и продемонстрировали, что Varnish оказывает значительное положительное влияние на вашу производительность.

Настройка вашего Backend

К этому моменту вы должны были либо найти проблему, либо сделать вывод, что она кроется в вашем сервере. Остается Nginx, PHP или MySQL.

(Я должен упомянуть здесь, что всегда полезно знать, является ли ваше узкое место ЦП, ОЗУ или ввод-вывод - между sar, top, iostat, vmstat, freeи т. д. вы сможете прийти к какому-то выводу по этому поводу.)

Nginx

Nginx просто принимает запросы и либо обслуживает статический контент, либо переключает запросы на PHP-FPM - обычно с Nginx особо нечего оптимизировать.

  • Установить рабочие = # ядер ЦП
  • Включить поддержку активности (значение 10-15 хорошо)
  • Отключить ненужное ведение журнала
  • При необходимости увеличьте размер буфера
  • Избегайте операторов if (по возможности используйте статические имена вместо регулярных выражений, исключите ненужные расширения)

В идеале ваш тестовый блог и клонированный блог должны иметь идентичные конфигурации, и в этом случае вы эффективно устранили проблему Nginx.

заявка

В случае, когда вы пытаетесь определить проблему в своем коде (например, медленный плагин и т. Д.), Медленные журналы - это место для начала.

  • Включите журнал медленной работы MySQL и журнал медленной работы PHP-FPM, запустите тест и посмотрите, что происходит медленно.

MySQL

  • Увеличьте свои кеши и запустите mysqltuner.pl чтобы получить хорошую отправную точку.

PHP

  • отключите ненужные расширения,
  • отключить register_globals, magic_quotes_ *, expose_php, register_argc_argv, always_populate_raw_post_data
  • увеличить memory_limit
  • open_basedir и safe_mode оказывают значительное влияние на производительность, но также могут обеспечить дополнительный уровень защиты. Протестируйте с ними и без них, чтобы определить, приемлемо ли их влияние на производительность.

PHP-FPM

  • Отрегулируйте значения pm. * - увеличьте их, чтобы справиться с высокой нагрузкой

Стоит отметить, что ваши результаты htop показывают, что php-fpm потребляет основную часть процессора - и ваша проблема, похоже, напрямую связана с этим.

Кеширование

После того, как вы оптимизировали каждое вероятное узкое место, начните кэширование.

  • У вас уже есть кеш opCode (APC) - убедитесь, что он работает (он поставляется с тестовым файлом) - проверьте частоту попаданий в кеш и, если возможно, поместите кеш APC в память, а не на диск.
  • Настройте свой код для кеширования (например, с помощью плагина для Wordpress, такого как W3TC)
  • С помощью nginx вы можете настроить кеширование FastCGI, но, поскольку у вас есть Varnish, этого лучше избегать.
  • Настройте слой кеширования, например Varnish (который вы уже сделали), и убедитесь, что он работает (например, используйте varnishstat, прочтите Достижение высокого Hitrate)
  • Добавьте больше кеширования для компонентов вашего сайта - например, MemCached, если применимо

Иногда, учитывая ограничения вашего приложения и оборудования, вы не можете так сильно улучшить производительность серверной части - однако это точка кэширования - чтобы минимизировать использование серверной части.

дальнейшее чтение