🏎

性能試験の基本についてざっくり理解する

2021/12/26に公開

モチベ

業務で他の人がロードテストやっているけど、その結果をどう理解するのかが曖昧なので、基本的な考え方からおさえたい。

性能とは

性能って具体的になんなのか?
どれだけのアクセスを処理できるかとか、ページの表示が速いとか、大量のデータをバッチ処理できるとかふわっとしたイメージはある。なんなら基本情報とかでやった気もするが、改めて確認しておく。

もっと種類があるかと思ったけど、調べてみると大別すれば3種類しかないらしい。

  • 単位時間内にどれだけ量をさばけるか?
  • 単位時間内にどれだけ速くさばけるか?
  • 単位時間内にどれだけリソースを使っているか?

「どれだけ量をさばけるか」は、例えば大量のユーザーアクセスをどのくらい処理できるかだったり、バッチ処理で何件処理できるかのイメージ。
「どれだけ速くさばけるか」は、ページにアクセスして何秒くらいで表示されるか、というイメージ。
「どれだけリソースを使っているか」は、CPUやメモリの使用率とか。これは馴染みがある。

また「単位時間内に」というのが重要で、たとえば「1億件処理できます!(年間で)」と「1億件処理できます(秒間で)」とでは意味がまったく違う。
何件処理できるかだけでは性能要件としては不十分で、「秒間で何件」といったように単位時間とセットで初めて性能要件として意味がある。

このへんの話はこちらが詳しく分かりやすかった。
https://codezine.jp/article/detail/9614

これらをちゃんとした用語にすると以下になる。(よく使われる単位も一緒に併記)

  • 単位時間内にどれだけ量をさばけるか?
    • スループット
      • tps(transaction per second), PV/s(Page View per Second), qps(query per second)
  • 単位時間内にどれだけ速くさばけるか?
    • レスポンスタイム
      • 平均値、90%ile(90 percentle)
  • 単位時間内にどれだけリソースを使っているか
    • リソース使用率
      • %

性能試験の目的

ここまでで、性能試験はスループット、レスポンスタイム、リソース使用率を指標に用いてシステムの処理能力についてテストするものだと理解できた。

では、なぜ処理能力をテストするのか。これは大きく2つの目的があるようだ。

  1. 性能目標(非機能要件)を達成できているか?
  2. 性能限界の把握

要するに、性能の限界値を境界にして

  • あらかじめ想定した性能を出せるか?
  • 想定を超えた負荷がかかった場合にどんな動きをするのか?

を確認するのが性能試験の主な目的のようだ。

Image from Gyazo

当然、2の確認で対策が必要なものがあれば、その対応も必要になる。

それを決めるものはなにか?
基本情報で出そうな内容だけど、以下の要素によって決まる。

  • CPU
  • メモリ
  • ディスク
  • ネットワーク

これらをまとめて「リソース」と呼ぶ。要はパワー(物理)。

どうやってやるか?

システムの性能を測る要素と、性能試験の目的はなんとなくわかった。では、具体的に性能試験をどう行うのかを調べてみた。が、思ったよりも奥が深かったのでまたあとでまとめる。

性能試験の実施方法については、ざっと調べたかんじ以下の記事がよさげだった。
https://qiita.com/s9910553/items/ca3dae561489844da646
https://ptune.jp/tech/how-to-recommend-a-load-test/

ツール

実際に負荷をかけるために使われるツール。
なお、こちらの記事でテストツールのレビューが簡潔にまとまっているのでツールの選定からやる必要がある人には参考になりそう。
https://pr.hedgehog-loader.io/blog/3r5ta4m94hnb46nssjjqnw

上記の記事を読むと、規模にもよるが今ならk6を選んでおけば間違いなさそうだった。他によく使われるものとしては以下がある

  • k6
  • Apache Bench
  • Apache JMeter
  • Locust

最後に

とりあえずの目標として、ロードテスト結果を確認するときのポイントはわかった。

  • 性能目標の値をクリアしているか?
  • クリアできていない場合、ボトルネックはどこか?

ボトルネックの解消はこれまでもやったことあるので、SQLの改善とかになるイメージかな。
タイトルどおり、本当にざっくり理解なので必要に応じて追加で深堀りしたい。

参考

https://gihyo.jp/dev/serial/01/tech_station/0008
https://codezine.jp/article/detail/9614
https://pr.hedgehog-loader.io/blog/3r5ta4m94hnb46nssjjqnw
https://e-words.jp/w/性能テスト.html

Discussion