====== 負荷テスト ====== ===== 負荷テストの目的の明確化 ===== * 各種設定に問題がないか確認する\\ 基本的な動作が問題ないこと、明らかにおかしなスループットなどが計測されないこと、を確認する。 * OSの設定 * httpサービスなど、ミドルウェアの基本設定 * DBのスロークエリ、インデックスなどの設定 * etc * 現在の構成でのスループットの上限を探る\\ 本番を想定したある程度の構築を行った段階で負荷テストを行い、「ここまでは大丈夫」という値を探す。 * スケールアップ(スペックアップ)、スケールアウト(サーバ台数増加)対応 いざ負荷が高くなったときにスケールアップ(スペックアップ)、スケールアウト(サーバ台数増加)で負荷軽減が可能か(負荷が移動するか)を確認する。 ===== 負荷試験 ===== * 静的ページへアクセスした際のスループットを取得 一般的に数千のスループットが出るはずなので、出ない場合は設定を見直す。 ab -c XXX -n XXX http://localhost/ * フレームワークを利用したシンプルなページ(Hello World的なもの)へアクセスした際のスループットを取得 この数値がフレームワーク使用時の最大スループットとなる。 ab -c XXX -n XXX http://localhost/hello/ ※注意 以下、認証処理などをパスする仕組みがソースに必要。 想定するユーザ数のダミーユーザ情報があることが望ましい。 複数ユーザのアクセスを確認するために、jMeterなどのツールでuseridを変数にしてシナリオ実行。 * ユーザアクセスの多いページへアクセスした際のスループットを取得する e.g. マイページ ab -c XXX -n XXX http://localhost/mypage/userid=XXXXX * (主に参照系の)DBアクセスの多いページへアクセスした際のスループットを取得する e.g. デッキ作成(カード一覧)、クエスト一覧 ab -c XXX -n XXX http://localhost/mydeck/userid=XXXXX * (主に更新系の)DBアクセスの多いページへアクセスした際のスループットを取得する e.g. ゲームリザルト ab -c XXX -n XXX http://localhost/resultk/userid=XXXXX 3~5にて。スループットの極端な低下、スロークエリ、インデックスの使われていないクエリ、LoadAverageの高騰などを確認する。 スロークエリ、インデックスの使われていないクエリ # vi /etc/my.cnf [mysqld] ~省略~ ※以下追記 log_slow_queries long_query_time = 1 slow_query_log_file=mysql-slow.log log-queries-not-using-indexes LoadAverageの高騰 topコマンド、sarコマンドなどで確認 スケールアップ(スペックアップ)、スケールアウト(サーバ台数増加)で負荷軽減が可能か(負荷が移動するか)を確認する。 ===== 関連しそうなカーネル設定のメモ ===== * irqbalance # yum -y install irqbalance # service irqbalance start # chkconfig irqbalance on * RPS/RFS echo "f" > /sys/class/net/eth0/queues/rx-0/rps_cpus echo 4096 > /sys/class/net/eth0/queues/rx-0/rps_flow_cnt echo 32768 > /proc/sys/net/core/rps_sock_flow_entries * sysctl vm.swappiness=0 net.core.somaxconn=4096 net.core.netdev_max_backlog=4096 net.ipv4.tcp_max_syn_backlog=4096 ===== 負荷をかける側に必要な設定 ===== # vi /etc/sysctl.conf net.ipv4.ip_local_port_range = 32768 65000 net.ipv4.tcp_tw_reuse = 1 net.ipv4.tcp_tw_recycle = 0 net.ipv4.tcp_fin_timeout = 10 # sysctl -p ===== 負荷テストの指標のひとつ ===== 旧来のカードバトル型のソーシャルゲームでは1ユーザ、1日あたり350~750PV > エンジニアカフェ× ドリコム技術勉強会 ~月間50億PVのソーシャルゲームを支える技術 > http://yamasaki0.hatenablog.com/entry/2012/02/16/230000 アプリ型の場合、サーバーアクセスの無い画面/処理もあるので、少し少ない数値を指針にする。 > スループット(1秒間に捌く数) > PV x DAU / 24h / 60min / 60sec e.g. ・10万DAU ・500PV/Day/User ⇒ 500 * 100,000 / 24 / 60 / 60 ≒ 578.7 req / sec ピーク時の平均を仮に1.5倍とすると ⇒ 578.7 * 1.5 ≒ 868 req / sec サーバ全体で 868 req / sec 捌かなければならない。 1台あたり 100req/sec 捌けるとすると、9台必要。