Linuxサーバー保守運用時にたまに使うコマンド perf,tcpdump,ngrep,lsof

Published: 2016年2月19日 by tomsato

概要

Linuxコマンド紹介シリーズ

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

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

参考

コメントを書く

※ 個別に返信が必要な時のみご記入ください

※ Emailは公開されません

※ 承認されると名前・コメントが下記に表示されます

コメント一覧

最近の投稿

ビジュアルリグレッションテストについてまとめ、ネットで調べると数多くのライブラリがありどれがどんな立ち位置なのか全体像がわかりずらかったのでどんな種類があるのか入門の入門としてまとめます、またPlaywrightを使って実際に触ってみました

社内ツールなどの超小規模なAPIをGolangで実装する際にフレームワークを使うべきかを、実際にnet/httpを使った実装とフレームワークを使った実装を比較することでどれだけ優位性があるかを見ていきたいと思います。今回はフレームワークにはシンプルで使いやすそうなEchoを使うことにします。

vue-pdfを使ってNuxt.jsで作成しているアプリケーションに pdfスライドを表示させるサンプルを作成しました README.md通りに実装してもうまくいかないところがあったのでそのあたり含めてまとめます

Vue.js / Nuxt.jsにおけるログインの実装方法をまとめる Auth0やNuxt.jsのAuth Moduleとmiddlewareについて調べつつサンプルを作成することで理解を深める

コンポーネント設計について考える Atomic DesignやPresentational Component, Container Componentについてまとめつつ 自分だったらVue.js / Nuxt.jsでどういうコンポーネント設計にするかについてまとめます

カテゴリ一覧

タグ一覧