ガトリングを撃ちまくりたいお年頃

 ガトリングを撃ちまくりたいお年頃

1a679952cdf455ecd6a15cbde7ae80d5?s=128

Tomohiko Himura

December 17, 2016
Tweet

Transcript

  1. ΨτϦϯάΛ ܸͪ·͘Γ͍͓ͨ೥ࠒ 2016-12-17 ߹ಉษڧձ in େ౎ձԬࢁ -2016 Winter-

  2. ͻΉΒ ͱ΋ͻ͜ ޿ౡ͔Βདྷͨ ΞϓϦέʔγϣϯνϣοτπΫϨϧ github eiel twitter eielh

  3. 近所にある整体

  4. None
  5. ࠓ೔ͷ͓࿩

  6. 注意事項
 
 あんまり実用的ではない例が ちらほらありますがご了承ください。

  7. 最近ガトリングを 撃ち続けています

  8. None
  9. None
  10. None
  11. ガトリングじゃ何もでなかった

  12. というわけで作ってみました

  13. None
  14. アジェンダ • 負荷テストツール Gatling • 「ただ、撃ち貫くのみ」 • いろいろ撃ち貫いてきた • まとめ

  15. ෛՙςετπʔϧ Gatling

  16. None
  17. 大人数で同時にブラウザを 操作しているかのようにできるツール

  18. Gatling • Scala, Akka, Nettyで作られた • オープンソースの負荷テストツール • ハイパフォーマンス •

    HTMLの静的レポートが生成できる • ブラウザ操作でテストシナリオがつくれる • Scalaのコードが生成される
  19. どんな人におすすめか

  20. ウェブアプリケーションが 作れるようになってきた

  21. お客さんに価値を届けられる

  22. そのアプリケーション アクセスがたくさんきても 本当に大丈夫ですか?

  23. 負荷がかかったときの 状態を確認するツール

  24. RubyとかPHPとか書いてるけど

  25. たまには Scala書きたいよね

  26. ScalaTestとも統合されてて 機能テストツール的にも使えそう

  27. ࢖͍ํͷࡶͳઆ໌

  28. シナリオを用意する

  29. Scalaで
 直接書くこともできますが

  30. レコーダを起動して

  31. プロキシを設定して

  32. ブラウザで操作する

  33. package computerdatabase.advanced import io.gatling.core.Predef._ import io.gatling.http.Predef._ import scala.concurrent.duration._ import java.util.concurrent.ThreadLocalRandom

    class AdvancedSimulationStep05 extends Simulation { object Search { val feeder = csv("search.csv").random val search = exec(http("Home") .get("/")) .pause(1) .feed(feeder) .exec(http("Search") .get("/computers?f=${searchCriterion}") .check(css("a:contains('${searchComputerName}')", "href").sav .pause(1) .exec(http("Select") .get("${computerURL}") Scalaのコードが生成される
  34. Scala書けなくても使える

  35. レポートの生成

  36. None
  37. ͨͩɺܸͪ؏͘ͷΈ IUUQEJDOJDPWJEFPKQB&"% &"&"&#&#&## &"&#&

  38. ガトリング…

  39. いっぱい並べて 撃ってみたいじゃないですか

  40. ガトリング並べて リアルタイムモニタリング してみました

  41. <DEMO>

  42. None
  43. ΨτϦϯάɾΫϥελʔ

  44. SERFで がとりんぐ☆くらすたーを構築

  45. ΨτϦϯάɾΫϥελʔͰ OPEFTKTΞϓϦέʔγϣϯΛܸͪൈ͘

  46. ࣌ܥྻ%#ʹ৘ใΛूΊ ϦΞϧλΠϜʹՄࢹԽ

  47. $ serf event fire

  48. None
  49. 正直な話 Gatling 一台で充分な負荷を かけることができます。 撃たれる側を強化すべきでした。

  50. ͍Ζ͍Ζܸͪ؏͍͖ͯͨ

  51. たぶん wrk でやるのがいい と思いますが、 いろいろガトってみました。

  52. ガトる内容 • 2分ぐらい • ガト 1台 • ジョジョにユーザが増えて2万まで • 1ユーザ1秒に一度アクセス

    • 基本チューニングはしない
  53. nodejs

  54. nodejs

  55. 圧倒的安定性 エラー率 0% スループット 2981rps レスンポンスタイム 平均 2.216s nodejs

  56. nodejs

  57. nodejs

  58. Golang

  59. Golang

  60. 途中でファイルディスクプタ不足に エラー率 45% スループット 1776rps レスンポンスタイム 平均 0.011s Golang

  61. Golang

  62. Golang

  63. python(wsgi)

  64. python(wsgi)

  65. python(wsgi) 比較的安定した感じ エラー率 45% スループット 650rps レスンポンスタイム 平均 0.8s

  66. python(wsgi)

  67. python(wsgi)

  68. Ruby(puma + rack)

  69. Ruby(puma + rack)

  70. 秒間80しか捌けてない エラー率 91% スループット 889rps レスンポンスタイム 平均 0.968s Ruby(puma +

    rack)
  71. Ruby(puma + rack)

  72. None
  73. php(apache)

  74. php(apache)

  75. apache壁が効いてる エラー率 53% スループット 1174rps レスンポンスタイム 平均 0.043s php(apache)

  76. php(apache)

  77. php(apache)

  78. Haskell(wai + warp)

  79. Haskell(wai + warp)

  80. Goと同じ傾向 エラー率 45% スループット 1781rps レスンポンスタイム 平均 0.011s Haskell(wai +

    warp)
  81. Haskell(wai + warp)

  82. Haskell(wai + warp)

  83. erlang(cowboy)

  84. erlang(cowboy)

  85. erlang(cowboy) Goと似た傾向だけど少し違う エラー率 40% スループット 1752rps レスンポンスタイム 平均 0.114s

  86. erlang(cowboy)

  87. erlang(cowboy)

  88. Scala(akka-http)

  89. Scala(akka-http)

  90. Scala(akka-http) nodejsを超える性能 エラー率 0% スループット 3342rps レスンポンスタイム 平均 1.871s

  91. Scala(akka-http)

  92. Scala(akka-http)

  93. FSS  SQT 4DBMB  OPEFT  IBTLFMM  FSMBOH

     FSS  SQT (P  1)1  1ZUIPO  3VCZ 
  94. ·ͱΊ

  95. 負荷テストツール Gatlingを紹介しました

  96. 複数のGatlingで 強い負荷をかけるデモをしました

  97. いろんなものを 撃ち抜いてみました

  98. 負荷をかけると いろんな問題にぶつかります

  99. アジャイルは価値を届けろというが

  100. ユーザは いつも動いていて 反応が素早いシステムを求めてきやがる

  101. 価値あるサービスを リアクティブに構築するには

  102. まだまだ勉強不足

  103. こんな時代だからこそ

  104. 負荷テスト駆動開発 STDD

  105. そして

  106. アクターシステム ノンブロッキングIO

  107. などの理解を深めないと いけないなと思いました

  108. まとめ • Gatling • サービスにたくさん人が来るの練習をできる • 楽しい。 • nodejs チューニングしてないのにすげえ

    • (ロジックあったらしらんけど) • アクターわからん。楽しい。 • Stress Test Deriven Development