Dtrace 没有为 NodeJS 收集任何数据
Dtrace is not collecting any data for NodeJS
我正在尝试使用 Dtrace 分析 NodeJS,但没有成功。我使用的命令是:
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 或任何其他进程以获取一些有用的信息?
遗憾的是,这在 Linux 下不起作用,因为 Dtrace 与系统内核严格绑定。
Dtrace 例如在 macOS 或 Solaris 下工作,因为只有一个版本的内核,如果有任何更改,作者可以对 Dtrace 进行适当的更改。
因为不仅 Linux 在每个发行版中都有许多不同的内核,您可以随意编译自己的版本,这意味着不可能为这个系统创建一个可用的 Dtrace。
因为 Dtrace 需要挂钩内核的特定部分才能跟踪应用程序中发生的事情。
您可以在 linux 存储库的原始 Dtrace 的 Issue 部分阅读更多相关信息。
我正在尝试使用 Dtrace 分析 NodeJS,但没有成功。我使用的命令是:
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 或任何其他进程以获取一些有用的信息?
遗憾的是,这在 Linux 下不起作用,因为 Dtrace 与系统内核严格绑定。
Dtrace 例如在 macOS 或 Solaris 下工作,因为只有一个版本的内核,如果有任何更改,作者可以对 Dtrace 进行适当的更改。
因为不仅 Linux 在每个发行版中都有许多不同的内核,您可以随意编译自己的版本,这意味着不可能为这个系统创建一个可用的 Dtrace。
因为 Dtrace 需要挂钩内核的特定部分才能跟踪应用程序中发生的事情。
您可以在 linux 存储库的原始 Dtrace 的 Issue 部分阅读更多相关信息。