Edited at
kintoneDay 14

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

More than 3 years have passed since last update.


はじめに

この記事はkintone Advent Calendar 201512/14分の記事です。

そしてうpするのが0時回って涙目です。。。

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

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

今回は己の身を犠牲にして検証しているので

良い子は真似しちゃだめ!ゼッタイ!!!!!!!


事前準備

まずはkintone開発者アカウントを取得。

※アカウント取得には cybozu.com developer network への登録が必要です。

https://cybozudev.zendesk.com

しっかり利用規約は読んで下さい!利用規約マジ大事。


第3条(開発者ライセンスの利用条件)

開発者ライセンスに基づき対象サービスを利用する場合には、以下の全ての条件に従うものとします。

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


開発者アカウントでkintoneにログインできるか確認

ポータル画面にログイン出来るようになればkintone側の準備はOKです(๑´ㅂ`๑)


負荷テスト用ツールの準備

負荷テストを実施するためには、計測するための環境が必要です。

kintoneはSaaS環境なので、もちろんkintone環境にそんなツールを仕込むわけにはいきません。

ということで、外部サーバーに環境を構築します。


外部サーバーに負荷ツールをインストール

負荷ツールはオープンソースでもいろいろあるのですが、今回はTsungを採用してみました。


負荷ツールに必要なパッケージのインストール

Erlangで記述されているため、Erlangのインストールが必須です。

Amazon Linuxだと標準のレポジトリからインストール出来るんですね。お手軽!

(EPEL必要かと思ってレポジトリ追加してから気づいた...)

$ 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します。

$ 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にスイッチしてインストールしています)

$ 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ファイルがあるので、これを参考にしたいと思います。


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

記述方法はこちらを参考にしながら。

(※下記はサンプルです)

$ 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>


 ログファイルのパス

ログファイルは指定しなければ下記ディレクトリ配下に生成されます。

ちゃんとサーバーに到達してるかリアルタイムで確認しながら実行するといいかもしれないですね。

# 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


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)につづく★