プロセッサ:何が使われているか調べる
time(1)コマンドでコマンドの実行を計測すると、
次のようにdtrace(1)を実行すると、
# dtrace -n 'profile-997hz /arg0/ { @[func(arg0)]=count(); }' dtrace: description 'profile-997hz ' matched 1 probe ^C kernel`uhub_read_port_status 1 kernel`intr_event_execute_handlers 1 kernel`ithread_loop 1 kernel`_mtx_trylock_flags_ 1 kernel`critical_exit 1 kernel`softclock 1 kernel`pctrie_lookup 1 kernel`selfdfree 1 kernel`ffs_sync 1 kernel`spinlock_enter 1 kernel`bcopy 1 kernel`kbdc_data_ready 1 kernel`rdtsc 1 kernel`acpi_cpu_idle 2 dtrace.ko`dtrace_state_clean 2 kernel`sched_idletd 3 kernel`uhci_interrupt 8 dtrace.ko`dtrace_dynvar_clean 17 kernel`spinlock_exit 20 kernel`acpi_cpu_c1 58753 #
次のように実行するとコマンドが使った関数の回数を表示させることができます。こっちはそれようにビルドしておかないと表示される関数名がわからないので意味が不明ですが、
# dtrace -n 'profile-997hz /arg1/ { @[execname,ufunc(arg1)] = count(); }' dtrace: description 'profile-997hz ' matched 1 probe ^C csh libc.so.7`memset 1 dtrace 0x800cf1484 1 dtrace 0x8011aad8d 1 dtrace 0x8011b0dea 1 dtrace 0x8011b87ed 1 dtrace 0x8011ba27d 1 dtrace 0x80124bf18 1 dtrace 0x801f2453b 1 sshd libprivatessh.so.5`Fssh_channel_output_poll 1 sshd libprivatessh.so.5`Fssh_cipher_crypt 1 sshd libc.so.7`sigemptyset 1 sshd libc.so.7`__sys_getpid 1 sshd libthr.so.3`0x8037ed830 1 top 0x4078ca 1 top 0x80061552f 1 top 0x80117dc5d 1 top 0x8011b97df 1 top 0x801202347 1 top 0x801220449 1 #
FreeBSDだと次のようにスレッド名で実行回数を集計して表示させることもできます。
# dtrace -n 'profile-997hz { @[stringof(curthread->td_name)] = count()}' dtrace: description 'profile-997hz ' matched 1 probe ^C atrun 1 irq15: ata1 1 newsyslog 1 sysctl 1 doneq0 2 irq17: mpt0 ehci0 2 mv 2 irq18: uhci0 3 irq257: vmx0 3 vmtoolsd 3 cron 5 dtrace 5 rand_harvestq 5 top 5 sshd 8 sh 9 syncer 10 swi4: clock (0) 19 idle: cpu0 36807 #
カーネルがパニックした時なんかにバックトレースが表示されることがあると思いますが、
カーネルスタックトレースは次のようにすると表示させることができます。ここでは上位5個に表示を絞っています。
# dtrace -n 'profile-997hz { @[stack()] = count(); } END { trunc(@,5); }' dtrace: description 'profile-997hz ' matched 2 probes ^C CPU ID FUNCTION:NAME 0 2 :END kernel`mnt_vnode_next_active+0x3c0 kernel`sched_sync+0x3be kernel`fork_exit+0x85 kernel`0xffffffff80f8467e 4 kernel`spinlock_exit+0x2d 7 dtrace.ko`dtrace_dynvar_clean+0x40 kernel`intr_event_execute_handlers+0x20f kernel`ithread_loop+0xc6 kernel`fork_exit+0x85 kernel`0xffffffff80f8467e 8 kernel`mpt_send_cmd+0x8c kernel`xpt_action_default+0x81d kernel`dastart+0xc5b kernel`xpt_run_allocq+0x163 kernel`dastrategy+0xef kernel`g_disk_start+0x34e kernel`g_io_request+0x4a7 kernel`g_part_start+0x2a4 kernel`g_io_request+0x4a7 kernel`ufs_strategy+0x80 kernel`VOP_STRATEGY_APV+0x8d kernel`bufstrategy+0x2c kernel`bufwrite+0x267 kernel`vfs_bio_awrite+0x3ca kernel`ffs_syncvnode+0x383 kernel`ffs_fsync+0x25 kernel`VOP_FSYNC_APV+0x8d kernel`sched_sync+0x3be kernel`fork_exit+0x85 kernel`0xffffffff80f8467e 10 kernel`acpi_cpu_c1+0x6 kernel`sched_idletd+0x3d3 kernel`fork_exit+0x85 kernel`0xffffffff80f8467e 38811 #
ユーザランドの方も同じようにスタックトーレスを表示させることができます。ユーザランドの方はそれようにビルドしておかないとスタックトレースを表示させてもちょっと意味がわからないのですが、
# dtrace -n 'profile-997hz { @[ustack()] = count(); } END { trunc(@,5); }' dtrace: description 'profile-997hz ' matched 2 probes ^C CPU ID FUNCTION:NAME 0 2 :END 0x8008aca78 0x40afd4 0x41e1d7 0x4142cd 0x41b453 0x413b42 0x40eadd 0x4093d4 0x406850 0x40600f 0x80064e000 3 libc.so.7`_write+0xa libprivatessh.so.5`Fssh_ssh_packet_write_poll+0x3e libprivatessh.so.5`Fssh_packet_write_poll+0x15 sshd`0x418182 sshd`0x4182a9 sshd`0x41c946 sshd`0x40ee5d sshd`0x40c56f ld-elf.so.1`0x800666000 4 5 18 12811 #
処理がどの経路でやってきているのか調べたいときがあったりしますが、
※ ここに掲載したサンプルコマンドは
勉強会
第60回 2月23日(木)19:00~FreeBSD勉強会
発表内容検討中。発表ネタをお持ちの方、
参加申請はこちらから。
第61回 3月23日(木)19:00~リキャップ・ザ・AsiaBSDCon 2017~日本語でふりかえるABC~
2017年3月9~12日まで、
3月のFreeBSD勉強会では、
FreeBSD勉強会 発表者募集
FreeBSD勉強会では発表者を募集しています。FreeBSDに関して発表を行いたい場合、