Я провел последние несколько дней, исследуя низкую производительность приложения websocket graphql api при обновлении узла с v6.x до v8.x.
Я сделал много графиков пламени, но не могу понять, где находится узкое место. Кто-нибудь знает, что такое ___kdebug_trace_string (на C++)? Похоже, что после обновления в моем приложении это займет значительно больше времени.
Посмотрите этот график пламени:
Также проверьте эти журналы профиля:
журнал профиля узла v8.x (медленно): https://pastebin.com/2W65BZC8
журнал профиля узла v6.x: https://pastebin.com/BL4kM7B7
Впереди спасибо!





kdebug_trace_string - это системный вызов, который был добавлен в XNU в октябре 2015 года для iOS 9 и OS X 10.11.
Это часть kdebug, основного встроенного средства отладки XNU. Читая kdebug_trace.c, я обнаружил в комментариях следующую заметку:
Note that the userspace API is chosing to optimize fastpath, non-error performance by eliding validation of each debugid. This means that error cases which could have been caught in userspace will make a syscall before returning with the correct error code. This tradeoff in performance is intentional.
Это объясняет, почему ___kdebug_trace_string занимает так много места на вашем графике пламени.
Это всего лишь предположение, и все это неверно, если вы не используете компьютер Apple, но тогда, если это не так, я действительно хочу знать, что вызывает этот беспорядок.
Если я прав, если вызывается kdebug_trace_string, значит, узел запускает какую-то утилиту отладки.
Я скачал узел-v8.11.1-Дарвин-x64 и нашел в node/config.gypi следующую строку:
'node_use_dtrace': 'true',
Итак, узел v8.11.1 использует dtrace.
Затем, глядя на эта линия в osx/src/dtrace/libdtrace/dt_open.c, мы можем предположить, что dtrace использует kdebug_trace_string.
Чтобы исправить это, нужно запретить node использовать dtrace. Согласно этот ответ, «Когда Node запускается, .gypi загружается, как и любой другой файл настроек». Так что, возможно, вам следует установить node_use_dtrace на false
Я не понимаю, почему вы не столкнулись с такой же проблемой с узлом v6.7.0:
node_use_dtrace тоже установлен на trueНе могли бы вы сказать мне значение node_use_dtrace для ваших двух версий узла?
Надеюсь, это поможет, и надеюсь, что я прав,
С наилучшими пожеланиями
Я считаю, что kdebug_trace_string также появляется на флеймографах ubuntu, но я дважды проверю и отправлю его сегодня вечером.
У меня проблемы с созданием флеймографов в Ubuntu, поэтому я не могу подтвердить эту часть. Что касается node_use_dtrace, это должно быть верно для обеих версий, поскольку узел профилирования в macOS использует dtrace.
Да, но что, если вы отключите профилирование в файле конфигурации? Влияет ли это на выступления?
Как насчет того, чтобы попробовать
node v9? Также возможно, что узел скомпилирован с некоторыми включенными флагами отладки случайно?