性能テストについての備忘録。
性能ってなんだ
性能とは、「システムが処理結果を返す力」である。
性能で確認する観点は下記の3つで、それぞれは強く影響しあっている。
性能テストの2つの目的
目的① : 「運用時」に想定ユーザ数の利用に耐えられるか
「運用時」と言う言葉がとても大事である。もし、運用を意識しなくても良いならば、単に想定ユーザの分だけリクエストを投げて耐えられるかどうかを見るだけという単純なテストになる。しかし、それぞれのシステムはそれぞれの特性のもと動作する。なので、性能テストは様々な角度でのテストが必要になる。
例としては下記である。
- 長時間負荷がかかることがあるのか?
- スパイラルは起こり得るのか?
- データは大量に増えることはあるのか?
- リソースはどの程度で運用するのか?
- 他サービスとの兼ね合いはあるのか? Etc…
大事なのは、そのシステムで起こりうる環境的な事象に対して、想定通りに動作することを保証することである。
目的② : 性能限界の把握とその対策法を準備すること
言わずもがなであるが、システムは変容し続ける。API自体が改訂されたり、APIの使われ方が変わったり、リソース量を減らしたり、アクセス数が増えたりと状況は変わり続ける。
この前提に立つと、システムが落ちるという最悪のケースを避けるためにも、限界点を知っておくことは不可欠である。この限界点さえ知っておけば、事前に対策を練っておくことができる。
例えば、あるAPIは「100TPSの負荷がかかると平均レスポンス速度が5秒ほど遅くなり、要件を満たさない。」という限界事実が性能テストによって明らかになったとする。
現状、50TPSしか利用されないとすると、今の対応は必要はないが、将来変容した結果100TPS以上使われる瞬間があるのであれば、リソースの増加をするなど瞬時に対応できる。
負荷テストってなんだ
負荷テスト、性能テスト、パフォーマンステストなどネットには様々な言葉が散乱しているように見受けられる。
結論、明確な定義はないように思える。各書籍、各団体によって定義は微妙に異なる。
ここで重要なのは、チームとしてこのテストが「何を図るためのテストであるか」という点が共有されていることである。とはいえ、簡単にテスト名と内容をマッピングした。
- 負荷テスト
- システムの限界値を見つけること。
- スケーラビリティテスト
- システムの拡張が負荷に沿って可能かどうかを確認すること。
- 耐久性テスト
- 長時間の負荷に対してのパフォーマンスを確認すること。
- 容量テスト(キャパシティテスト)
- 容量に対しての拡張が負荷に沿って可能かどうかを確認すること。
- 応答性テスト(スパイクテスト)
- 負荷の変化に対して、どれだけ反応できるかを確認すること。
- ボリュームテスト
- 大量のデータに対するシステムの応答性を確認すること
上記を見ると、負荷テストは性能テストの一部でしかないことがわかる。
システムの限界値は「システムが処理結果を返す力」に依存していると考えると当たり前である。
ちなみに、性能テストとパフォーマンステストは同意味であると私は認識している。
性能テストで見る観点の具象
性能テストで見る観点で述べた、「量を返す力」「早く返す力」「力の源」はそれぞれ下記にマッピングされる。
それぞれの詳細な説明は割愛するが、簡単な意味は
- スループット:単位時間あたりの処理件数(Transaction Per Secondで表されることが多い)
- 応答時間:リクエストからレスポンスまでの時間 (msで表されることが多い)
- リソース: CPU利用率、ヒープ、DB CPU使用率 etc (%で表されることが多い)
である。
性能テストは、未来を想定しながらテストする必要も考慮すると想像以上に奥深い。経験を通じてもっと学んでいきたい。以上。