За якими критеріями ви налаштовуєте тайм-аути в налаштуваннях HA Proxy?


37

Як налаштовувати HA Proxy, як ви вирішите, які значення призначити тайм-аутам? Я читав півдесятка зразків у різних блогах, і кожен використовує різні тайм-аути, і ніхто не обговорює, чому.

HAProxy, здається, особливо стурбований клієнтом, підключенням та сервером, про що HAPRoxy видає попередження про те, якщо ви залишитесь повністю неприйнятим:

While not properly invalid, you will certainly encounter various problems
with such a configuration. To fix this, please ensure that all following
timeouts are set to a non-zero value: 'client', 'connect', 'server'.

Документація не приносить ніякої користі в цьому відношенні: вона передбачає «трохи вище кратні 3 секунди» , але не те, чому ви вибрали б кратна 1 проти 100 або 42.

RPM, який я використовую (репозиторій Amazon Linux), встановлює ці за замовчуванням:

timeout connect         10s
timeout client          1m
timeout server          1m

Дві з яких точні кратні 3 секунди, порушуючи єдину офіційну пораду, яку я бачив.

Якщо у вас немає конкретних порад щодо налаштування, можливо, простіше питання: що я можу очікувати, що вийде не так, коли дійсно короткі чи справді тривалі очікування?

Відповіді:


40

TCP RTO (час очікування прийому) починається через три секунди. ( RFC 1122 ) Якщо переданий пакет не повернув підтвердження в той час, він вважається втраченим і повторно переданим. Це майже напевно, про що йдеться у автора. (Зауважте, що RTO динамічно налаштовується вгору або вниз за допомогою різних алгоритмів , поза межами цього питання.)

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

Що стосується ваших користувачів Інтернету, то деякі з них можуть перебувати на дуже високих затримкових з’єднаннях, наприклад, супутникових, і можуть через це повторитись, ніж звичайні ретрансляції. RTT для з'єднання, де використовується супутник, може перевищувати 2000 мс, навіть якщо все добре.

Зважаючи на все це, ви, як правило, хочете дуже коротких timeout connectта довготривалих timeout client.

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


7
Серйозно найбільш ерудований та ввічливий відгук, який я отримав будь-де на StackExchange. Дякую.
Джеремі Вадхамс

5
Що я можу сказати, « Провина сервера» - це лише купа потворних химерностей.
Майкл Хемптон

34

Передмова

Я деякий час налаштовував HAProxy і робив багато тестів на продуктивність. Від 100 HTTP запитів / с до 50 000 HTTP запитів / с.

Перша порада - включити сторінку статистики на HAProxy . Ви потребуєте моніторингу, не виняток. Також вам знадобиться тонка настройка, якщо ви збираєтесь пройти понад 10 000 запитів / с.

Тайм-аути - заплутаний звір, оскільки вони мають величезний діапазон можливих значень, більшість з яких не має різниці, що спостерігаються. Я ще не бачив чогось не вдається через число на 5% нижче або на 5% вище. 10000 проти 11000 мілісекунд, хто дбає? Напевно, не ваша система.

Конфігурація

Я не можу по сумлінні дати декілька номерів як "найкращі тайм-аути для всіх".

Натомість я можу сказати - НАЙБІЛЬШІ агресивні тайм-аути, які завжди прийнятні для балансування навантаження HTTP (S). Якщо ви зіткнулися з нижчими за них, саме час перенастроїти балансир навантаження.

timeout connect 5000
timeout check 5000
timeout client 30000
timeout server 30000

клієнт-тайм-аут:

Час очікування бездіяльності застосовується, коли очікується, що клієнт підтвердить або надішле дані. У режимі HTTP цей час очікування особливо важливо враховувати під час першої фази, коли клієнт надсилає запит, і під час відповіді під час читання даних, що надсилаються сервером.

Прочитайте : Це максимальний час для отримання заголовків HTTP-запиту від клієнта.

3G / 4G / 56k / супутник часом може бути повільним. Однак вони повинні мати можливість надсилати заголовки HTTP за кілька секунд, а не 30.

Якщо у когось зв’язок настільки поганий, що йому потрібно більше 30-х років, щоб надіслати запит на сторінку (тоді більше 10 * 30-х, щоб запитувати 10 вбудованих зображень / CSS / JS), я вважаю, що прийнятно відхилити його.

сервер тайм-аута:

Час очікування бездіяльності застосовується, коли очікується, що сервер підтвердить або надішле дані. У режимі HTTP цей час очікування особливо важливо враховувати під час першої фази відповіді сервера, коли він повинен надсилати заголовки, оскільки він безпосередньо представляє час обробки сервера для запиту. Щоб дізнатись, яке значення туди потрібно поставити, часто добре почати з того, що вважатиметься неприйнятним часом відповіді, а потім перевіряйте журнали, щоб спостерігати за розподілом часу відповіді, і відповідно регулюйте значення.

Прочитано : Це максимальний час для отримання заголовків відповідей HTTP від сервера (після отримання повного запиту клієнта). В основному, це час обробки з ваших серверів, перш ніж він почне надсилати відповідь.

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

Особливий випадок : деякі РІДНІ служби, які виконують дуже важку обробку, можуть зайняти повну хвилину або більше, щоб дати відповідь. Для цього конкретного використання цей час очікування може бути значно збільшений. (Примітка. Це може бути випадком поганого дизайну, використовуйте зв'язок у стилі асинхронізації або взагалі не використовуйте HTTP.)

тайм-аут підключення:

Встановіть максимальний час для очікування успіху спроби з'єднання з сервером.

Прочитано : Максимальний час, коли сервер повинен прийняти TCP-з'єднання.

Сервери перебувають у тій самій локальній мережі, що і HAProxy, тому це повинно бути швидким. Дайте йому принаймні 5 секунд, оскільки це може тривати час, коли трапляється щось несподіване (втрачений пакет TCP для повторної передачі, сервер, який змушує новий процес приймати нові запити, прискорювати трафік).

Особливий випадок : коли сервери знаходяться в іншій локальній мережі або над ненадійною ланкою. Цей час очікування може знадобитися значно збільшити. (Примітка. Можливо, це стосується поганої архітектури.)

перевірка таймауту:

Встановіть додатковий час очікування, але лише після того, як з'єднання вже встановлено.

Встановіть додатковий час очікування для перевірки, але лише після того, як з'єднання вже встановлено Якщо haproxy використовує min ("timeout connect", "inter") як час очікування підключення для перевірки, а "checkout check" - як додатковий час очікування. "Хв" використовується для того, щоб люди, які працюють з дуже довгим "timeout connect" (наприклад, ті, хто потребував цього через чергу чи tarpit), не сповільнювали свої перевірки. (Будь ласка, зауважте, що немає поважних причин для таких довгих тайм-аутів підключення, тому що "черга очікування очікування" та "таймапт тайм-ауту" завжди можна використовувати, щоб уникнути цього).

Прочитайте : виконуючи перевірку стану здоров'я, сервер timeout connectповинен прийняти з'єднання, timeout checkщоб дати відповідь.

На всіх серверах ОБОВ'ЯЗКОВО встановлено перевірку стану здоров'я HTTP (S). Це єдиний спосіб, щоб балансир завантаження дізнався, чи є сервер. Перевірка здоров'я - це проста /isaliveсторінка, яка завжди відповідає OK.

Дайте цьому тайм-ауту принаймні 5 секунд, тому що стільки часу може зайняти, коли трапиться щось несподіване (втрачений TCP-пакет для повторної передачі; сервер змушує новий процес приймати нові запити, прискорити трафік).

Історія війни : Багато людей помилково вважають, що сервер завжди може відповісти на цю просту сторінку за 3 мс. Вони встановлюють агресивний тайм-аут (<2000 мс) з агресивним відмовою (2 невдалі перевірки = сервер загинув). Я бачив, що цілі веб-сайти знижуються через це. Зазвичай спостерігається невеликий сплеск трафіку, сервери бекенда уповільнюються, перевірки здоров’я затягуються ... поки раптом вони весь час закінчуються разом, HAProxy вважає, що ВСІ сервери загинули одразу і весь сайт знижується.

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