Linuxサーバー保守運用時にたまに使うコマンド pstack,strace,pstree,mpstat

Published: 2016年2月11日 by tomsato

◼︎ 概要

Linuxコマンド紹介シリーズ

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

◼︎ pstack

わかること
そのプログラム(プロセス)がその瞬間にどんな処理を実行しているのかがわかる
あくまでもスナップショットのため何度か実行して情報を表示するべき
プログラムが何かを待っている場合、何度pstackを実行しても同じコールスタックで待っているはず
一般にpstackは負荷が低いとされているのでパフォーマンスが劣化する可能性は低いツール

// 実行例
//   apacheのプロセス番号を指定してみる
$ sudo pstack 5751
#0  0x0000003134ceae5b in accept4 () from libc.so.6 // どんなOSの関数なのかわかる
#1  0x00007f0eed38fc77 in apr_socket_accept () from libyapr.so.0
#2  0x000000000044bb0d in unixd_accept ()
#3  0x000000000044a8b3 in child_main ()
#4  0x000000000044ac14 in make_child ()
#5  0x000000000044af1e in ap_mpm_run ()
#6  0x0000000000423fe4 in main ()

accept4はソケットへの接続を受けるっぽい
 

◼︎ strace

どんなシステムコールを持っているのかOSの何の関数で時間を使っているのかがわかる
リアルタイムにモニタリングできる

//// 使い方例

// コマンドを調べる
$ strace [command]

// プロセスを調べる
$ strace -p [pid]

// 時刻を表示する
// -t は秒単位で、-tt はマイクロ秒単位で表示
$ strace -tt command

// 統計情報を表示する
$ strace -c [command or -p pid] 

◼︎ pstree

プロセスの親子関係をツリー表示する
treeコマンドみたいに表示ができ-pでプロセス番号も表示できる

// 実行例
// psコマンドで出力されるプロセスをtree形式で表示しているイメージ
$ pstree
init─┬─acpid
     ├─atd
     ├─crond
     ├─java───51*[{java}]
     ├─mcelog
     ├─6*[mingetty]
     ├─mysqld_safe───mysqld───19*[{mysqld}]
     ├─ntpd
     ...
     └─apache
実際はもっとあるけど中略

◼︎ mpstat

mpstatとはCPUの使用状況を調べることができる

インストール

$ sudo yum install sysstat

使い方

// 1秒毎に3回取得する
$ mpstat -P ALL 1 3
Linux XXX (hostname)    12/20/2015  _x86_64_    (2 CPU)

01:35:05 AM  CPU    %usr   %nice    %sys %iowait    %irq   %soft  %steal  %guest   %idle
01:35:06 AM  all    0.00    0.00    0.00    0.00    0.00    0.00    0.00    0.00  100.00
01:35:06 AM    0    0.00    0.00    0.00    0.00    0.00    0.00    1.00    0.00   99.00
01:35:06 AM    1    0.00    0.00    0.00    0.00    0.00    0.00    0.00    0.00  100.00

01:35:06 AM  CPU    %usr   %nice    %sys %iowait    %irq   %soft  %steal  %guest   %idle
01:35:07 AM  all    0.00    0.00    0.50    0.00    0.00    0.00    0.00    0.00   99.50
01:35:07 AM    0    0.99    0.00    0.00    0.00    0.00    0.00    0.00    0.00   99.01
01:35:07 AM    1    0.00    0.00    0.00    0.00    0.00    0.00    0.00    0.00  100.00

01:35:07 AM  CPU    %usr   %nice    %sys %iowait    %irq   %soft  %steal  %guest   %idle
01:35:08 AM  all    0.50    0.00    0.00    0.00    0.00    0.00    0.00    0.00   99.50
01:35:08 AM    0    0.00    0.00    0.00    0.00    0.00    0.00    0.00    0.00  100.00
01:35:08 AM    1    0.00    0.00    1.00    0.00    0.00    0.00    0.00    0.00   99.00

Average:     CPU    %usr   %nice    %sys %iowait    %irq   %soft  %steal  %guest   %idle
Average:     all    0.17    0.00    0.17    0.00    0.00    0.00    0.00    0.00   99.67
Average:       0    0.33    0.00    0.00    0.00    0.00    0.00    0.33    0.00   99.33
Average:       1    0.00    0.00    0.33    0.00    0.00    0.00    0.00    0.00   99.67
 

各項目の見方

項目 説明
CPU
  • プロセッサ番号
  • ALLは全てのプロセッサの平均値
%usr
  • ユーザレベル(アプリケーション)のCPU使用率
%nice
  • nice優先順位に従ってユーザレベルで実行された処理のCPU使用率
  • 基本0%になってるけどniceコマンドを使う状況になったら変わる可能性がある
%sys
  • システムレベル(カーネル)のCPU使用率
  • ハードウェア処理時間とソフトウェア割込み時間を含んでいない
%iowait
  • ディスクI/Oによる待ち時間の割合
  • 負荷にもよるけどDBサーバだと割りと10%くらいいっている
%irq
  • ハードウェア割込みに費やしたCPUの処理時間の割合
  • 基本0%
  • Interrupt ReQuestの略
%soft
  • ソフトウェア割込みに費やしたCPUの処理時間の割合
%steal
  • ハイパーバイザによって他の仮想プロセッサに処理を割り当てられたために起こる待ち時間の割合 (多分)
%quest
  • niceゲストを実行するためにCPUが費やした時間の割合
  • 手元のサーバでは表示されない
%idle
  • アイドル状態の割合
  • (アイドル時間:次の作業指示やデータを待つための時間のこと)
  • ディスクI/Oによる待ち時間は含まれない

プロセッサの確認方法

// プロセッサは2つあることになる
// その他cpuinfoにはcpuについて情報が載っている
$ cat /proc/cpuinfo | grep processor
processor   : 0
processor   : 1

主なオプションについて

</table> ## ◼︎ 参考 * [strace コマンドの使い方をまとめてみた](http://blog.livedoor.jp/sonots/archives/18193659.html) * [【 pstree 】 プロセスの親子関係をツリー表示する](http://itpro.nikkeibp.co.jp/article/COLUMN/20071204/288730/?rt=nocnt) * [CPUをコアごとに確認する](http://qiita.com/shohhei1126/items/4b54290a3604f63f52c8) * [mpstat コマンドの読み方](https://blogs.oracle.com/yappri/entry/mpstat)
オプション 説明
-P </td> 特定のCPUの指定
はCPU番号 </td> </tr>
-P ALL 全てのCPUの指定

コメントを書く

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

※ 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でどういうコンポーネント設計にするかについてまとめます

カテゴリ一覧

タグ一覧