Обмеження швидкості віддачі nginx

Стандартних засобів имхо для цього не передбачено. Але думається ви можете написати модуль для енжін який вважає розміри пакетів Х за секунду і покладає спати sender thread на що залишилися до наступної секунди До мілісекунд, якщо віддали більше ніж потрібно (Х> N).

Наприклад, я робив якось (не для енжін, але для подібного асинхронного процесингу - все atomic):


Ця атомарна функція з невеликою похибкою (і малими витратами) обмежує швидкість пулу в якому на віддачі буде викликано цю функцію.

покладає спати sender thread
Якого в nginx немає. Завдання в принципі ефективно не наважується на рівні nginx.

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

Ну а спроба реалізувати це самому - означає глибоко закопатися в ядро ​​nginx і після цього все життя підтримувати свій форк, мерджа тонни змін щотижня, щоб в один прекрасний день виявити, що ми самі це реалізували, але завдяки великому досвіду краще і ефективніше. =)

Ну почнемо з того, що поклавши його спати, він не зможе обробляти вхідні дані, приймати з'єднання, працювати з бекенд в цей момент, і багато іншого, чим займається Воркер значну частину часу. Згоден, але ...
По-перше лягають спати тільки Воркер, які намагаються відправити щось ...
По друге на кілька мілісекунд (макс. Секунда якщо дуже вже швидкий канал / бекенда).
По-третє годі й класти спати а відправити його робити щось інше (це вже не функція з трьох рядків, але тим не менше).
Ефективно не наважується тому, що nginx в цілому просто не володіє інформацією про те, скільки він сумарно відправив даних за одиницю часу. Воно й не треба, це знає моя функція DoCheckSpeed, змінна Speed. Подивіться уважно ще раз на мій код. Це считатся атомарному для всіх потоків викликають DoCheckSpeed ​​з розміром поточного відправляється пакета. Speed ​​містить сумарний розмір усіх відправлених пакетів за останню секунду в KB.
256 Воркер чи ні, абсолютно не важливо.
До речі пробував на своєму рішенні працює прекрасно (навіть коли просто кладемо спати). Єдина відмінність від енжін у мене на ринг буффер організований пул, де є writer (sender), а є reader (receiver).

Схожі статті