負荷テストのサーバ側負荷監視の結果をグラフ化するという目的で top
コマンドの出力結果を無理矢理 csv 化するスクリプトを作ってみました。
環境によりまともに動かないかもですが、何かの役には立つかもしれませんので、晒しておきます。
とりあえず、このスクリプトで私の労働時間は多少削減されました。
参考
前提
-
OS
以下、linux で動作確認を行っています。
cat /etc/redhat-release --------------------------- CentOS release 6.8 (Final) ---------------------------
-
top
コマンドの出力フォーマット
CentOS release 6.8
のデフォルト設定だと、top
コマンド出力結果は以下のようになります。
この出力結果を csv 化する Python スクリプトを作成しました。
top -------------------------- top - 14:04:02 up 117 days, 17:32, 1 user, load average: 0.05, 0.07, 0.12 Tasks: 111 total, 1 running, 110 sleeping, 0 stopped, 0 zombie Cpu(s): 0.2%us, 0.2%sy, 0.0%ni, 99.5%id, 0.0%wa, 0.0%hi, 0.0%si, 0.2%st Mem: 1020064k total, 862356k used, 157708k free, 268260k buffers Swap: 2097148k total, 28872k used, 2068276k free, 264832k cached PID USER PR NI VIRT RES SHR S %CPU %MEM TIME+ COMMAND 1304 mongod 20 0 457m 4788 1756 S 0.7 0.5 678:55.42 mongod 30448 postgres 20 0 211m 1184 960 S 0.3 0.1 15:40.59 postmaster 30516 ntp 20 0 30740 1156 988 S 0.3 0.1 3:04.12 ntpd 1 root 20 0 19232 700 476 S 0.0 0.1 0:01.41 init 2 root 20 0 0 0 0 S 0.0 0.0 0:00.00 kthreadd 3 root RT 0 0 0 0 S 0.0 0.0 0:05.42 migration/0 4 root 20 0 0 0 0 S 0.0 0.0 1:46.48 ksoftirqd/0 5 root RT 0 0 0 0 S 0.0 0.0 0:00.00 stopper/0 6 root RT 0 0 0 0 S 0.0 0.0 0:22.17 watchdog/0 7 root RT 0 0 0 0 S 0.0 0.0 0:04.69 migration/1 8 root RT 0 0 0 0 S 0.0 0.0 0:00.00 stopper/1 --------------------------
スクリプトの使い方
以下スクリプトの使い方について説明します。
0.ダウンロード
wget
がインストール済みであれば以下でダウンロードできます。
wget https://gist.githubusercontent.com/kemsakurai/3cca7355c992c6be8665f725533f3164/raw/c311f39ff1829364f01a2882d57ae17d55f3bfd7/top_2_csv.py
から取得してください。
1.top コマンドの出力結果を取得
top
コマンドで Python 入力ファイルを生成します。
top
を バッチモードでリダイレクトする
top -b -d 1 -n 1000 >> top_result.txt
2.Python スクリプトの実行。サマリファイルの出力
入力ファイルから、結果のサマリ csv を出力します。
-
コマンド
python top_2_csv.py top_result.txt SUMMARY
-
OUTPUT
ls -1 *.csv -------------- top_result.txt_cpu_summary.csv top_result.txt_load_average.csv top_result.txt_memory_summary.csv top_result.txt_task_summary.csv --------------
-
csvファイルの説明
4つ csv ファイルが出力されます。ファイルの内容は以下の通りです。- 1.{入力ファイル名}_cpu_summary.csv
時刻ごとのcpu使用時間を出力します。 - 2.{入力ファイル名}_load_average.csv
時刻ごとのロードアベレージを出力します。 - 3.{入力ファイル名}_memory_summary.csv
時刻ごとのメモリ使用率を出力します。 - 4.{入力ファイル名}_task_summary.csv
時刻ごとのタスク状況を出力します。
- 1.{入力ファイル名}_cpu_summary.csv
3.Python スクリプトの実行。プロセス ID を指定する。
プロセス ID を指定して、特定プロセスのリソース消費状況を出力します。
* コマンド
python top_2_csv.py top_result.txt 1304
- プロセス番号付きのcsvが出力されます。
ls -1 *.csv -------------- top_result.txt_1304.csv --------------
csv の内容は以下のtop
コマンドの出力を時刻付き、カンマ区切りで出力したものになります。
PID USER PR NI VIRT RES SHR S %CPU %MEM TIME+ COMMAND
1304 mongod 20 0 457m 4788 1756 S 0.7 0.5 678:56.33 mongod
上手く動かないところ
top_2_csv.py
内でロードアベレージを整形を行う箇所で、要素指定で取得しますが、以下の実装部に問題があります。
if i == 2 or i == 7 or i == 11 or i == 12 or i == 13:
この要素番号が、CentOS の version、もしくは稼働時間で変わるようで、上手く取得できない場合があります。
上記の取得要素数を修正すれば結果が出力できるかと思います。
その他の サーバリソースのモニタリング結果を csv に出力する方法
top
コマンドに拘らなければ、別の方法で モニタリング結果を csv できます。
以下、実際に動作確認して試せてないですが、幾つか例を記載します。
top コマンドの結果を json に 変換して json から csv に変換する
topparser と、jq の組み合わせで実現できそうに思いました。
一旦 json にするなら、そのまま Google スプレッドシート、MongoDB 等に インポートしてもいいかもしれません。
以下、参考記事を記載します。
-
devalexqt/topparser: Parse linux TOP command output to JSON format
-
How to import JSON data into Google Spreadsheets in less than 5 minutes
nmon を使う
nmon
の f オプション指定で 結果を csv 出力できます。
出力結果はnmon analyser
で可視化できます。以下、参考記事を記載します。
Glances を使う
Glances も export
オプション指定で、結果を csv 出力できます。
以下、参考記事を記載します。
htop
、atop
等は少し調べた限りは見つかりませんでした。
以上です。
コメント