Pull to refresh

Comments 11

В модуле fs появились новые функции: fs.readSync, fs.readv, fs.readvSync.

fs.readSync был чуть ли не в первой ревизии ноды. Сейчас просто запилили версию функции с другой сигнатурой.


Много интересного можно найти в новом API для отслеживания ресурсов в асинхронном программировании: async_hooks

Нативные расширения могут контекст подпортить (да и не нативные тоже), поэтому нужно весьма аккуратно использовать async_hooks. В частности у нас с node-redis проблемы были.

Да, спасибо, конечно же, я поправил. А c `async_hooks` пока сам присматриваюсь и экспериментирую, но еще в продакшен не пускал и в лекциях не советовал. Если есть где ссылка на багрепорт с проблемами, буду очень признателен.

Вообще CLS крутая штука, удобно автоматически пробрасывать контекст (а-ля tracking id / user). Но нужно быть весьма внимательным, да, чтоб не напороться на проблемы.

Производительность async_hooks уже починили? А то только его подключение просаживает скорость работы с промисами процентов на 30. Неудивительно, там же на каждый резолв вызывается куча дополнительного JS-кода из интерналс (по крайней мере, так было полгода назад).

Нет, не починили. По крайней мере, я пару месяцев назад проверял. Но конкретно в наших задачах блок идёт по io, а не по cpu.

А отслеживание цепочки вызовов нативно тоже пока не сделали? Просто какая штука, чтобы сделать поддержку локального контекста, полгода назад приходилось на JS держать глобальный Map с parent_context_id=>context_id и на каждый чих туда писать данные (а это две записи на каждый резолв промиса, даже моментальный). Проще всего понять, как это работает, на примере модуля contexty из npmjs (он самый минималистичный). На это тратилась уйма CPU (в дополнение к тому, что там уже и так тратится при подключении async_hooks), и вот если бы этот Map просто сделали нативной поддержкой в C++, это бы сильно все улучшило. Полгода назад ничего такого еще не было сделано, и я не знаю, планировалось/планируется ли.

AsyncLocalStorage это не нативно. Это класс на JS, который исполюзует другой класс на JS AsyncResource, который использует async_hooks, который тоже на JS.


Вот что выполняется на каждом резолве промисов (и других асинхронных операциях типа nextTick, IO и т.д.): https://github.com/nodejs/node/blob/master/lib/internal/async_hooks.js


Кстати, насколько я понимаю, все это содержимое lib/internals (а может быть даже и вся lib) бандлится внутрь бинарника node и парсится/запускается при каждом старте node. Такой ”рантайм на JS” своеобразный (они стараются на C++ как можно меньше писать такого утилитарного кода, но в случае с async_hooks от этого больше беды чем пользы).

Кстати, кое-что быстрее работает, если оно полностью в юзерспейсе на js живет, чем на с++, потому, что js работает не так уж и медленно, а накладные расходы на взаимодействие между js и c++ действительно большие. Тут нужно пробовать всегда, иначе нельзя заранее сказать. Эта штука с отслеживанием ресурсов, по хорошему вообще должны быть достаточно глубоко в v8 интегрирована чтобы стать быстрой, тут нужны оптимизации, а то из всех объектов торчат эти Symbol с ресурсами в виде примесей, а это портит форму объектов.
Sign up to leave a comment.

Other news