2013年11月13日水曜日

Locust なる load testing tool

軽量な Web アプリのロードテストツールを探してたところ、Locust なる
Powered by Python なプログラムを発見。これ結構使える。
動作は Python コードで書くので柔軟性がある。

インストールは pip で一発だが、CentOS6 で可能な限り rpm で入れたいので
以下のように。そのうち自分で spec 作るか。

mater ブランチ持ってきてもいいけど、一応タグ打ってある版をここから
持ってきた。

# yum install python-devel python-zmq libevent-devel
# wget https://github.com/locustio/locust/archive/v0.6.2.tar.gz  -O locust-0.6.2.tar.gz
# tar xvzf locust-0.6.2.tar.gz
# cd locust-0.6.2
# python setup.py install

インストールが終わったら、適当に使ってみる。今回はユーザ毎にパラメータ
を変更した GET リクエストをたくさん投げる負荷テストをしてみたかったので
以下のような簡単なソースに。

テスト対象の動作の定義は、TaskSet クラスを継承したクラス(ここでは
MyFirstTasks) に適当な名前のメソッドを作り、その中でリクエストの URL
とパラメータを self.client.get() に指定すればいいだけ。複数メソッドを定義
した場合はランダムにそれを実行してくれる模様。@task(n) の n は、そのメソッ
ドの実行割合らしい。

実行順を定義したかったらクラスの定義をネストすれば良いらしい(私はまだやっ
たことがないが)。

Locust クラスを継承したクラス(ここでは MyFirstUser)は、操作するユーザ
を模したクラスらしい。この中の task_set という attribute に、上記した TaskSet
のクラス名を定義する。min_wait と max_wait はようわからんのだが、ユー
ザインスタンス間の実行間隔を定義しているらしい。
from locust import Locust, TaskSet, task
import random

class MyFirstTasks(TaskSet):
    @task(1)
    def myfunc(self):
        teststr = "teststr-" + "%04d" % random.randint(1,100)
        self.client.get("/mytest/?teststr=%s" % teststr)
class MyFirstUser(Locust):
    task_set = MyFirstTasks
    min_wait = 500
    max_wait = 1500

上記ファイル名を myfirsttest.py としたとして、下記のように実行する。

    locust -f myfirsttest.py -H http://www.fastriver.net

-H はリクエストを送るホストを定義する。

すると、http://localhost:8089 に管理画面が表れ、ここでスタート/ストップが
できたり、実行結果がわかったりする。

とまぁ超簡単な動作はこんな感じでできるが、複雑なもテストも動作を Python で
書けるので、Form に送る値を csv ファイル等に定義しておいて、ランダムにそれ
を送出するようなテストもできそう。

あと、master/slave 構成にもできるようなので、テストクライアント自体の
負荷分散も可能でかなり多くのリクエストを同時に送ることができそう。

また時間があったら詳しい使い方なんかを書いてみようと思う...書けたらいいな。。




2013年11月7日木曜日

Google の Service Account の p12 ファイルのパスフレーズ

Google Cloud Console または Google APIs Console において、
service account 用の pkcs#12 ファイルのパスフレーズっていったい何?
と思って調べたところ、Python の API のソースにその答えがあった。

notasecret だそうで。client.py:

    908         private_key,
    909         scope,
    910         private_key_password='notasecret',
    911         user_agent=None,
    912         token_uri=GOOGLE_TOKEN_URI,

実際の環境で使う場合は結び直した方が良さげ。

SignedJwtAssertionCredentials のコンストラクタ第4引数で指定する。

2013年11月6日水曜日

Google Cloud Console のエラー

Google Cloud Console でプロジェクトを作ろうとして以下のエラー

Cloud Console has not been activated for your account. Your account may be suspended or disabled. If you are a Google Apps user, ask your domain administrator to enable Apphosting Admin on your account.

Google Apps なユーザでかつ管理者なんだけど。。。Web 調べても情報が皆無。
試行錯誤したところ、Google Apps のコンパネのトップで「その他の設定」→
「他のGoogleサービス」→「Google App Engine 管理コンソール」が無効になって
いたせいだったらしい。
これを有効にしたところ、プロジェクトの作成成功。

2013年11月5日火曜日

DBus のバス名一覧の取得


dbus-send --session           \
  --dest=org.freedesktop.DBus \
  --type=method_call          \
  --print-reply               \
  /org/freedesktop/DBus       \
  org.freedesktop.DBus.ListNames


dbus-send --system            \
  --dest=org.freedesktop.DBus \
  --type=method_call          \
  --print-reply               \
  /org/freedesktop/DBus       \
  org.freedesktop.DBus.ListNames

2013年11月1日金曜日

openldap で bdb のトラザクションログが消えない

set_flags DB_LOG_AUTOREMOVE してるのに消えない。
これを設定すると checkpoint の際に消してくれるらしいが、
man slapd-bdb によると、slapd.conf に checkpoint の設定
が無い場合チェックポイントが発生しないらしい。
なので checkpoint 512 5 などと設定してみた。すると消える
ようになった。

デフォルト checkpoint が発生しないというのが解せないが…
じゃぁいつ flush してるのかと。