strace
概要
straceの使い方についてのメモ
スレッド
$ strace -p 3887 Process 3887 attached futex(0x7fc579e0b9d0, FUTEX_WAIT, 3889, NULL^CProcess 3887 detached
上記コマンドを打ったところ、プロセスはちゃんと働いているはずなのにここで止まってしまった。 そのプロセスからforkしたプロセスも対象にいれないといけませんでした。
$ strace -f -p 3887
これでドバーとシステムコールが表示される。
オプション
$ strace -ttT -ff -o ~/strace-log -p 3887
- tt: 行頭にタイムスタンプをマイクロ秒単位で出力
- T: 行末にシステムコール内での所要時間を出力
- ffとo:この2つを組み合わせることで
strace-log.スレッドID
毎にstraceのログを出力してくれる
$ strace -ttT -fc -p 3887 % time seconds usecs/call calls errors syscall ------ ----------- ----------- --------- --------- ---------------- 38.39 0.206970 10893 19 epoll_wait 36.90 0.198972 1442 138 46 futex 21.14 0.113984 18997 6 4 restart_syscall 3.13 0.016853 624 27 mmap 0.35 0.001882 1 2746 clock_gettime 0.05 0.000292 4 82 unlink 0.03 0.000164 4 44 munmap 0.00 0.000022 0 293 write 0.00 0.000013 0 1011 6 lstat 0.00 0.000000 0 15 read 0.00 0.000000 0 32 open 0.00 0.000000 0 34 close 0.00 0.000000 0 115 stat 0.00 0.000000 0 166 fstat 0.00 0.000000 0 4 mprotect 0.00 0.000000 0 1 rt_sigprocmask 0.00 0.000000 0 44 sched_yield 0.00 0.000000 0 1 madvise 0.00 0.000000 0 469 gettimeofday ------ ----------- ----------- --------- --------- ---------------- 100.00 0.539152 5247 56 total
cで統計表示。便利。
SystemTap Man
systemtapを動かすには
- 実行しているカーネルの kernel-devel
- 実行しているカーネルの kernel-debuginfo
- 実行しているカーネルの kernel-debuginfo-common
- gcc
- systemtap
kernel-debuginfo
とkernel-debuginfo-common
debuginfo-install kernel
でお目当てのバージョンをインストールする。
$ debuginfo-install kernel --skip-broken ============================================================================================================================================== Package Arch Version Repository Size ============================================================================================================================================== Installing: kernel-debuginfo x86_64 2.6.32-642.15.1.el6 base-debuginfo 282 M Updating: yum-plugin-auto-update-debug-info noarch 1.1.30-40.el6 base 27 k Installing for dependencies: kernel-debuginfo-common-x86_64 x86_64 2.6.32-642.15.1.el6 base-debuginfo 46 M Skipped (dependency problems): kernel-debuginfo x86_64 2.6.32-642.6.2.el6 base-debuginfo 282 M kernel-debuginfo x86_64 2.6.32-642.11.1.el6 base-debuginfo 282 M kernel-debuginfo x86_64 2.6.32-642.13.1.el6 base-debuginfo 282 M kernel-debuginfo x86_64 2.6.32-642.13.2.el6 base-debuginfo 282 M Transaction Summary ============================================================================================================================================== Install 2 Package(s) Upgrade 1 Package(s)
Version、 2.6.32-642.15.1.el6
OK
これで残りもインストールできたらsystemTapが使える。実際に使えた。が、インストールした翌日に再び実行してみると下記の様なエラーがでるようになった。
emantic error: missing x86_64 kernel/module debuginfo [man warning::debuginfo] under '/lib/modules/2.6.32-642.15.1.el6.x86_64/build'
よくよく調べるとyum-cronが走り。centos.plusたるものにアップデートされてた。
Packages Altered: Updated kernel-debuginfo-2.6.32-642.15.1.el6.x86_64 @base-debuginfo Update 2.6.32-642.15.1.el6.centos.plus.x86_64 @base-debuginfo Updated kernel-debuginfo-common-x86_64-2.6.32-642.15.1.el6.x86_64 @base-debuginfo Update 2.6.32-642.15.1.el6.centos.plus.x86_64 @base-debuginfo
yum install kernel-debuginfo
だと、centos.plusのやつが入るみたい。
入れ直し必要。
ヘッダファイル(C)
概要
Cはほぼ読むだけ。とりあえず備忘録としての自分まとめ。
ヘッダファイルを利用しない
- あるファイルの関数から別ファイルの関数を呼び出す場合、その呼び出す関数の引数、戻り値を知っていないといけない。それを知るために、呼び出し側ではその関数の宣言を利用する。
- 利用側で宣言を知ることができない場合、暗黙の宣言が利用される。
- 宣言が定義と合致しているかはちぇっくなし。
- 別ファイルの関数などを使う場合に都度、自分で宣言を書かないといけない
暗黙の宣言
- 呼び出し側で例えば関数の情報(宣言)を知ることができない場合int型を返す、引数なしの関数としてみなされる。
- 自分で宣言を書いて定義と異なっていたとしても同じ
- コンパイラの気持ちとしては別ファイルにあるはずなので
リンク時
にみつかるやろ~
エラー
- 発覚するのはリンク時。
コンパイル時
にエラー見つけたい。
ヘッダファイルを利用
- 宣言を一つにまとめられる。再利用できる。
- ヘッダファイルに、関数、変数の宣言かく。
コンパイル時
に例えば関数の呼び出し側、定義側、とヘッダファイルにかかれている宣言が正しい(引数、戻り値の型)などをチェックしてくれる。コンパイル時
にみつかる。
sed
eオプション
e、fやらがないと最初のオプション以外をsedスクリプトとする。
sage: sed [OPTION]... {script-only-if-no-other-script} [input-file]... If no -e, --expression, -f, or --file option is given, then the first non-option argument is taken as the sed script to interpret. All remaining arguments are names of input files; if no input files are specified, then the standard input is read.
iostat
iostatが見ているレイヤー
ブロックレイヤーのIOキュー
まとめ
- iostatで例えばutil(ディスク使用率)が99%近くでもそのデバイスファイルに紐づく物理デバイスがraid0などで複数ある場合はIOは分散されているので各ディスクに実際の使用率は低いということが起こりえる。
- iostatではシンプルな構成、デバイスファイルと実デバイスが一つに結びつけることができる時(pvdisplay の結果一つしかない場合など)は下記コマンド結果の指標が有効に働く。
下の場合、/dev/vdaがディスク一つに対応している場合、問題無いが、/dev/vdaが実際には複数の物理ディスクに対応しているような場合、iostatから見たレベルの/dev/vdaの使用率が100%でも、裏では各ディスクにそれぞれアクセスしているので、各ディスクの使用率は全然低いということが起こりうる。
avg-cpu: %user %nice %system %iowait %steal %idle 3.99 0.00 1.00 4.98 0.00 90.03 Device: rrqm/s wrqm/s r/s w/s rsec/s wsec/s avgrq-sz avgqu-sz await r_await w_await svctm %util vda 0.00 51.16 0.00 21.93 0.00 534.22 24.36 0.07 3.27 0.00 3.27 2.82 6.18 dm-0 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 dm-1 0.00 0.00 0.00 1.33 0.00 10.63 8.00 0.00 2.25 0.00 2.25 1.25 0.17 dm-2 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 dm-3 0.00 0.00 0.00 68.44 0.00 523.59 7.65 0.39 5.77 0.00 5.77 0.88 6.05
参考
device-mapper
- “dm”, “DM” と略される
$ ll /dev/dm* brw-rw----. 1 root disk 253, 0 Mar 30 15:35 /dev/dm-0 brw-rw----. 1 root disk 253, 1 Mar 30 15:35 /dev/dm-1 brw-rw----. 1 root disk 253, 2 Mar 30 15:35 /dev/dm-2
上にリンクが張ってある
$ ll /dev/mapper/vg* lrwxrwxrwx. 1 root root 7 Mar 30 15:35 /dev/mapper/vg_testhost1-lv_home -> ../dm-2 lrwxrwxrwx. 1 root root 7 Mar 30 15:35 /dev/mapper/vg_testhost1-lv_root -> ../dm-0 lrwxrwxrwx. 1 root root 7 Mar 30 15:35 /dev/mapper/vg_testhost1-lv_swap -> ../dm-1
dm名
- VG名-LV名からリンクはってある。カーネル内部ではdm-番号でLVMを判別している様子
機能
- 論理ボリュームに対するI/Oを物理デバイスに対するI/Oにマッピングするカーネルの機能
- 一つまたは複数のブロックデバイスへの I/O をとりまとめ変換を加える機能を提供
- 仮想デバイスに対するIOを実際に紐付いているデバイスに振り分けてくれるカーネルの機能。