Locust負荷テスト
2025年01月20日
愚かなことにAWS -> OCI移行の利点はコストだけでなく,性能も大きく改善されると話しておきながら,実際にテストは進めていなかったのですが,面接が終わってからそのことを思い出し,Locustを利用して負荷テストをしてみました。
Locustとは? Pythonベースのオープンソースの負荷テストツールで,Pythonコードでスクリプトを作成するのにとても便利です。
使い方はとても簡単ですが,私のような場合はpoetryを使うために
poetry add locust
でlocustをインストールした後,適当なパスにlocustfile.pyを作成すればよいです。
私がテストに使ったスクリプトは下記のようになります。
from locust import HttpUser, task, between, TaskSet
import random
class UserBehavior(TaskSet):
def on_start(self):
self.min_post_id = 56
self.max_post_id = 59
self.categories = ["기술", "일상", "리뷰"]
@task(5)
def home(self):
self.client.get('/')
@task(3)
def get_post_detail(self):
post_id = random.randint(self.min_post_id, self.max_post_id)
self.client.get(f'/post/{post_id}')
@task(2)
def view_category(self):
category = random.choice(self.categories)
self.client.get(f'/?category={category}')
@task(2)
def search_posts(self):
search_terms = ["파이썬", "테스트", "개발"]
term = random.choice(search_terms)
self.client.get(f'/?search={term}')
@task(1)
def view_about(self):
self.client.get('/about')
class LocustUser(HttpUser):
host = "https://locust.load-test.com"
tasks = [UserBehavior]
wait_time = between(3, 7)
def on_start(self):
pass

そして次のような設定画面で目標同時接続者数,1秒間に生成する新しいユーザー数,ホストを設定すればいいのですが,最初は最大同時接続者を100人,1秒間に生成されるユーザーを10人で15分くらいテストしてみました。

平均応答時間 : メインページ: 81ms, 投稿詳細: 62-72ms, 全体平均: 77ms
エラー率 : 0% (完璧な安定性)
スループット : 毎秒14.01リクエストを処理,合計12,935リクエストを成功的に処理
中央値(Median) : ほとんどが64msで非常に良好
と,かなり悪くない性能が出ました。
次に,ピーク負荷をテストするために,同接続者を500人,毎秒生成されるユーザーを50人でテストしたところ,次のような結果が出ました。

全体的なパフォーマンス:
総リクエスト数:24,238件
平均応答時間:4.6秒(4,589ms),99パーセントのタイルで応答時間が急激に増加(18秒),最大応答時間が59秒と非常に高い。
RPS(リクエスト/秒):47.85
失敗率:1.04% (252件),すべての失敗はReadTimeoutエラー。
10分くらいでTimeoutを出しながら爆発し始め,爆発する前にも4.6秒という驚異的なレスポンスを見せました。
だから,キャッシュソリューションを導入したり,静的ファイルをファイル化したり,クエリの最適化をしなければならないと思いましたが,よく考えてみると,個人技術ブログ,それもジュニアのブログに500人ものアクセスが集まることがあるのか?と思ったので,今はもっと急いでいる部分を処理して,後で改善することにしました。
しかし,本当に残念なのはAWSのT2.Microでの性能テスト結果がないので客観的な比較ができないという点ですが,単純スペックで見ると,現在使っているA1.Flexと6~8倍くらいの性能差があるので,おそらく接続者が20~30人くらいになってもresponseが1秒を超えなかったのではないかと思います。
カカオ
グーグル
ネイバー