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-репозитория.