概要
Linuxコマンド紹介シリーズ
- Linuxサーバー保守運用時にたまに使うコマンド sar,vmstat,netstat,iostat,top
- Linuxサーバー保守運用時にたまに使うコマンド pstack,strace,pstree,mpstat
- Linuxサーバー保守運用時にたまに使うコマンド perf,tcpdump,ngrep,lsof
引き続き障害調査、負荷調査などで使うコマンドをまとめます
perf
Linuxのパフォーマンス解析ツール
カーネル内のイベントや、ハードウェアイベントの発生回数を計測できるツール
プログラムのパフォーマンスを測定する
インストール
$ sudo yum install perf
よく使う使い方
$ sudo perf stat cat /dev/null Performance counter stats for 'cat /dev/null': 0.523640 task-clock # 0.538 CPUs utilized 0 context-switches # 0.000 K/sec 0 cpu-migrations # 0.000 K/sec 159 page-faults # 0.304 M/sec 894,345 cycles # 1.708 GHz 617,398 stalled-cycles-frontend # 69.03% frontend cycles idle 495,099 stalled-cycles-backend # 55.36% backend cycles idle 478,764 instructions # 0.54 insns per cycle # 1.29 stalled cycles per insn 93,637 branches # 178.819 M/sec <not counted> branch-misses 0.000972848 seconds time elapsed
出力される項目の意味
項目 | 説明 |
---|---|
task-clock-msecs | OSが実行プロセスに割り振った実行時間(ms) |
context-switches |
コンテキストが切り替わった回数 (コンテキストスイッチ:あるプログラム(プロセスやスレッド)から別のプログラムにCPUの処理を切り替えること) |
cpu-migrations | CPUを移動した回数 |
page-faults | プログラムが物理メモリがマップされていない仮想アドレス空間上にアクセスした時にハードウェアが発生する割り込み(または例外) |
cycles | 使用したCPUサイクル数 |
stalled-cycles-frontend | フロントエンドで命令が止まったサイクル数(CPU依存) |
stalled-cycles-backend | バックエンドで命令が止まったサイクル数(CPU依存) |
instructions | リタイアした命令数 |
branches | 分岐命令の実行回数 |
branch-misses | 分岐予測をミスした回数 |
tcpdump
どんな通信をしているのか、どこからアクセスが来ているのか詳細に把握できる
パケット情報を見ることでどちらが処理中なのかどちらが待機中なのかあたりをつけられる
負荷がかかるためサービスに影響が生じる可能性があるので注意
使い方
$ sudo tcpdump tcpdump: Couldn't find user 'tcpdump' // 通常の使い方 $ sudo tcpdump -Z root // ホストを指定することによってそのホストとの通信のみ見ることができる $ sudo tcpdump -Z root host [hoge.host] // 送信元を指定して実行 $ sudo tcpdump -Z root src host [src.host] // 送信先を指定して実行 $ sudo tcpdump -Z root dst host [dst.host] // 送信先または送信元のポート番号を指定する $ sudo tcpdump -Z root port [port.num] // 送信元のポート番号を指定 $ sudo tcpdump -Z root scr port [port.num] // 送信先のポート番号を指定 $ sudo tcpdump -Z root dst port [port.num] // 複数条件を組み合わせる時はandやorを使う $ sudo tcpdump -Z root port 80 and host [hoge.host] // 通信内容をASCIIで見る場合 $ sudo tcpdump -Z root -A 暗号化されていないFTPやtelnetのユーザ名、パスワード、通信の情報が取得できる // プロトコルを指定してキャプチャを行う $ sudo tcpdump -Z root tcp $ sudo tcpdump -Z root udp ほか
ngrep
network grepの略っぽい
tcpdumpよりお手軽に、かつ見やすくネットワークのキャプチャが見れる
インストール
$ sudo yum install ngrep
使い方
$ sudo ngrep -W byline -q port 80 -d eth1 ... 実行した状態でそのサーバのWebページにアクセスする ... T 192.XXX.XXX.XXX:80 -> 192.XXX.XXX.XXX:XXX [AP] HTTP/1.1 200 OK. Date: Thu, 18 Feb 2016 01:47:35 GMT. Server: Apache/2.2.15 (CentOS). Content-Length: 11. Connection: close. Content-Type: text/html; charset=UTF-8. .
オプションの意味
項目 | 説明 |
---|---|
-W byline | 行単位で出力 |
-q | 関係ないものを表示しない |
port 80 | 80番ポートの通信だけ見る |
-d eth1 |
eth0のNICの通信だけを対象にして見る ifconfigコマンドでどんなNICがあるか確認できる |
MySQLのSQL文も見れたりする
$ sudo ngrep 'select' -q port 3306 -d lo interface: lo (127.0.0.0/255.0.0.0) filter: ( port 3306 ) and (ip or ip6) match: select ... この時に違うWindowから以下のコマンドを叩く ※ 前提としてMySQLが使えてDBとテーブルが用意されている状態 $ mysql -h localhost.localdomain -P 3306 -e 'select * from test.test;' ... T 127.0.0.1:57555 -> 127.0.0.1:3306 [AP] !....select @@version_comment limit 1 T 127.0.0.1:57555 -> 127.0.0.1:3306 [AP] .....select * from test.test
lsof
どのプロセスがファイルを開いているかを調べます
インストール
$ sudo yum install lsof
使い方
// apacheが開いているファイルを表示する $ sudo lsof | grep apache // apacheが出力するログの場所を調べる $ sudo lsof | grep apache | grep '/log/' httpd 2101 apache 2w REG 253,0 1014 263331 /var/log/httpd/error_log httpd 2101 apache 7w REG 253,0 0 263330 /var/log/httpd/access_log
参考
- sysのCPU使用率が高い場合にその内訳を調べる方法
- perf パフォーマンス測定 その1
- 【tcpdump】ネットワークトラフィックをダンプ出力する
- ITインフラで起きる「もしも」のための12個のコマンド
- 通信内容をわかりやすくキャプチャできるngrep
コメントを書く
コメント一覧