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

参考

Share

最近の投稿

NetlifyのSplit TestingとFunctionsについて使い方をまとめる Split TestingはGitHubのブランチをベースにしたA/Bテストを行うための機能のことで、FunctionsはNetlifyでAWS Lambdaを使うことができる

NetlifyとはHTMLなどの静的コンテンツのみで構成されたWebサイトを閲覧できる形で配信するWebサービス GitHubやBitbucket、GitLabなどと連携して使うことができて、リポジトリにプッシュすることで自動でCI/CDを行うことができる、無料枠が豊富で独自ドメインを設定可能

WordPressからJekyll(GitHub Pages)に移行した手順をまとめる。 お金的な事情や使いやすさなどの理由で無料のJekyll+GitHub Pagesに移行した。JekyllとはMarkdown等から静的ページを生成する静的サイトジェネレータ

Scala開発のためにScalaらしさをまとめる 言語設計者の設計思想を元にScalaらしさについてまとめる オブジェクト指向と関数型の融合について

StorybookとはUI開発環境を提供するツール React、React Native、Angular、Vueなどをサポートしている ユーザーは独立した開発環境でコンポーネントを個別に作成して挙動の確認をテストできたり、コンポーネントを一覧にしてカタログ化できるので他の人に紹介する時に使えたりする

カテゴリ一覧

タグ一覧