負荷テストのサーバ側負荷監視の結果をグラフ化するという目的で 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
予告なく変更されますので、最新版は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
      時刻ごとのタスク状況を出力します。

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 等に インポートしてもいいかもしれません。
以下、参考記事を記載します。

nmon を使う

nmon f オプション指定で 結果を csv 出力できます。
出力結果はnmon analyser可視化できます。以下、参考記事を記載します。

Glances を使う

Glances も export オプション指定で、結果を csv 出力できます。
以下、参考記事を記載します。

htopatop 等は少し調べた限りは見つかりませんでした。
以上です。

コメント