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-debuginfokernel-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のやつが入るみたい。

入れ直し必要。

LA

LAの閾値

LAの値が監視で設定している値をオーバして通知してきても、その時のシステムの状態をみて特に怪しい兆候がなければ監視の閾値をあげてもよいと思われる。

ヘッダファイル(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

参考

www.amazon.co.jp

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を判別している様子

機能

参考

http://lc.linux.or.jp/lc2009/slide/T-02-slide.pdf