TGViewer
about:performance about:performance @troubleperf · 1.5K subscribers
Post #37 1.04K
Рубрика "Вредные советы" ч.1 — асинхронность в Nginx

В интернетах вращается множество статей из разряда "Top Five Tips for <Твоя технология> in 2024", обещающих повысить, ускорить, оптимизировать.

Подобные гайды передаются из уст в уста и заботливо копируются в инфраструктуры, ведь "на прошлом месте работы это помогло!".
И не важно, что это было в 2012 году, на версии Linux kernel 2.4.x, в другом стеке и вообще не у меня, а у знакомого :)

Такой вот cargo cult.

С другой стороны, чем я хуже? У меня тоже есть парочка советов 😁
—————————————————————————————————

Nginx под капотом использует event‑driven архитектуру. Это когда у воркера есть очередь с ивентами, которую он последовательно "перемалывает".

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

Одно из решений — асинхронная обработка событий.

И у Nginx есть что предложить по опциям:
aio threads;
aio_write on;


Теперь вся работа воркера с диском заключается в инициировании запроса, а сам процессинг делегируется отдельным тредам.

Таким образом, воркер способен еще быстрее переключаться между ивентами, ускоряя весь пайплайн!

Пруфы

Измерим latency работы функции ngx_process_events_and_timers (ссылка) — сколько времени уходит на обработку ивента.

1. Без внедрения aio
# funclatency-bpfcc /usr/sbin/nginx:ngx_process_events_and_timers -m -d 100
Function = b'ngx_process_events_and_timers' [147018]
msecs : count distribution
0 -> 1 : 60492 |********************************|
2 -> 3 : 5567 |*** |
4 -> 7 : 3937 |** |
8 -> 15 : 1899 |* |
16 -> 31 : 429 | |
...
avg = 27 msecs, total: 3797767 msecs, count: 136964

2. С aio:
# funclatency-bpfcc /usr/sbin/nginx:ngx_process_events_and_timers -m -d 100
Function = b'ngx_process_events_and_timers' [146165]
msecs : count distribution
0 -> 1 : 103291 |*******************************|
2 -> 3 : 2581 | |
4 -> 7 : 1962 | |
8 -> 15 : 1757 | |
16 -> 31 : 0 | |
32 -> 63 : 374 | |
64 -> 127 : 49 | |
...
avg = 10 msecs, total: 3534364 msecs, count: 342992


Гистограмма показывает значительное сокращение задержек тяжелых операций, а среднее время обработки снизилось почти втрое. Неплохо!
—————————————————————————————————

P.S. Использовать на свой страх и риск, с предварительной проверкой на своей рабочей нагрузке!

Удачи!
  • 👍 8
  • 🔥 1
More from @troubleperf
  1. Aug 14, 2026Post #120
  2. Jul 12, 2026about:performance pinned «»
  3. Jul 12, 2026Post #118
  4. Jul 11, 2026Post #117
  5. Jul 5, 2026Про бенчмаркинг, часть 3 (части 1,2) Ранее обсудили, что борьба с шумом (noise) процесс бе…
  6. Jun 21, 2026Продублирую свой комментарий на вопрос: Стоит задача оценки достаточности мощности оборудо…
Threads Profile ViewerView any public Threads profile without an account.Open ThreadLook →Writing with AI? Make it sound human.Metric37 rewrites AI drafts so they read naturally. Free AI detector, 1,500 words free.Try Metric37 →