Дивний випадок Містера Часу Першого Байта


14

У мене є веб-сервер на Linode 1024 VPS на основі

  • Ubuntu 11.10
  • Nginx 1.0.5
  • PHP 5.3.6 (з PHP-FPM, APC)
  • Лак 3.0.2

І кілька блогів там, заснованих на WordPress 3.3.1. Один з них - це звичайний блог із конфігурацією за замовчуванням, темою та просто повідомленням "Hello World" для тестування сервера. Інший - це блог, клонований з іншого сервера, що містить майже 10 000 публікацій та понад 10 тис. Коментарів. У цьому блозі є близько 5 тис. Унікальних предметів на день.

Сервер дає хороші цифри на тесті ab для тестового блогу , але те саме тестування з клонованим блогом зробити неможливо: тест ab навантажує сервер занадто багато, і я повинен зупинити процес, який у будь-якому випадку змушує ab показати це справді поганий результат .

У HTOP показує також «нормальної» навантаження , коли в нормальному режимі , але є відхилення від нормального великого навантаження під час випробування аб.

Відбувається ще одна дивна річ (найважливіша для мене): Час на перший байт надзвичайно великий , але після цього чекайте, що сайт завантажується дуже швидко. Це можна легко перевірити за допомогою таких служб, як tools.pingdom.com, що дає такий результат . Зверніть увагу на той жовтий регіон, що означає "Зачекайте час".

Чому це відбувається? Можливі ідеї:

  • Неправильна конфігурація PHP-FPM
  • Час відповіді Linode DNS жахливий. Дурниця-тестовий блог вирішує DNS штрафу, TTFB - це фантастично
  • Неправильна конфігурація Nginx

Якщо комусь потрібна додаткова інформація,


Я думаю, це може бути пов'язане з if -fдирективою, яку ви використовуєте в locationконтейнері в nginx config. Виходячи з того, що я читаю тут wiki.nginx.org/Pitfalls , у мене є відчуття, що -fце робиться неефективний пошук файлу, який може викликати проблему «Час до першого байту», особливо якщо у вас є каталоги з великою кількістю файли.
d34dh0r53

1
Кілька думок: а) в чому полягають відмінності від оригінального сервера, з якого клонований блог (наприклад, чи працює він однаковий стек?) B) якщо ви можете, запустіть ab безпосередньо з сервера, використовуючи localhost та порт. Спробуйте отримати доступ через лак, а потім безпосередньо до nginx). в) Увімкніть повільні журнали MySQL та PHP-FPM. г) запустіть mysqltuner.pl і подивіться, чи можете ви покращити продуктивність MySQL (це було б найбільш очевидною різницею між блогами - або плагінами). д) Наданий вами конфігурація PHP-FPM, схоже, не використовується тим, що використовується nginx (/var/run/php5-fpm-tpnet.sock! = /var/run/php5-fpm-www-data.sock)
cyberx86

1
Однозначно проблема PHP. Wordpress дійсно повільний. Ви хочете плагін кешування для нього, щоб отримати пристойний час завантаження, коли у вас є стільки вмісту.
Мартін Фьордвальд

2
Ви сказали, що "можете запустити ab на localhost та отримати 4k req / s" - на який localhost (попередній / поточний) ви звертаєтесь? Якщо це значення з вашого поточного сервера - того, що має високий TTFB, - ваша проблема просто стала набагато цікавішою - оскільки ви ефективно усунули PHP, MySQL та веб-сервер. TTFB включає DNS, час у зворотній час та час обробки. Тривалий TTFB зазвичай обумовлений обробкою (наприклад, PHP / MySQL). Суть запуску ab безпосередньо проти nginx полягає у усуненні інших компонентів. Крім того, Varnish, якщо налаштування правильний, повинен обійти бекенд, даючи дуже високий рівень запиту / с.
cyberx86

1
Ваші локальні тести здаються неправдивими - ви насправді не отримали свій блог. Зауважте різницю у розмірі сторінки: 7500 байт при доступі з домену, 151 байт від localhost. Оскільки у вас, ймовірно, є кілька віртуальних хостів, вам потрібно передати заголовок хосту до ab. ab -n 1000 -c 100 -H 'Host: mysite.com' http://127.0.0.1/Сказане - різниці в кешованому (Varnish) та не кешованих результатах достатньо для підтвердження положення про те, що проблема не пов’язана з мережею, dns тощо і полягає в обробці, як очікувалося.
cyberx86

Відповіді:


24

По-перше, це не відповідь, а діагностичний підхід.

Це аж ніяк не всебічне - або навіть щось близьке, це лише відправна точка.

Час до першого байту

Час до першого байту (TTFB) має низку компонентів:

  • Пошук DNS: Знайдіть IP-адресу домену (можливе вдосконалення: більш численні / розподілені / чуйні DNS-сервери)
  • Час підключення: відкрийте розетку до сервера, домовляйтеся про з'єднання (типове значення повинно бути приблизно в 'ping' час - зазвичай потрібна зворотна поїздка - keepalive має допомогти для наступних запитів)
  • Очікування: початкова обробка, необхідна до того, як перший байт може бути надісланий (саме там має бути покращення - це буде найбільш важливим для динамічного вмісту.

Переглядаючи вихід ApacheBench, ви також бачите:

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

Порівняння для усунення компонентів

За невеликими винятками, ваша проблема полягає в обробці резервного копіювання, яка зазвичай зводиться до надмірно складного / неефективного коду або погано налаштованого MySQL.

Хороший спосіб підійти до цієї проблеми - через ряд порівнянь, які усунуть різні аспекти вашої установки. Хороше порівняння повинно тримати якомога більше постійних, щоб допомогти звузити проблему. На даний момент ви надали такі порівняння:

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

Ідеальним тестом було б дублювати повний веб-сайт, але потім видалити весь вміст, окрім однієї статті та пов’язаних із цим коментарів. Суть цього тесту полягає в тому, щоб остаточно визначити, чи є проблема великої кількості вмісту, чи є причиною інших аспектів вашої установки (плагіни WordPress, тема тощо). Ви по суті порівняли б продуктивність однакових сайтів, на тому ж (новому) сервері - завантажуючи ту саму сторінку (однакової довжини тощо) - з тією лише різницею, як загальний вміст сайту (наприклад, є хороший шанс, що якийсь плагін не виконає добре збільшується зі збільшенням вмісту).

Не змінюючи нічого, є кілька інших порівнянь:

  • Тест із віддаленого місця та локального - це допоможе визначити, чи причина в мережі, затримка, dns тощо
    • Ви вже (дещо) це зробили і здебільшого зробили висновок, що у вас немає проблем з мережею.
  • Тестуйте через Varnish (тобто порт 80) проти nginx безпосередньо (порт 8080) - намагайтеся не змінювати конфігурацію між тестами - просто використовуйте правильний порт. Це покаже вам вплив лаку. Оскільки Varnish є шаром кешування, він повинен обслуговувати всі запити після першого, дуже важливо, він повинен обходити бекенд і обробку, необхідну для створення динамічної сторінки, і дуже швидко обслуговувати кешовану копію.
    • Ви зробили це (хоча не локально) і продемонстрували, що лак має значний позитивний вплив на вашу ефективність.

Налаштування бекенду

До цього моменту ви мали б або знайти проблему, або зробити висновок про те, що вона лежить у вашій програмі. Це залишає вас Nginx, PHP або MySQL.

(Я повинен згадати, що це завжди зручно , щоб знати , якщо вузьким місцем є CPU, RAM, або I / O - між sar, top, iostat, vmstat, free., І т.д. , ви повинні бути в змозі прийти до якогось - або висновку з цього питання )

Nginx

Nginx просто приймає запити і обслуговує статичний контент, або переносить запити на PHP-FPM - зазвичай не так багато для оптимізації за допомогою Nginx.

  • Встановити робітників = # процесорних ядер
  • Увімкнути keepalive (значення 10-15 добре)
  • Вимкнути непотрібні журнали
  • При необхідності збільшуйте розміри буфера
  • Уникайте, якщо оператори (використовуйте статичні назви замість регулярних виразів, де це можливо, усувайте непотрібні розширення)

В ідеалі ваш тестовий і клонований блог мають однакові конфігурації, і в цьому випадку ви ефективно усунули Nginx як проблему.

Застосування

У випадку, коли ви намагаєтесь визначити проблему у своєму коді (наприклад, повільний плагін тощо), повільні журнали - це місце для початку.

  • Увімкніть повільний журнал MySQL та повільний журнал PHP-FPM запускайте ваш орієнтир і дивіться, що виходить як повільний.

MySQL

  • Збільште кеші та запустіть mysqltuner.pl, щоб отримати хорошу вихідну точку.

PHP

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

PHP-FPM

  • Відрегулюйте значення pm. * - збільште їх, щоб справлятися з великим навантаженням

Варто зазначити, що ваші результати htop показують php-fpm як споживаючу основну частину процесора - і ваша проблема, схоже, безпосередньо пов'язана з цим.

Кешування

Після оптимізації кожного можливого вузького місця, починайте кешування.

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

Іноді, враховуючи обмеження програми та апаратного забезпечення, можливо, ви не зможете настільки сильно покращити продуктивність сервера, але в цьому полягає кешування - мінімізувати використання бекенда.

Подальше читання


2
Це фантастичний підсумок аналізів. Дякую вам за коментар, я спробую здійснити важкий тест з усіма цими пропозиціями - деякі з них, як ви вже сказали, вже зрозумілі - і побачите, чи зможу я нарешті виявити проблему. З найкращими побажаннями, cyberx86.
javipas

Про це memory_limit, в іншому дописі було зазначено, що це не допомагає в продуктивності.
forloop
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.