ab

Angel Beatsではありません。
Apache Benchmarkです。
そういえばAngel Beats2話以降見てないなぁ。まぁいい。

Apache Benchmarkということで
HTTPの性能試験に使うツールです。
Apacheをインストールすると合わせて入るらしいです。

使い方はこんな感じ。

# ab -n <リクエスト数> -c <同時接続数>

の部分は/でも指定できます。
ただ、その場合の部分は必須のようです。
なんですが、実は/とかでも良いようです。

結果はこんな感じ。


ab -n 1000 -c 100 172.16.1.1/ [~/work/nanodayo/perf/ab]
This is ApacheBench, Version 2.3 <$Revision: 655654 $>
Copyright 1996 Adam Twiss, Zeus Technology Ltd, http://www.zeustech.net/
Licensed to The Apache Software Foundation, http://www.apache.org/

Benchmarking 172.16.1.1 (be patient)
Completed 100 requests
Completed 200 requests
Completed 300 requests
Completed 400 requests
Completed 500 requests
Completed 600 requests
Completed 700 requests
Completed 800 requests
Completed 900 requests
Completed 1000 requests
Finished 1000 requests


Server Software: Apache/2.2.14
Server Hostname: 172.16.1.1
Server Port: 80

Document Path: /
Document Length: 177 bytes

Concurrency Level: 100
Time taken for tests: 2.964 seconds
Complete requests: 1000
Failed requests: 0
Write errors: 0
Total transferred: 454260 bytes
HTML transferred: 177885 bytes
Requests per second: 337.44 [#/sec] (mean)
Time per request: 296.353 [ms] (mean)
Time per request: 2.964 [ms] (mean, across all concurrent requests)
Transfer rate: 149.69 [Kbytes/sec] received

Connection Times (ms)
min mean[+/-sd] median max
Connect: 4 142 361.8 19 2029
Processing: 3 73 154.2 20 1209
Waiting: 3 54 119.7 20 883
Total: 19 215 391.6 40 2487

Percentage of the requests served within a certain time (ms)
50% 40
66% 45
75% 62
80% 323
90% 946
95% 1008
98% 1366
99% 2001
100% 2487 (longest request)

リクエスト数が151を超えると、
Completed 100 requests
のように進捗状況が出力されます。


他には認証やPOSTメソッドにも対応しているようですが
それはまた次回にでも。

iperf

最近、計測系ツールも調べています。
思えばこの手のツールをちゃんと使ったことがなかったです。

iperfはネットワークのパフォーマンスを測定するツールで
このプログラム一つでサーバにもクライアントにも出来ます。

サーバとして使う場合は

# iperf -s -p <待ち受けポート>

のように実行する。

クライアントとして実行する場合は

# iperf -c <サーバのアドレス> -p <サーバのポート> -t <測定時間>

のように実行します。
測定時間の単位は秒です。

なお、測定時間の代わりにデータのサイズを指定することも出来ます。
両方で指定した場合は後ろにつけた方が優先されるようです。

# iperf -c <サーバのアドレス> -p <サーバのポート> -n <データサイズ>

サイズを指定できます。何も付けないとByte単位、KでKByte、MでMByte単位になります。
指定自体は自由にできますが、8KByteの倍数に調整されるようです。
#defaultのバッファサイズが8KByteなため

他には-uUDPになります。

出力結果はこんな感じ。

# iperf -c 127.0.0.1 -p 10000 -n 1M -u

                                                                                                                      • -

Client connecting to 127.0.0.1, UDP port 10000
Sending 1470 byte datagrams
UDP buffer size: 8.00 KByte (default)

                                                                                                                      • -

[1828] local 127.0.0.1 port 4587 connected with 127.0.0.1 port 10000
[ ID] Interval Transfer Bandwidth
[1828] 0.0- 1.3 sec 167 KBytes 1.04 Mbits/sec
[1828] Server Report:
[1828] 0.0- 1.3 sec 167 KBytes 1.04 Mbits/sec 0.000 ms 0/ 116 (0%)
[1828] Sent 116 datagrams

また-iで途中経過を出力することができて、間隔を指定できます。
単位は秒単位です。0.5とかやると1秒より短く出来ますが
0.5秒が最小のようです。


# iperf -c 127.0.0.1 -p 10000 -n 1M -i 0.05 -u
WARNING: interval too small, increasing from 0.05 to 0.5 seconds.

                                                                                                                      • -

Client connecting to 127.0.0.1, UDP port 10000
Sending 1470 byte datagrams
UDP buffer size: 8.00 KByte (default)

                                                                                                                      • -

[1828] local 127.0.0.1 port 4625 connected with 127.0.0.1 port 10000
[ ID] Interval Transfer Bandwidth
[1828] 0.0- 0.5 sec 64.6 KBytes 1.06 Mbits/sec
[1828] 0.5- 1.0 sec 64.6 KBytes 1.06 Mbits/sec
[1828] 1.0- 1.5 sec 63.2 KBytes 1.03 Mbits/sec
[1828] 1.5- 2.0 sec 64.6 KBytes 1.06 Mbits/sec
[1828] 2.0- 2.5 sec 63.2 KBytes 1.03 Mbits/sec
[1828] 2.5- 3.0 sec 64.6 KBytes 1.06 Mbits/sec
[1828] 3.0- 3.5 sec 64.6 KBytes 1.06 Mbits/sec
[1828] 3.5- 4.0 sec 63.2 KBytes 1.03 Mbits/sec
[1828] 4.0- 4.5 sec 64.6 KBytes 1.06 Mbits/sec
[1828] 4.5- 5.0 sec 63.2 KBytes 1.03 Mbits/sec
[1828] 5.0- 5.5 sec 64.6 KBytes 1.06 Mbits/sec
[1828] 5.5- 6.0 sec 63.2 KBytes 1.03 Mbits/sec
[1828] 6.0- 6.5 sec 64.6 KBytes 1.06 Mbits/sec
[1828] 6.5- 7.0 sec 64.6 KBytes 1.06 Mbits/sec
[1828] 7.0- 7.5 sec 63.2 KBytes 1.03 Mbits/sec
[1828] 0.0- 8.0 sec 1.00 MBytes 1.05 Mbits/sec
[1828] Server Report:
[1828] 0.0- 8.0 sec 1.00 MBytes 1.05 Mbits/sec 0.000 ms 0/ 714 (0%)
[1828] Sent 714 datagrams

その他、バッファサイズなども指定できますが
今回は基本的な部分だけで。

結果を取り出して、グラフ用の値にする方法も考えていますが
第一段階としてはgrep secしておけば良さそうです。

MACアドレスをリンクローカルアドレスに変換するスクリプト

タイトルの通りの変換を行うスクリプトを作ってみました。

#!/usr/bin/perl

$prefix = "fe80";
$mac_file = $ARGV[0];

open(MACLIST, "< $mac_file");
while($buf=) {
@mactmp = split(/:/,$buf);
$j=0;
$addrtmp = hex($mactmp[$j++]) ^ 2;
$addr[0] = sprintf("%x%s",$addrtmp,$mactmp[$j++]);
$addr[1] = sprintf("%sff",$mactmp[($j++)]);
$addr[2] = sprintf("fe%s",$mactmp[($j++)]);
$addr[3] = sprintf("%s%s",$mactmp[($j++)],$mactmp[$j++]);

printf("$prefix::$addr[0]:$addr[1]:$addr[2]:$addr[3]",$addr[0]);
}

引数には、MACアドレスリストを書いたファイルを渡す必要があります。
用途的に、$jの部分は別にハードコードしても問題ないかと思います。
$prefixは将来的には指定できるようにして、
グローバルアドレスに対応させようと思っていたり。
そうなると::省略が真ん中とは限らなくなったり、そもそも省略がなかったりしますね。

ちなみに引数で渡すファイルの中身はこんな感じ。
1行ずつ書かれているのを想定しています。
空行があると変なアドレスを出力しちゃうと思います。


11:11:11:11:11:11
22:22:22:22:22:22

ところで何に使うんだろう

CentOSでのMyPLCインストール

CentOSで、MyPLCを構築するためのメモです。
yumが使用出来れば、他のディストリビューションでも同じようにできると思われます。
ちなみにCentOS5.5での作業メモです。

■準備・インストール編

selinuxを無効にする

selinuxが有効だと、MyPLCのサービスが起動しなかったりと
挙動に影響が出るので無効にしておきます。
具体的には、空パスが設定されるところに、違うパスワードが設定されたりします。

/etc/sysconfig/selinuxを編集。
SELINUX=enforcingSELINUX=disabled に変更します。

yum用のファイルの作成

MyPLCをyumで入手するために、レポジトリの設定ファイルを作成します。
/etc/yum.repo/myplc.repoなどの名前で保存します。

[myplc]
name= MyPLC
baseurl=http://build.planet-lab.org/planetlab/centos5/planetlab-centos5-i386-5.0-rc10/RPMS/
enabled=1
gpgcheck=0

baseurlのURL部分は、使いたいバージョンや
PLC用ホストのOS等に合わせて変更します。

作成後、yumでmyplcをインストールします。

# yum install myplc

MyPLC本体を含めて、必要なパッケージが一通りインストールされます。
・・・のはずだったんですが、build.planet-lab.orgが落ちていたり
依存関係が解決できなくてエラーが出たりしてるので
今回はyumの必要ないRPMを使用しています。

・設定・起動

plc-config-ttyというコマンドが用意されており
インタラクティブに各項目を設定できます。
DNS以外は、基本的に自分自身のIPアドレスを入力すればOKです。
ただし、127.0.0.1などを指定してはいけません。
ここで指定したアドレスはインストーラで使用されるので
少なくとも、インストールするノードから到達性のあるアドレスを指定します。

DNSについてはPLCから利用するDNSサーバを指定します。

一通り入力した後、コマンドを入力できます。
wで設定を反映させた後、rでサービスを再起動

-bash-3.2# plc-config-tty
Enter command (u for usual changes, w to save, ? for help) u
== PLC_NAME : [PlanetLab Test] PlanetLab on OpenNebula
== PLC_SLICE_PREFIX : [pl]
== PLC_ROOT_USER : [root@localhost.localdomain] nanodayo@nanodayo.org
== PLC_ROOT_PASSWORD : [root]
== PLC_MAIL_ENABLED : [false]
== PLC_MAIL_SUPPORT_ADDRESS : [root+support@localhost.localdomain] nanodayo@nanodayo.org
== PLC_DB_HOST : [localhost.localdomain] 192.168.122.219
== PLC_API_HOST : [localhost.localdomain] 192.168.122.219
== PLC_WWW_HOST : [localhost.localdomain] 192.168.122.219
== PLC_BOOT_HOST : [localhost.localdomain] 192.168.122.219
== PLC_NET_DNS1 : [127.0.0.1] 192.168.122.1
== PLC_NET_DNS2 : [None]
Enter command (u for usual changes, w to save, ? for help) w
Wrote /etc/planetlab/configs/site.xml
Merged
/etc/planetlab/default_config.xml
and /etc/planetlab/configs/site.xml
into /etc/planetlab/plc_config.xml
+ service plc reload
You might want to type 'r' (restart plc) or 'q' (quit)
Enter command (u for usual changes, w to save, ? for help) r
==================== Stopping plc
PLC: Stopping crond: [ OK ]
PLC: Reverting /etc/resolv.conf and /etc/hosts: PLC: Stoppi[ OK ]erver:
[ OK ]
PLC: Stopping web server: [ OK ]
PLC: Stopping database server: [ OK ]
PLC: Stopping mail server: [ OK ]
PLC: Shutting down system logger: [ OK ]
[ OK ]
==================== Starting plc
PLC: Generating network files: [ OK ]
PLC: Starting system logger: [ OK ]
PLC: Starting database server: [ OK ]
PLC: Generating SSL certificates: [ OK ]
PLC: Configuring the API: [ OK ]
PLC: Updating GPG keys: [ OK ]
PLC: Generating SSH keys: [ OK ]
PLC: Starting web server: [ OK ]
PLC: Bootstrapping the database: [ OK ]
PLC: Starting DNS server: PLC: Configuring resolv.conf: [ OK ]
PLC: Starting crond: [ OK ]
PLC: Rebuilding Boot CD: [ OK ]
PLC: Rebuilding Boot Manager: [ OK ]
PLC: Signing and indexing node packages: [ OK ]
Enter command (u for usual changes, w to save, ? for help) q

一通りのサービスがOKとでれば完了です。

PlanetLab on OpenNebula(KVM) その1

※まだちゃんと動いてないので単なる作業メモ+日記です。過度な期待はしないでください。

ちょっとした遊びのネタとして
PlanetLab(MyPLC)をOpenNebula上で動かしてみようと思います。
元々PlanetLabの仕組みをOpenNebulaに置き換えて実現できるんじゃないかと
思うことがあって、試しに動かしてみようかなと。

OpenNebulaでハードウェアのセットアップを仮想的に行って
その上でPlanetLabを構築という形を考えています。

・PlanetLabに特化したセットアップを、OpenNebulaでどこまでできるか
・OpenNebulaで構築・運用する上でPlanetLabにどんな拡張が必要になるか

ひとまずMyPLCをセットアップすべくCentOSをOpenNebula上で構築しています。
パッケージの取得用と、実験用(DHCPを別途立てるとかやるので
プライベートネットワークでやりたい)でマルチホームに・・・
と思ったのですが、OpenNebulaでの構築に失敗しちゃいました。
そういえばどうやって記述するんだろう・・・?
もしかしてマルチホームを想定していないのかなぁ。

パスワードを指定してSSHコマンドを実行する

■前置き

サーバを10台とか100台とか管理している状況を想像してみてください。

その10台に全く同じファイルをコピーしたいとか
全く同じコマンドを実行させたいとか
同じ操作をしたくなる状況は多々あると思います。
普通にsshで1台1台にログインして操作すればいいのですが
数が多くなると面倒なので、なんとかスクリプトを組みたいと思うものです。
流石に100回も同じパスワードを打ちたくないですし。

■既存の手法

公開鍵を各サーバに登録してしまえば
自作スクリプトなり、psshなり、codeployなり、選択肢はあれこれありますが
ここでは鍵を登録していない状況で操作するための方法を考えます。

■expectを使った方法

サーバ側に特に準備をしない方法として
expectを使う手があります。
こんな感じのスクリプトを作ります。
ちなみに操作するPC側にはexpectをインストールする必要があります。

#!/usr/local/bin/bash

expect -c "
set timeout 5
spawn ssh $1
expect 'rsa\':'
send \r
expect 'password:'
send $2\r
interact
"

expectは対話的な操作を実行するプログラムです。
spawn hogehogeを実行し、
expect "hoge"で、hogeという出力を読み、send "hoge\r"hogeを入力します。
expect 'password:'みたいにやれば、パスワードの入力を求められた時に、
次のsendでパスワードを入力することができるわけです。

通常は1行目は
#!/usr/local/bin/expect にするらしいですが、
bashを経由して expect -c "中身" のようにすることによって
$1を引数として渡せるらしいです。

このスクリプトをexsshなんて名前にして
# exssh user@server password
のようにそれぞれ指定して実行すれば、勝手にログインしてくれます。
$3で、実行させたいコマンドを指定できるように改造してもいいでしょう。

あるいは
# exssh "user@server reboot" password
のように、$1の一部としてコマンドを指定する手もあります。