さらに、下記URLで紹介されている整形スクリプト(sadf2matrix)を使用すると、エクセルに取り込みやすい形式に整形できるようです。
そこで、
WindowsPCから、複数サーバ(CentOS6)にアクセスして sar のリソース情報(CPU使用率とか)を収集し、LibreOffice(calc)に読み込む作業を自動化できるか試してみました。
上記で紹介した整形スクリプト(sadf2matrix)をWindowsPCに保存します。
整形スクリプトは、TeraTermマクロでCentOSサーバに送信して実行するので、CentOSの環境に合わせて、文字コードはUTF-8、改行コードは LF にします。
保存先は以下とします。
TeraTermmマクロの仕様は以下のとおり。
ソースコードの保存先は以下とします。
ソースコードの保存先は以下とします。
4.1. sar でリソース情報の取得
負荷テストでの情報収集を想定して、まず、各サーバ上で sar コマンドを実行し、1秒間隔でデータを蓄積します。
下記の例では、1秒間隔で5分間データを収集し、/tmp/<ホスト名>.sar に保存します。
4.2. LibreOffice(calc)に収集先サーバのリストを記載
下図のようにリストを作成。
この例では、2台のサーバから sar の情報を収集します。
4.3.Pythonマクロを実行
[ツール] > [マクロ] > [マクロの実行] を選択して、TsvImport を実行します。
実行中は、下図のように表示されます。
DOS窓とTeraTermのウィンドウが表示されます。
実行が終了すると、下図のようにシートが追加され、sar の情報を読み込まれています。
1台につき4枚のシート(CPU/Memory/Network/DISK)が追加されるので、
この例では、2台分で計8枚のシートが追加されます。
4.4.グラフの作成
上記で作成したシートのデータを元に、手作業でグラフを作成したり性能分析に利用できます。
sar の収集は、TeraTermマクロで実施します。
1. 整形スクリプトの保存
上記で紹介した整形スクリプト(sadf2matrix)をWindowsPCに保存します。
整形スクリプトは、TeraTermマクロでCentOSサーバに送信して実行するので、CentOSの環境に合わせて、文字コードはUTF-8、改行コードは LF にします。
保存先は以下とします。
C:\workspace\LibreOfficeマクロ\sadf2matrix
2. TeraTermマクロの用意
TeraTermmマクロの仕様は以下のとおり。
- 引数で指示されたサーバにログインする
- sadf2matrix を送信する
- cpu / memory / network / disk のリソース情報をTSVファイルに保存する
- WindowsPCにTSVファイルを下記DIRにダウンロードする
C:\workspace\LibreOfficeマクロ\sar
- IPアドレス
- sarファイルPATH
- 開始時刻(HH:MI:SS)
- 終了時刻(HH:MI:SS)
; ; sarデータ 収集 ; ; <引数> ; params[2] : IPアドレス ; params[3] : sar ファイル ; params[4] : 開始時刻 ; params[5] : 終了時刻 ; ; <注意> ; サーバ側に下記パッケージがインストール済みであること ; - openssh-clients ; 引数 ip = params[2] dst_sar_file = params[3] start_time = params[4] end_time = params[5] ; SSH接続アカウント情報 remote_prompt = '#' remote_user = 'root' remote_pass = 'p@ssw0rd' ; src_base_dir = 'C:\workspace\LibreOfficeマクロ' dst_base_dir = '/tmp' sprintf2 src_sadf2matrix '%s\sadf2matrix' src_base_dir sprintf2 dst_sadf2matrix '%s/sadf2matrix' dst_base_dir ; ログイン sprintf2 conbuf '%s /ssh /auth=password /user=%s /passwd=%s' ip remote_user remote_pass connect conbuf if result != 2 then messagebox 'teraterm macro could not connect to this Server.' 'Error' end endif ; ログイン待ち timeout = 3 wait remote_prompt if result == 0 then disconnect 0 end endif ; ログファイル getspecialfolder log_path 'Desktop' getdate log_name '\&h_%Y%m%d_%H%M%S.log' strconcat log_path log_name logopen log_path 0 1 ; 接続先情報 sendln 'date ; uname -n ; whoami' wait remote_prompt ; sadf2matrix ファイルPUT scpsend src_sadf2matrix dst_sadf2matrix mpause 1000 ; strsplit start_time ':' 3 strjoin st "" ; cpu / load sprintf2 cmdbuf1 'sadf -s "%s" -e "%s" -- -q -u -P ALL %s' start_time end_time dst_sar_file sprintf2 cmdbuf2 '%s | bash %s -t "%H:%M:%S" > %s/sadf2matrix_%s_%s_cpu.tsv' cmdbuf1 dst_sadf2matrix dst_base_dir ip st sendln cmdbuf2 wait remote_prompt ; memory / swap sprintf2 cmdbuf1 'sadf -s "%s" -e "%s" -- -r -W %s' start_time end_time dst_sar_file sprintf2 cmdbuf2 '%s | bash %s -t "%H:%M:%S" > %s/sadf2matrix_%s_%s_memory.tsv' cmdbuf1 dst_sadf2matrix dst_base_dir ip st sendln cmdbuf2 wait remote_prompt ; network sprintf2 cmdbuf1 'sadf -s "%s" -e "%s" -- -n DEV %s' start_time end_time dst_sar_file sprintf2 cmdbuf2 '%s | bash %s -t "%H:%M:%S" > %s/sadf2matrix_%s_%s_network.tsv' cmdbuf1 dst_sadf2matrix dst_base_dir ip st sendln cmdbuf2 wait remote_prompt ; io sprintf2 cmdbuf1 'sadf -s "%s" -e "%s" -- -b %s' start_time end_time dst_sar_file sprintf2 cmdbuf2 '%s | bash %s -t "%H:%M:%S" > %s/sadf2matrix_%s_%s_disk.tsv' cmdbuf1 dst_sadf2matrix dst_base_dir ip st sendln cmdbuf2 wait remote_prompt ; ファイルGET sprintf2 src "%s\sar\%s_%s_cpu.tsv" src_base_dir ip st sprintf2 dst "%s/sadf2matrix_%s_%s_cpu.tsv" dst_base_dir ip st scprecv dst src mpause 1000 sprintf2 src "%s\sar\%s_%s_memory.tsv" src_base_dir ip st sprintf2 dst "%s/sadf2matrix_%s_%s_memory.tsv" dst_base_dir ip st scprecv dst src mpause 1000 sprintf2 src "%s\sar\%s_%s_network.tsv" src_base_dir ip st sprintf2 dst "%s/sadf2matrix_%s_%s_network.tsv" dst_base_dir ip st scprecv dst src mpause 1000 sprintf2 src "%s\sar\%s_%s_disk.tsv" src_base_dir ip st sprintf2 dst "%s/sadf2matrix_%s_%s_disk.tsv" dst_base_dir ip st scprecv dst src mpause 1000 ; 掃除 sprintf2 cmdbuf 'rm -f %s/sadf2matrix*' dst_base_dir sendln cmdbuf wait remote_prompt ; ログアウト sendln 'exit' end
ソースコードの保存先は以下とします。
C:\workspace\LibreOfficeマクロ\sar_collector.ttl
3. LibreOffice(calc)Pythonマクロの用意
Pythonマクロの仕様は以下のとおり
ソースコードは以下のとおり
- アクティブなシートから、IPアドレス、sarファイル、開始時刻、終了時刻の読み込む
- TeraTermマクロを実行する
- 下記DIRに格納されたTSVファイル名を取得する
C:\workspace\LibreOfficeマクロ\sar - 以下をTSVファイルの数だけ繰り返す
・ 一番右側にシートを追加する
・ 追加シートにTSVファイルを読み込む
ソースコードは以下のとおり
#coding:Shift_JIS import os import csv # def tsvImport(*args): doc = XSCRIPTCONTEXT.getDocument() sheets = doc.getSheets() # アクティブシートのリストを入力して、TTマクロを実行する sheet = doc.CurrentController.ActiveSheet cellrange = sheet.getCellRangeByName("A1") cursor = sheet.createCursorByRange(cellrange) cursor.gotoEndOfUsedArea(True) end_row = cursor.Rows.Count for i in range(end_row): if i > 0: ip = sheet.getCellByPosition(0,i).String file = sheet.getCellByPosition(1,i).String start_time = sheet.getCellByPosition(2,i).String end_time = sheet.getCellByPosition(3,i).String ttl = r"c:\workspace\teraterm-4.93\ttpmacro /v c:\workspace\LibreOfficeマクロ\sar_collector.ttl" cmd = '%s %s %s %s %s' % (ttl,ip,file,start_time,end_time) #sheet.getCellByPosition(5,i).String = cmd os.system(cmd) # 新規シートを追加して TSV ファイルを入力する files = os.listdir(r"C:\workspace\LibreOfficeマクロ\sar") for tsv_file in files: n_sheets = sheets.Count sheet_name = tsv_file.replace(".tsv","") sheets.insertNewByName(sheet_name, n_sheets) sheet = doc.getSheets().getByName(sheet_name) fpath = r"C:\workspace\LibreOfficeマクロ\sar" + "\\"+ tsv_file with open(fpath, 'r') as f: rows = csv.reader(f, delimiter='\t') n_row = 0 for row in rows: n_col = 0 for col in row: sheet.getCellByPosition(n_col,n_row).String = col n_col = n_col + 1 n_row = n_row + 1
ソースコードの保存先は以下とします。
C:\Users\<ユーザ>\AppData\Roaming\LibreOffice\4\user\Scripts\python\TsvImport.py
4.実行
4.1. sar でリソース情報の取得
負荷テストでの情報収集を想定して、まず、各サーバ上で sar コマンドを実行し、1秒間隔でデータを蓄積します。
下記の例では、1秒間隔で5分間データを収集し、/tmp/<ホスト名>.sar に保存します。
# sar -o /tmp/`uname -n`.sar 1 300 > /dev/null &途中で停止したい場合は pgrep 'sar' などで pid を探して KILL します。
4.2. LibreOffice(calc)に収集先サーバのリストを記載
下図のようにリストを作成。
この例では、2台のサーバから sar の情報を収集します。
4.3.Pythonマクロを実行
[ツール] > [マクロ] > [マクロの実行] を選択して、TsvImport を実行します。
実行中は、下図のように表示されます。
DOS窓とTeraTermのウィンドウが表示されます。
実行が終了すると、下図のようにシートが追加され、sar の情報を読み込まれています。
1台につき4枚のシート(CPU/Memory/Network/DISK)が追加されるので、
この例では、2台分で計8枚のシートが追加されます。
4.4.グラフの作成
上記で作成したシートのデータを元に、手作業でグラフを作成したり性能分析に利用できます。