2016-12-09 7 views
2

Dtraceで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やその他のプロセスをどのように探るべきですか?

答えて

0

悲しいことに、これはLinuxでは動作しません。なぜなら、Dtraceはシステムカーネルと厳密に結びついているからです。

Dtraceは、カーネルのバージョンが1つであるため、例えばmacOSやSolarisで動作し、変更があった場合、作成者はDtraceに適切に変更することができます。

各ディストリビューションにはLinuxに多くの異なるカーネルがあるだけでなく、独自のバージョンを自由にコンパイルすることができます。つまり、このシステム用のDtraceを作成することはできません。

Dtraceは、アプリケーション内で何が起こっているかを追跡できるように、カーネルの特定の部分をフックする必要があるためです。

linux repo用の元のDtraceのIssueセクションでこれについて詳しく読むことができます。

関連する問題