負荷対策しておもったことまとめ
~JMeterでSocket.IOもいけるでよ~
 
Ito Eichi
アジェンダ
 
負荷対策ってなに	
どんないいことがあるん?	
JMeterって?

テストシナリオファイルって?	
わりと陥りやすい罠	
やっとくと楽になるポイント	
実施するまえに	
	
Socket.IOをJMeterで負荷試験してみる	
Node.jsで負荷かけるスクリプト書いてもいいけど…	
JMeter - WebSocket Sampler	
	
おもったこと	
謝辞と参考文献
負荷試験てなに?
 
早い話ユーザがアクセスしてきた体で、	
アクセスを大量にさせてチューニングしていく作業です。
おもにJMeterというツールを使っています。
負荷かける	
 測定	
 めでたし2	
チューニング	
耐え
られ
る?	
Yes!	
No…
負荷試験するとどんないいことがあるん?
 
•  リリース後に負荷でサーバが落ちづらくなる

	
•  チューニングが運用後に比べて比較的やりやすい	
 リリース前にくらべて仕様変更もふくめ互換性が取れない変更もできる
JMeterって?
 •  一言でいうとサーバに負荷をかけるツール

	
•  複数のクライアントのリクエストをエミュレーション	
•  変数やループ、IFなどの細やかな制御ができる
テストシナリオファイルって?
 
•  JMeterがどんなリクエストを発生させるかを

指定するファイル	
•  XMLで書かれている	
•  通常JMeterに読み込ませて編集、実行する	
•  日本語版JMeterだと「テスト計画」という呼び名
わりと陥りやすい負荷試験の罠
•  データ数は必要な目標DAU想定分以上いれる

デバッグコマンドあると楽

レコード数さえあればOKなばあいは、

シナリオで使うデータ以外は自己結合でレコード水増し

(例)実行するたびにレコードを倍にするSQL

insert into `tbl` (col1,col2) select col1,col2 from `tbl`;

	
• 外部のAPI使っている箇所は切ろうね

課金とかフレンドとかGoogle Analyticsみたいな効果測定系

あとリリース後の監視は手厚く

…切らずにやると接続先が激おこ。
やっとくと楽になるポイント
 
• 「CSV Data Set Config」を使う

ユーザIDみたいな可変項目をCSVに外だししておくと楽

	
• HTTP プロキシサーバを使う

リクエストを自動的に収集してシナリオにしてくれて楽

簡単なシナリオならこれでほぼそのままつかえる

	
• 実装しながらJMeterシナリオを作る

簡易ユニットテスト的な使い方で動作チェックにも使えて楽
社内や開発チームと	
負荷試験の必要性や	
どこまで確認できればOKかを	
認識合わせしましょう	
 
実施するまえに
ところで…
Socket.IOの負荷試験したいなあ 
最近わりと使われてる
よし負荷テストかける
クライアントスクリプトも
Node.jsで書くお! 
できた!
 
…けどね
…けどね
 
パフォーマンスでないってときに、
サーバとクライアントどっちに
原因があるかわからないとき
毎回切り分けしてるとつらいー
測定条件はまだしも、サーバの仕様がかわったり
別のAPIの測定するとき、
クライアントのスクリプト作り直さないと…orz
JMeterみたいにテストシナリオ
簡単に変更できないかなあ… 
あった!
JMeter - WebSocket Sampler
https://github.com/maciejzaleski/JMeter-WebSocketSampler
インストールとか
 
JMeter準備
http://jmeter.apache.org
からダウンロードして好きなところに解凍
WebSoketSampler入手
 
https://github.com/maciejzaleski/JMeter-WebSocketSampler/releases
からダウンロード
Jettyもいれる(1)
 
WebSocketSamplerが依存しているので
http://download.eclipse.org/jetty/
から最新のstableをDLして解凍
Jettyもいれる(2)
 
めんどくさいのでひとまずJetty丸ごと入れる
解凍してできたディレクトリの
lib/jetty*.jar
lib/websocket/*.jar
をJmeterを解凍したディレクトリの
/lib/ext
にコピー
サンプラーの中に
「WebSocket Sampler」の
項目が追加されたー!
 
Socket.IOの場合の	
テストシナリオの流れ
Hand Shake 要求	
tokenを発行	
tokenをつけてWebSocket開始要求	
Switching Protocols	
emit	
emit	
	
heart beat 要求	
heart beat送信	
disconnect	
	
JMeter	
 サーバ
シナリオこんな感じになります
テストシナリオ実行中の動画
おもったこと
(読み飛ばし可)
•  JMeterを起動するときMac版はjmeter.shの設定の関係で

プラグインがよみこまれなかった	
•  WebSocketのハートビートは自分でやらないと

タイムアウトでしばらくすると接続きれちゃう	
•  一回ブラウザ上でsocket.io-clientをつかって実装して、

Chromeとかのデバッグウィンドウ通信を眺めてみると感覚がつかみやすいかも	
•  それでも不明なところはsocket.io-clientの

ソースを読んでみるのもアリ(ちょっとしんどかった)	
•  JMeterのクラスター構成でもうごいたー	
•  コマンドラインでもうごいたー	
•  ログの形式は独自なので今後コンバータか何かつくりたい	
	
つまり正直しんどかったお…
謝辞と参考文献	
 	
  
nkns165さんのこちらのページを参考に
させていただきました。	
  
JMeterでWebSocketのパフォーマンステスト	
  
http://qiita.com/nkns165/items/8cd82bf8b93826dfdca2	
  
 	
  
ご清聴ありがとうございました。

負荷対策しておもったことまとめ~JMeterでSocket.IOもいけるでよ~

Editor's Notes

  • #2 濱田さんからご紹介に預かりました Cygamesで負荷対策をしている伊藤です。
  • #3 負荷対策の基本的なところから 最近ちょっとおもしろいJmeterのつかいかた Socket.IOがなんとかって書いてあるところですね こちらのお話を致したいと思います。 よろしくおねがいします。
  • #4 リリース前に本番に想定されるアクセス数に応じた リクエスト(負荷)をかけて、 そのゲームサーバがアクセスに耐えられるかどうか確かめ、 チューニングしていく作業。 早い話ユーザがアクセスしてきた体で、 アクセスを大量にさせて調子をみるというかんじ。
  • #8 おもにデータ投入と外部のAPIを使ってる箇所やっちゃいやすいですね。
  • #9 他にもいろいろあるんですが、すぐできそうなところだと CSV Data Set Configと HTTPプロキシサーバっていうのはJmeterのきのうですね
  • #10 とまあいろいろ一筋縄でいかないことがあるかとはおもいますので、 実施する前にゴールを認識合わせしておくとスムーズです。 あと、慣れてくるとちょっと楽しくなってきます。
  • #11 ところで…最近負荷対策をしてて面白いとおもったことを紹介したいです。
  • #14 けどね…
  • #22 本当はgithubの
  • #24 hand shake 通常のHTTPリクエストで connectとそのレスポンスからtoken取得 コネクションを維持する際、Connection idにも注意 tokenをつけてemit tokenをつけてheartbeat disconnect
  • #27 いろいろこまかいところあるんですがながいので… 正直しんどかったっす でもいろいろSocket.IOの理解が深まって勉強になりました。