運用でたまに使うコマンド③

■ 目次

  1. 概要
  2. perf
  3. tcpdump
  4. ngrep
  5. lsof
  6. 参考

■ 概要

の続きになります

引き続き障害調査、負荷調査などで使うコマンドをまとめます

■ 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

■ 参考


Be First to Comment

コメントを残す

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です