目次

負荷テスト

負荷テストの目的の明確化

いざ負荷が高くなったときにスケールアップ(スペックアップ)、スケールアウト(サーバ台数増加)で負荷軽減が可能か(負荷が移動するか)を確認する。

負荷試験

一般的に数千のスループットが出るはずなので、出ない場合は設定を見直す。

ab -c XXX -n XXX http://localhost/

この数値がフレームワーク使用時の最大スループットとなる。

ab -c XXX -n XXX http://localhost/hello/

※注意
以下、認証処理などをパスする仕組みがソースに必要。
想定するユーザ数のダミーユーザ情報があることが望ましい。
複数ユーザのアクセスを確認するために、jMeterなどのツールでuseridを変数にしてシナリオ実行。

e.g. マイページ

ab -c XXX -n XXX http://localhost/mypage/userid=XXXXX

e.g. デッキ作成(カード一覧)、クエスト一覧

ab -c XXX -n XXX http://localhost/mydeck/userid=XXXXX

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コマンドなどで確認

スケールアップ(スペックアップ)、スケールアウト(サーバ台数増加)で負荷軽減が可能か(負荷が移動するか)を確認する。

関連しそうなカーネル設定のメモ

# yum -y install irqbalance
# service irqbalance start
# chkconfig irqbalance on
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
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台必要。