社内勉強会でGatling Hands-on を開催しました

アイスタイルでは、トレンドの技術や案件で利用したライブラリ、最近興味のある言語など、テクノロジーに関することを自由に共有することができる勉強会を、毎週木曜日に実施しています。今回は、性能試験のツールである Gatling について共有する勉強会「Gatling Hands-on」を実施しましたので、その内容をご紹介したいと思います。

Gatling とは

公式サイトでは、以下のように説明されています。

Gatling is a powerful open-source load and performance testing tool for web applications

Gatling はウェブアプリケーションの性能試験を行うためのオープンソースで提供される強力なツールです。Gatling 自体は Scala で実装されており、2018年9月現在は Java 8 を使って実行することができます。

性能試験のシミュレーション(シナリオ)は、ブラウザを利用して GUI で作成することもできますし、DSL を利用して豊富な API を駆使しながら柔軟なシミュレーションを組み立てることもできます。

また、結果は実行時のターミナルに出力されるだけでなく、見やすくデザインされた HTML ファイルも同時に出力されます。出力されたファイルはグラフなどが多用されており非常に見やすくなっているため、多くの場合はそのままエビデンスとして提出できるでしょう。

性能試験について

性能試験には、大きく分けて以下のようなものがあります。性能試験は多くの現場で「負荷試験」と呼ばれる場合がありますが、現場によって以下のどれを指すかが異なる場合が多いため、あらかじめ何を目的として試験を行うのかを確認するのがいいでしょう。

ロードテスト

システムに通常時やピーク時に想定される負荷をかけ、性能や耐久性を計測するテスト

ピークロードテスト

ロードテストのうち、特にピーク時に想定される負荷をかけるテスト

ストレステスト

システムへの負荷を徐々に上げていき、想定を超える負荷をかけた場合に、どのような反応や不具合が発生するかを確認するテスト

性能試験の重要性

「推測するな、計測せよ。」

この格言は、弊社の CTO がよく社員に向かって言っていることの一つです。性能試験の重要性も、この格言に当てはまります。

今、あなたが開発しているウェブアプリケーションは、どれほどの負荷に耐えられるかを把握しているでしょうか。性能試験は、あなたのアプリケーションを稼働させる前に、あなたのアプリケーションがどれだけの負荷に耐えられるかを事前に知ることができる重要な手段なのです。

例えばウェブ API を提供する場合に、どのくらいのアクセスを捌けるかは、Zabbix などの監視ツールから (または直接サーバーの状態を見ることで) CPU の負荷率、メモリの利用率、ストレージの空き容量、そしてネットワークの利用帯域などから計算して推測することは可能です。ですが、本当に捌けるアクセス数は、マシンで同時に動作しているアプリケーションの状態や、ネットワーク環境、プログラムに含まれる潜在的なバグ (メモリリークなど) に影響されて、正確な値は導き出すことは非常に困難でしょう。

性能試験を行ってアプリケーションに負荷を与えて計測することは、実際にサービスを運用している時の状況を再現することになります。いかに難しい計算や推測を行うよりも、実際に負荷を与えて計測することの方が、圧倒的に効率的で正確な値を導き出せるのです。

性能試験の要件

性能試験を行う場合には、その試験の達成基準をあらかじめ設けなくてはなりません。その要件として主に利用する値は以下の通りです。

単位時間あたりの処理量

秒間や分間など、一定の単位時間あたりでどれだけのアクセス数を捌けるべきかを設定します。ウェブアプリケーションの場合であれば、想定されるアクセス量を元に設定することが多いでしょう。

応答時間

リクエストを送信してから帰ってくるまでの時間を設定します。平均値ではなく、パーセンタイル値で設定するのが一般的です。Google では、ウェブページの応答時間 (サーバーのレスポンスタイム) を 100ms 以下にすることを推奨しています。

消費される資源

CPU やメモリなどの使用率を設定します。Gatling ではサーバーの状態を監視できないので、必要に応じて別途監視を行う必要があります。

パーセンタイル値とは

パーセンタイル値とは、計測値の分布を小さい数字から大きい数字に並べ、全体を 100 とした時に、小さい方から数えて何番目になるかの数値です。単位は pct が用いられます。以下の数値で 90 pct の値は 87 となります。

[13, 16, 25, 47, 50, 59, 74, 75, 87, 91] 

コンピュータシステムにおける性能試験では、試験実施時のネットワーク環境やサーバの環境によって、試験結果に誤差が生じる場合があります。そのため、試験実施時には 100 pct の値ではなく、適切な要件を定めて計測するのが一般的です。

Gatling を使ってみましょう

実際に Gatling を使って試験を行ってみたいとき、もっとも参考になるページは公式ページです。簡単な使い方を説明した Quickstart や、応用的な使い方を説明した Advanced Tutorial、利用できる API を網羅した Cheatsheet など、様々なドキュメントが用意されていますので、順番に参照してみるといいでしょう。まだ触ったことのない方は、ぜひ Quickstart からどうぞ!

実際に動かす時には、他人のサービスに対して性能試験を実施しないように気をつけましょう。これらを行うと、サービスの管理者から DoS 攻撃として見なされる可能性があります。

おわりに

今回のアイスタイル勉強会では性能試験について共有しました。こういった試験は定期的に実施することで、「どのタイミングで、どのコードが、どういった状況で」アプリケーションの品質を落としてしまったかを検知することができます。この異常を素早く検知することで、アプリケーションが誤った方向に進んでしまうことを食い止めることができ、継続的に成長させることができていくようになると考えています。試験は準備するのが大変である一方、得られるメリットも非常に大きいものなので、ぜひ積極的に取り入れていきたいです。

PHP Engineer who developed web sites with Phalcon