garsue-blog http://garsue.github.com/ 個人的な技術系ブログ。備忘録、レビューなど。 en-us Sun, 22 Sep 2013 00:00:00 +0900 http://garsue.github.com/2013/09/22/load_test_with_gatling.html http://garsue.github.com/2013/09/22/load_test_with_gatling.html <![CDATA[Gatling を使った負荷テスト]]>

Gatling を使った負荷テスト

先日Webサービスの負荷テストを行う際に、 Gatling というツールを使ったのでその概要をまとめておく。 ざっくり調べたことのまとめなので、間違い等あったら @__garsue__ に指摘してください。

負荷テストとシナリオ

そもそも僕は負荷テストというものが何かを知らなかった。 ググったところ JMeterを始め、いろいろな形式の負荷テストツールや負荷テストサービスがあるらしい。

いずれのツールもやることは基本的にHTTPリクエストを投げることなのだが、その内容や数など、シチュエーションに応じたリクエストを作らなければ負荷テストとして意味が無い。 そのシチュエーションを再現した一連のHTTPリクエストを「シナリオ」という。

負荷テストツールを選ぶ上で、どのようにシナリオを作るかという点が大きな選択基準となる、と思う。 その点に関して、今回触ったGatlingはなかなか秀逸だと感じた。

Gatlingの特徴

Gatlingの特徴はシナリオをScalaによる内部DSLで記述する点だ。 初見でもサンプルをそれなりに読み下せる。

JMeterのサンプルが比較対象として上げられているが、こんな長ったらしいXMLを見ると体調を崩すタイプの人間にはGatlingのDSLはかなりありがたい。

また、JMeter同様シナリオの自動生成もできる。やり方はJMeterと同様プロキシサーバを立ててそれ越しにWebサービスにアクセスし、HTTPのやりとりを記録する方法だ。 JMeterと比べた利点は生成されるシナリオを人が読める点だ。

生成されたシナリオは余計なリクエストや不要なヘッダを含んでいたりして、シナリオとしてそのまま使えるということはそう多くないと思う。 したがって、シナリオとして仕上げるためにはある程度編集が必要となる。

JMeterの場合はちまちまGUIから編集するか、場合によっては巨大なXMLをいじるはめになるのだろうが、Gatlingでは生成されるシナリオも比較的触りやすい形になっている [1]

シナリオを実行した結果のレポートもおしゃれで、大したこと無いテストでもなんだか一仕事した感を演出してくれる。 レスポンスタイムの最小・最大・平均だけでなく、標準偏差・P値まで出し、グラフによる可視化もこれでもかというぐらいやってくれる。

レポートに関しては他のツールがどんなものか分からないが、Gatlingのレポートで不足するシーンはめったにないだろう。

使用方法

公式ドキュメントに全て書いてあるので、そちらを読んでほしい。 https://github.com/excilys/gatling/wiki

英語だが、サンプルも多く使い方もシンプルなので、それほど難儀しないだろう。 Gatling 1とGatling 2があるが、2はまだ開発中とのこと。

不満

起動が遅い。JVMの起動とシナリオのコンパイルのせいか、起動からシナリオ実行まで結構もたつく。 シナリオ作成中にこまめに修正->実行をするのはそれほどスムーズではなかった。

最初は一からシナリオを手書きしていたが、あまりにももたもたしてストレスが溜まったので、結局Recoderで自動生成したものやや修正するだけにした。 そもそもそういった使い方を前提としているのかもしれない。

あとはcheckによるアサーションでリダイレクト先のURLの部分一致がほしいと思った。

脚注

[1]なぜか文字列がヒアドキュメントの形式( """こんな感じ""" )にされるが。
]]>
Sun, 22 Sep 2013 00:00:00 +0900
http://garsue.github.com/2013/07/14/pet_plan.html http://garsue.github.com/2013/07/14/pet_plan.html <![CDATA[飼育計画]]>

飼育計画

概要

現状の飼育条件を考慮した上で飼育可能と思われる種としてヒョウモントカゲモドキをとりあげ、どの程度の費用と手間がかかるかを検討する。

飼育条件

  • 世話ができない期間(最大1週間程度)があっても問題ない生物であること。
  • 高温に強いこと。
  • 極端に好みが分かれる容姿の生物(例えばヘビ、カエル、ゴキブリ、ヤスデ)でないこと。

候補となる生物

ヒョウモントカゲモドキ

ペットとして定番の爬虫類である。 飼いやすい性質を持っている。 必要な設備も小規模で済む。 絶食にも強い。

定番だけあって情報も多い。 寿命は10年以上らしい。 餌はイエコオロギやミルワームなどの昆虫食である。 生き餌以外にも餌付くが慣れないうちは生き餌が必要となる。

ビジュアル的にもカラフルで愛嬌のある顔をしており、比較的親しみやすいと思われる。

タランチュラ (オオツチグモ)

近年では飼育法も確立し、初心者でも十分な調査をすれば飼育できると思われる。 丈夫な種が多く、長期間の絶食にも耐える。 種によるが、生体そのものの価格はやや高めである。

飼育が軌道に乗れば10年以上は生きるらしい。 ただし、幼体や若い個体は飼育開始から間もなく死亡することがあるらしい。 餌は種や個体の大きさにもよるが、基本的に昆虫・ピンクマウス等で良い。

一般的に毒グモのイメージが強いが、毒自体はそこまで強いものではない。 ただし、噛まれれば腫れることもある。 また、毒以前に顎自体が強力であるため、噛まれるだけで怪我をする。

もう一つ注意すべき点は体表を覆う刺激毛である。 刺激毛が目や皮膚についた場合は炎症を起こす場合がある。

やはりクモであるため、苦手な人には受け入れがたい生物かもしれない。

その他

基本的に毎日世話が必要な哺乳類・鳥類は避ける。 一般に高温に弱いと思われる水棲生物は避けたほうがよい。 地上性の両生類(ツノガエル、サラマンダーなど)も高温には弱いため避けたほうが無難だろう。

タランチュラと同時に語られる事が多いサソリは検討に値するが、毒性はタランチュラよりも強く、乾燥・水切れに弱いらしい。

結論

もっとも条件に合っている生物はやはりヒョウモントカゲモドキだろう。 以下ではヒョウモントカゲモドキを飼育する前提で必要となる設備・費用・手間などを検討していく。

初期費用

生体 10,000
飼育ケース 6,000
保温器具 3,500
サプリメント 3,000
温湿度計 1,000
ピンセット 1,000
シェルター 600
雑費 300
合計 25,400

セットアップ

生体

極端に安い生体は避ける。 通販よりも実物を見て、健康状態と餌付きを確認して購入することが望ましい。 アルビノ個体は通常個体よりも視力が弱いため避ける。

飼育ケース

今あるものが使えるか検討する。 既存のものを利用する場合でも蓋を購入する必要がある。

保温器具

遠赤外線パネルヒーターを利用する。 飼育ケース全面を温めるわけではないので、ケース底面の1/2ないし1/3程度をカバーできるものを選ぶ。

シェルター

流木等の天然のものや、セラミック製のものなどがある。 掃除のしやすいものを選ぶ。

その他必要なもの

  • 水苔設置用容器(タッパーなど)
  • 水入れ、サプリメント入れ

ランニングコスト

遠赤外線パネルヒーターの消費電力は6~10Wであり、家庭用ルータ1台分程度である。 夏場はつける必要はないが、冷房を入れる場合はつけるべきかもしれない。

餌代は仮に1日平均で6匹のイエコオロギを食べ、イエコオロギ一匹あたり8円だった場合、1,440になる。

日常的な世話

毎日やる世話

  • 給餌(幼体・若い個体の場合)
  • 排泄物を取り除く。
  • 飲水の交換

週に3,4度やる世話

  • 給餌(成体の場合)

週に1度やる世話

  • 床材(キッチンペーパー)を取り替える。

生き餌

ヨーロッパイエコオロギかミルワームが定番である。 その他にはハニーワーム、ピンクマウス、デュビアがよく利用されている。 栄養を増加・調整するために餌にも栄養のあるものを食べさせ、餌にする直前にサプリメントをまぶす。

餌の飼育は容易で、繁殖に成功すれば安価に安定した餌が得られる。 ただしイエコオロギは素早いため脱走に注意する。

生き餌以外

大半が冷凍であるため、冷凍庫が必要となる。 与える際は十分に湯につけて温める。

人工飼料もあるが、餌付くかどうかは個体により、補助的な利用に留めておくべきという情報もある。

]]>
Sun, 14 Jul 2013 00:00:00 +0900
http://garsue.github.com/2013/03/31/fabric_with_vagrant.html http://garsue.github.com/2013/03/31/fabric_with_vagrant.html <![CDATA[FabricとVagrant]]>

FabricとVagrant

Vagrant

開発環境向け仮想マシンマネージャでお馴染みの Vagrant を最近使い始めた。 実態は単なるVirtual Box [1] のCLIユーティリティだが、開発端末としてMacを利用している場合、KVMは利用できないし、LXCやFreeBSD jailに相当するものもないため、開発環境構築に重宝する。

手軽に仮想マシンを作れるようになった一方で、開発環境として構成する作業は別途面倒を見なければならない。 そういった文脈で Chef と一緒に語られることが多いが、Chefは学習コストが高いことでお馴染みなので僕は未だに手を出せていない [2]

Fabric

そこで前々から気になっていた Fabric を利用することにした。 これはコマンド実行やらファイル転送やらの一連の環境構築作業をtaskとしてSSH越しに実行するPython製のツールだ。

動きとしてはかなりシンプルで、各種APIを組み合わせて作った関数をtaskとしてローカルないしリモートで実行するだけ。 ローカルでshell scriptの代わりに使うのも大いに便利らしく、ちょっとした自動化ならかなりのことをこなせそうだ [3] 。 僕のようにshell力が乏しい人間にとって、Pythonで書けるというのはうれしい。

FabricでVagrantに入る

Vagrantと組み合わせる場合、まずFabricがsshで開発環境に入れなければならないのでそのための設定をする。 ググったところ、 Use Fabric on Vagrant instances という記事がヒットしたが、秘密鍵のパスを取得する部分が動かなかったので以下のように修正した。:

import re
from fabric.api import env, local

def vagrant():
    # change from the default user to 'vagrant'
    env.user = 'vagrant'
    # connect to the port-forwarded ssh
    env.hosts = ['127.0.0.1:2222']

    # use vagrant ssh key
    # 'IdentityFile "/Users/garsue/.vagrant.d/insecure_private_key"'
    result = local('vagrant ssh-config | grep IdentityFile', capture=True)
    env.key_filename = re.search('"(.*)"', result).group(1)

その他にハマった部分として、ホスト名をavahiおよびbonjourで割り振っている場合、 env.hosts にそのままホスト名を渡しても名前解決できないため、接続できなかった。

回避策として socket モジュールの gethostbyname を利用して自力でIPアドレスを引っ張った。

コンテキストマネージャ

Fabric デプロイツールのPythonicな書き方 の最後にあるように、コンテキストマネージャを利用してコマンドのprefixを指定できる点がかなり良い。 よく使うのは cd で、たとえば

with cd("~/.local/"):
   run("ls -la")

とした場合、このコンテキスト下では全てのコマンドの先頭に cd ~/.local/ && が付与されるため、結果として ~/.local/ 以下が表示される。

さらに fabric.context_managers.prefix を使えば任意のprefixを利用できる。あまりいい例ではないかもしれないが、 virtualenvwrapper を利用して仮想環境を作成するtaskを以下のように定義した。:

def setup_python():
    packages = ["ipython", "mock", "pep8", "pyflakes", "pytest-cov", "tox",
                "dotcloud"]
    packages = " ".join(["-i " + p for p in packages])
    with cd("~"):
        run("wget http://python-distribute.org/distribute_setup.py")
        run("python3 distribute_setup.py --user")
        run("rm distribute*")
        run(".local/bin/easy_install --user pip")
        run(".local/bin/pip install --user virtualenvwrapper")
        prefixes = [
            "export VIRTUALENVWRAPPER_PYTHON=/usr/bin/python3",
            "export VIRTUALENVWRAPPER_VIRTUALENV=$HOME/.local/bin/virtualenv",
            "export WORKON_HOME=$HOME/.virtualenvs",
            "export PROJECT_HOME=$HOME/Projects",
            "source .local/bin/virtualenvwrapper.sh"
        ]
        with prefix(" && ".join(prefixes)):
            run("mkvirtualenv --python=python3 --use-distribute "
                "{} 3".format(packages))
            run("mkvirtualenv --python=python2 --use-distribute "
                "{} 2".format(packages))

利用したPlugins

vagrant-vbguest

利用しているVirtual Boxと配布されているbox [4] の Guest Additions のバージョンが異なっていたため、それをアップデートするPluginである vagrant-vbguest を利用した。

Sahara

Chefと違いFabricには冪等性が無いため、同じtaskを何度も実行すると環境が変化してしまう。環境構築が目的の場合、一度作ったtaskを何度も実行するということはあまりないかもしれないが、task作成時には動かしながら作ることになるため、task実行前の状態に戻せるような仕組みが欲しくなるだろう。

そこでsandbox機能を実現するpluginである Sahara を利用した。これを利用することで、仮想マシン上で行った操作を任意のタイミングでrollbackして取り消せるようなる。

ただしVagrant 1.1に対応していないとか開発が止まっているとか言われているので少し注意して利用したい。

脚注

[1]AWSとかVMwareとかにも対応しているらしい? 個人的に必要ないので調べてない
[2]入門Chef Solo - Infrastructure as Code が出たのでそろそろ触りたいとは思っているが、まだもう少し見送る
[3]Fabric Python Developers Festa 2013.03 #pyfes // Speaker Deck
[4]僕は専ら Ubuntu 12.04 を利用している
]]>
Sun, 31 Mar 2013 00:00:00 +0900
http://garsue.github.com/2013/02/11/initial_post.html http://garsue.github.com/2013/02/11/initial_post.html <![CDATA[ブログ開始]]>

ブログ開始

日々の積み重ねの手段として、ブログを書くことにした。 reSTで書けるということで、Tinkerer を採用してみた。

ターミナルで執筆できるため、更新コストが下がり、そこそこまめに書けるのではないだろうか、と期待している。

内容は基本的に必要なことを書くだけに留めようと思う。 タイトルで煽ったり、過剰な表現を使うことは避ける。 雑感などはTwitterで十分なので事実を中心に書いていきたい。

]]>
Mon, 11 Feb 2013 00:00:00 +0900