[ネタ記事]kintone環境の負荷テストをする（その1）

## はじめに
この記事は[kintone Advent Calendar 2015](http://qiita.com/advent-calendar/2015/kintone)12/14分の記事です。
そしてうｐするのが0時回って涙目です。。。

皆さんわりと真面目な記事をうｐされているようなので、ちょっと異なった切り口でkintoneにアプローチしてみようと思いました。マネージドなSaaSサービスを利用していた場合、普通の人なら考えないかもしれません。。。


はい。自滅の覚悟で自虐ネタです（サイボウズさんほんとごめんなさい…


今回は己の身を犠牲にして検証しているので
良い子は真似しちゃ<b><font color="red">だめ！ゼッタイ！！！！！！！</font></b>


## 事前準備
まずはkintone開発者アカウントを取得。
※アカウント取得には **cybozu.com developer network** への登録が必要です。
https://cybozudev.zendesk.com
<img width="348" alt="20151214-1.png" src="https://qiita-image-store.s3.amazonaws.com/0/73604/86694f45-49cb-ddb6-86f0-a5f626604f02.png">




しっかり利用規約は読んで下さい！利用規約マジ大事。
### 第３条（開発者ライセンスの利用条件）

    開発者ライセンスに基づき対象サービスを利用する場合には、以下の全ての条件に従うものとします。
        対象サービスに関する疑問等 については、cybozu.comサービス説明書の定めに関わらずテクニカルサポートサービスを利用することはできず、developer networkのコミュニティで質問をし、利用者自身で解決するものとします。
        ・・・　中略　・・・
        前項に定めるものの他、開発者ライセンスに基づく対象サービスの利用が、他の利用ユーザーに影響を及ぼす場合またはその恐れが有る場合、サイボウズは開発者ライセンスに基づく対象サービスの利用の停止、または利用者開発環境の削除をすることができるものとします。


### 開発者アカウントでkintoneにログインできるか確認
ポータル画面にログイン出来るようになればkintone側の準備はOKです(๑´ㅂ`๑)
<img width="350" alt="20151214-2.png" src="https://qiita-image-store.s3.amazonaws.com/0/73604/76c089e0-9ac5-7b5a-787c-b44a9479fca6.png">



## 負荷テスト用ツールの準備
負荷テストを実施するためには、計測するための環境が必要です。
kintoneはSaaS環境なので、もちろんkintone環境にそんなツールを仕込むわけにはいきません。
ということで、外部サーバーに環境を構築します。

## 外部サーバーに負荷ツールをインストール
負荷ツールはオープンソースでもいろいろあるのですが、今回は[Tsung](http://tsung.erlang-projects.org/)を採用してみました。

### 負荷ツールに必要なパッケージのインストール
Erlangで記述されているため、Erlangのインストールが必須です。
**Amazon Linux**だと標準のレポジトリからインストール出来るんですね。お手軽！
（EPEL必要かと思ってレポジトリ追加してから気づいた...）

```bash:
$ sudo yum list erlang
Loaded plugins: priorities, protectbase, update-motd, upgrade-helper
0 packages excluded due to repository protections
Available Packages
erlang.x86_64                                                                                               R14B-04.2.7.amzn1                                                                                               amzn-main


$ sudo yum -y install erlang.x86_64
Loaded plugins: priorities, protectbase, update-motd, upgrade-helper
0 packages excluded due to repository protections
Resolving Dependencies
--> Running transaction check
---> Package erlang.x86_64 0:R14B-04.2.7.amzn1 will be installed

　・・・　中略　・・・

Dependency Installed:
  erlang-appmon.x86_64 0:R14B-04.2.7.amzn1               erlang-asn1.x86_64 0:R14B-04.2.7.amzn1                   erlang-common_test.x86_64 0:R14B-04.2.7.amzn1             erlang-compiler.x86_64 0:R14B-04.2.7.amzn1
  erlang-cosEvent.x86_64 0:R14B-04.2.7.amzn1             erlang-cosEventDomain.x86_64 0:R14B-04.2.7.amzn1         erlang-cosFileTransfer.x86_64 0:R14B-04.2.7.amzn1         erlang-cosNotification.x86_64 0:R14B-04.2.7.amzn1
  erlang-cosProperty.x86_64 0:R14B-04.2.7.amzn1          erlang-cosTime.x86_64 0:R14B-04.2.7.amzn1                erlang-cosTransactions.x86_64 0:R14B-04.2.7.amzn1         erlang-crypto.x86_64 0:R14B-04.2.7.amzn1
  erlang-debugger.x86_64 0:R14B-04.2.7.amzn1             erlang-dialyzer.x86_64 0:R14B-04.2.7.amzn1               erlang-diameter.x86_64 0:R14B-04.2.7.amzn1                erlang-docbuilder.x86_64 0:R14B-04.2.7.amzn1
  erlang-edoc.x86_64 0:R14B-04.2.7.amzn1                 erlang-erl_docgen.x86_64 0:R14B-04.2.7.amzn1             erlang-erl_interface.x86_64 0:R14B-04.2.7.amzn1           erlang-erts.x86_64 0:R14B-04.2.7.amzn1
  erlang-et.x86_64 0:R14B-04.2.7.amzn1                   erlang-eunit.x86_64 0:R14B-04.2.7.amzn1                  erlang-examples.x86_64 0:R14B-04.2.7.amzn1                erlang-gs.x86_64 0:R14B-04.2.7.amzn1
  erlang-hipe.x86_64 0:R14B-04.2.7.amzn1                 erlang-ic.x86_64 0:R14B-04.2.7.amzn1                     erlang-inets.x86_64 0:R14B-04.2.7.amzn1                   erlang-inviso.x86_64 0:R14B-04.2.7.amzn1
  erlang-jinterface.x86_64 0:R14B-04.2.7.amzn1           erlang-kernel.x86_64 0:R14B-04.2.7.amzn1                 erlang-megaco.x86_64 0:R14B-04.2.7.amzn1                  erlang-mnesia.x86_64 0:R14B-04.2.7.amzn1
  erlang-observer.x86_64 0:R14B-04.2.7.amzn1             erlang-odbc.x86_64 0:R14B-04.2.7.amzn1                   erlang-orber.x86_64 0:R14B-04.2.7.amzn1                   erlang-os_mon.x86_64 0:R14B-04.2.7.amzn1
  erlang-otp_mibs.x86_64 0:R14B-04.2.7.amzn1             erlang-parsetools.x86_64 0:R14B-04.2.7.amzn1             erlang-percept.x86_64 0:R14B-04.2.7.amzn1                 erlang-pman.x86_64 0:R14B-04.2.7.amzn1
  erlang-public_key.x86_64 0:R14B-04.2.7.amzn1           erlang-reltool.x86_64 0:R14B-04.2.7.amzn1                erlang-runtime_tools.x86_64 0:R14B-04.2.7.amzn1           erlang-sasl.x86_64 0:R14B-04.2.7.amzn1
  erlang-snmp.x86_64 0:R14B-04.2.7.amzn1                 erlang-ssh.x86_64 0:R14B-04.2.7.amzn1                    erlang-ssl.x86_64 0:R14B-04.2.7.amzn1                     erlang-stdlib.x86_64 0:R14B-04.2.7.amzn1
  erlang-syntax_tools.x86_64 0:R14B-04.2.7.amzn1         erlang-test_server.x86_64 0:R14B-04.2.7.amzn1            erlang-toolbar.x86_64 0:R14B-04.2.7.amzn1                 erlang-tools.x86_64 0:R14B-04.2.7.amzn1
  erlang-tv.x86_64 0:R14B-04.2.7.amzn1                   erlang-typer.x86_64 0:R14B-04.2.7.amzn1                  erlang-webtool.x86_64 0:R14B-04.2.7.amzn1                 erlang-xmerl.x86_64 0:R14B-04.2.7.amzn1
  libtool-ltdl.x86_64 0:2.4.2-20.4.8.3.31.amzn1          unixODBC.x86_64 0:2.2.14-14.7.amzn1

Complete!

```

#### Tsungのダウンロード
サイトからパッケージをDLします。

```bash:
$ wget -P /tmp http://tsung.erlang-projects.org/dist/tsung-1.6.0.tar.gz
--2015-12-14 13:52:02--  http://tsung.erlang-projects.org/dist/tsung-1.6.0.tar.gz
Resolving tsung.erlang-projects.org (tsung.erlang-projects.org)... 37.187.100.238
Connecting to tsung.erlang-projects.org (tsung.erlang-projects.org)|37.187.100.238|:80... connected.
HTTP request sent, awaiting response... 200 OK
Length: 1585794 (1.5M) [application/x-gzip]
Saving to: ‘/tmp/tsung-1.6.0.tar.gz’

tsung-1.6.0.tar.gz                                        100%[====================================================================================================================================>]   1.51M   858KB/s   in 1.8s

2015-12-14 13:52:04 (858 KB/s) - ‘/tmp/tsung-1.6.0.tar.gz’ saved [1585794/1585794]

```

#### Tsungの展開＆コンパイル
DLしたパッケージを展開してコンパイルします。
今回はテストなので、プレフィックス等コンパイル時にオプションは指定していません。
（デフォルトの設定でインストールされる関係で、手間なのでrootにスイッチしてインストールしています）

```bash:
$ tar zxf tsung-1.6.0.tar.gz
$ sudo su -（※ここでrootにスイッチ）

# cd /home/ec2-user
# ./configure && make && make install
```


## Tsungを使用した負荷テスト
では、パッケージのインストールも完了したところで、早速負荷テストのための設定を行います。
/usr/share/doc/tsung/examples 配下にサンプルのxmlファイルがあるので、これを参考にしたいと思います。

###　負荷テスト用のパラメータ設定 

記述方法は[こちら](http://tsung.erlang-projects.org/user_manual/index.html)を参考にしながら。
（※下記はサンプルです）

```diff:
$ diff -u /usr/share/doc/tsung/examples/http_simple.xml /home/ec2-user/tsung-1.6.0/http_simple.xml
--- /usr/share/doc/tsung/examples/http_simple.xml       2015-12-14 14:10:31.191237188 +0000
+++ /home/ec2-user/tsung-1.6.0/http_simple.xml  2015-12-14 14:32:32.807241774 +0000
@@ -9,22 +9,22 @@

   <!-- Server side setup -->
 <servers>
-  <server host="myserver" port="80" type="tcp"></server>
+  <server host="***.cybozu.com" port="443" type="ssl"></server>
 </servers>

   <!-- to start os monitoring (cpu, network, memory). Use an erlang
-  agent on the remote machine or SNMP. erlang is the default -->
+  agent on the remote machine or SNMP. erlang is th default -->
   <monitoring>
-    <monitor host="myserver" type="snmp"></monitor>
+    <monitor host="***.cybozu.com" type="snmp"></monitor>
   </monitoring>

   <load>
   <!-- several arrival phases can be set: for each phase, you can set
   the mean inter-arrival time between new clients and the phase
   duration -->
-   <arrivalphase phase="1" duration="10" unit="minute">
-     <users interarrival="2" unit="second"></users>
-   </arrivalphase>
+   <arrivalphase phase="1" duration="5" unit="minute">
+      <users arrivalrate="10" unit="minute" maxnumber="50" ></users>
+    </arrivalphase>
   </load>

   <options>

```

###　ログファイルのパス
ログファイルは指定しなければ下記ディレクトリ配下に生成されます。
ちゃんとサーバーに到達してるかリアルタイムで確認しながら実行するといいかもしれないですね。

```bash:
# ll /root/.tsung/log/20151214-1433/
total 1820
-rw-r--r-- 1 root root    1533 Dec 14 14:33 http_simple.xml
-rw-r--r-- 1 root root      63 Dec 14 14:33 index.html
-rw-r--r-- 1 root root       0 Dec 14 14:33 inets_error.log
-rw-r--r-- 1 root root      62 Dec 14 14:34 match.log
drwxr-xr-x 2 root root    4096 Dec 14 14:33 style
-rw-r--r-- 1 root root       0 Dec 14 14:33 tsung-123456.dump
-rw-r--r-- 1 root root 1819542 Dec 14 14:39 tsung_controller@ip-172-31-6-98.log
-rw-r--r-- 1 root root   21142 Dec 14 14:39 tsung.log
```


```bash:tsung.log
# stats: dump at 1450103940
stats: users 0 1
stats: {load,"tsung_controller@ip-********"} 1 0.0 0.0 0.0 0.0 0.0 30
stats: {recvpackets,"tsung_controller@ip-********"} 1 11.0 0.0 82 1 24.724137931034488 29
stats: {sentpackets,"tsung_controller@ip-********"} 1 23.0 0.0 53 1 30.275862068965516 29
stats: {cpu,"tsung_controller@ip-********"} 1 0.3 0.0 0.7021063189568706 0.0 0.3420084262531492 30
stats: {freemem,"tsung_controller@ip-********"} 1 917.98046875 0.0 926.50390625 913.51171875 917.7651041666667 30
stats: session 0 0 0 38.845947265625 13.171142578125 14.41109375 50
stats: users_count 0 50
stats: finish_users_count 0 50
stats: error_unknown 0 50
EndMonitor:{1450,103940,410434}
```


次回はパラメータ設定していよいよ負荷テストします…うまくいくかどうか（

[(その2)]()につづく★