Dtrace не собирает никаких данных для NodeJS

Я пытаюсь профилировать NodeJS с Dtrace, и это не получается. Команда, которую я использую:

dtrace -n 'profile-97/execname == "node" && arg1/{@[jstack(150, 8000)] = count(); } tick-60s { exit(0); }' > stacks.out

Вывод, который я получаю:

CPU     ID                    FUNCTION:NAME
  0 312432                        :tick-30s

Если я сделаю dtrace -l тогда я получаю, например:

58814      instr            kernel              setup_APIC_eilvt-jne 0xffffffff81045e27
58815      instr            kernel               setup_APIC_eilvt-je 0xffffffff81045e34
58816      instr            kernel               setup_APIC_eilvt-je 0xffffffff81045e38
58817      instr            kernel            setup_APIC_eilvt-callr 0xffffffff81045e46
58818      instr            kernel            setup_APIC_eilvt-callr 0xffffffff81045e6a
58819      instr            kernel      lapic_timer_setup.part.4-cli 0xffffffff81045ea0
58820      instr            kernel      lapic_timer_setup.part.4-jbe 0xffffffff81045eaa
58821      instr            kernel      lapic_timer_setup.part.4-jbe 0xffffffff81045eaf
58822      instr            kernel    lapic_timer_setup.part.4-callr 0xffffffff81045ed4
58823      instr            kernel              lapic_timer_setup-je 0xffffffff81045f39
58824      instr            kernel            lapic_timer_setup-repz 0xffffffff81045f3b
58825      instr            kernel     local_apic_timer_interrupt-je 0xffffffff81045f74
58826      instr            kernel  local_apic_timer_interrupt-callr 0xffffffff81045f90
58827      instr            kernel     local_apic_timer_interrupt-je 0xffffffff81045f99
58828      instr            kernel              clear_local_APIC-jne 0xffffffff8104610e
58829      instr            kernel               clear_local_APIC-jg 0xffffffff810461c3
58830      instr            kernel               clear_local_APIC-je 0xffffffff8104629a
58831      instr            kernel            disable_local_APIC-jne 0xffffffff810463bd
58832      instr            kernel             disable_local_APIC-je 0xffffffff810463c7
58833      instr            kernel          disable_local_APIC-callr 0xffffffff810463c9
58834      instr            kernel           disable_local_APIC-repz 0xffffffff81046400
58835      instr            kernel                 lapic_suspend-jne 0xffffffff8104641d
58836      instr            kernel                  lapic_suspend-jg 0xffffffff81046555
58837      instr            kernel                 lapic_suspend-cli 0xffffffff81046561
58838      instr            kernel               lapic_suspend-callr 0xffffffff81046568

И если я перечислю все процессы, которые открывают файлы с:

dtrace -q -n syscall::open:entry'{ printf("%-16s%-16s\n", execname,copyinstr(arg0)); }'

Я получаю все процессы, открывающие файлы, даже показывает, что NodeJS запускается и готовится к работе:)

vminfo          /var/run/utmp
vminfo          /var/run/utmp
systemd         /proc/145/cgroup
vminfo          /var/run/utmp
vminfo          /var/run/utmp
vminfo          /var/run/utmp
vminfo          /var/run/utmp
systemd         /proc/460/cgroup
vminfo          /var/run/utmp
vminfo          /var/run/utmp
node            /etc/ld.so.cache
node            /lib/x86_64-linux-gnu/libdl.so.2
node            /lib/x86_64-linux-gnu/librt.so.1
node            /usr/lib/x86_64-linux-gnu/libstdc++.so.6
node            /lib/x86_64-linux-gnu/libm.so.6
node            /lib/x86_64-linux-gnu/libgcc_s.so.1
node            /lib/x86_64-linux-gnu/libpthread.so.0
node            /lib/x86_64-linux-gnu/libc.so.6
node            /dev/urandom
node            /home/davidgatti/test/ble.js
node            /etc/resolv.conf
node            /etc/nsswitch.conf
node            /dev/urandom
node            /dev/pts/0
node            /dev/null
node            /dev/pts/0
vminfo          /var/run/utmp
vminfo          /var/run/utmp
systemd         /proc/145/cgroup

Вопрос

Что я делаю не так? Как мне проверить NodeJS или любой другой процесс, чтобы получить какую-нибудь полезную информацию?

1 ответ

Решение

К сожалению, это не будет работать под Linux, потому что Dtrace строго связан с ядром системы.

Dtrace работает, например, под macOS или Solaris, потому что существует одна версия ядра, и, если будут внесены какие-либо изменения, авторы могут внести соответствующие изменения в Dtrace.

Поскольку не только Linux имеет много разных ядер в каждом дистрибутиве, вы можете скомпилировать свою собственную версию так, как вам хочется, и это означает, что невозможно создать работающую Dtrace для этой системы.

Поскольку Dtrace необходимо подключить определенные части ядра, чтобы иметь возможность отслеживать, что происходит внутри приложения.

Вы можете прочитать больше об этом в разделе Issue оригинального Dtrace для Linux-репозитория.

Другие вопросы по тегам