🔥

Тред (Андрей Печкуров)


Продолжим тему ALS. Не секрет, что у async_hooks есть "накладные расходы", связанные с трекингом ЖЦ объектов-ресурсов и вызовами хуков. Появление CLS API в core позволило реализовать некоторые оптимизации, уменьшающие overhead от ALS.

Например, в отличие от user-land библиотек, ALS не использует destroy хуков (благодаря функции executionAsyncResource()), поэтому для его работы не нужно отслеживать объекты-ресурсы, destroy событие которых зависит от GC.

Особенно, "дорого" это в случае нативных промисов. Но в недавних коммитах это отслеживание было отключено для AsyncResource (embedder API для async_hooks) и нативных промисов для случаев, когда активных destroy хуков нет. Как результат, overhead от ALS удалость снизить.

Недавно я портировал cls-rtracer, маленькую библиотеку, основанную на CLS API, с cls-hooked на ALS и сделал замер производительности простого HTTP echo сервера с несколькими записями в логи. Вот результат для Node.js v14.4.0.
notion image

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