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を実際に紐付いているデバイスに振り分けてくれるカーネルの機能。
参考
LINUX の時間
UTC
- コンピュータ界の標準時となっているUTC
- タイム ゾーン(時間帯)と呼ぶ区域に分け、UTCからの時差で補正した時刻をタイム ゾーンの標準時として適用
- タイム ゾーンの標準時をローカル タイム(地方時)
- UTC ± 時差
- UTCより9時間進んでいる日本のローカル タイム(JST)は、UTC+09:00
システムクロック
パソコンで使用される唯一の時計(時刻情報源)はシステム クロック その実態はメモリ上で管理 OSは起動されるとハードウェア クロックの時刻情報を読み出し、基準時刻からの経過秒数の形式に編集
ハードウェア クロック
- 製造時に正しい現在の値が入る?
- パソコンの電源を切っても時刻情報を維持
- マザーボード上に実装され、バックアップ電池等により途切れることなく稼働
- 電池切れになると時刻情報がリセットされ、パソコンが正常に起動ができなくなります。
参考
システムクロックはハードウェアクロックの情報を元に設定される。しかしハードウェアクロックは「精度が高いか?」というとそうでもないので気をつけていただきたい。定期的にシステムクロックをNTPで正確に同期したあと、ハードウェアクロックも定期的に同期したほうがいいだろう。