Slide 1

Slide 1 text

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

Slide 2

Slide 2 text

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

Slide 3

Slide 3 text

近所にある整体

Slide 4

Slide 4 text

No content

Slide 5

Slide 5 text

ࠓ೔ͷ͓࿩

Slide 6

Slide 6 text

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

Slide 7

Slide 7 text

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

Slide 8

Slide 8 text

No content

Slide 9

Slide 9 text

No content

Slide 10

Slide 10 text

No content

Slide 11

Slide 11 text

ガトリングじゃ何もでなかった

Slide 12

Slide 12 text

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

Slide 13

Slide 13 text

No content

Slide 14

Slide 14 text

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

Slide 15

Slide 15 text

ෛՙςετπʔϧ Gatling

Slide 16

Slide 16 text

No content

Slide 17

Slide 17 text

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

Slide 18

Slide 18 text

Gatling • Scala, Akka, Nettyで作られた • オープンソースの負荷テストツール • ハイパフォーマンス • HTMLの静的レポートが生成できる • ブラウザ操作でテストシナリオがつくれる • Scalaのコードが生成される

Slide 19

Slide 19 text

どんな人におすすめか

Slide 20

Slide 20 text

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

Slide 21

Slide 21 text

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

Slide 22

Slide 22 text

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

Slide 23

Slide 23 text

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

Slide 24

Slide 24 text

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

Slide 25

Slide 25 text

たまには Scala書きたいよね

Slide 26

Slide 26 text

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

Slide 27

Slide 27 text

࢖͍ํͷࡶͳઆ໌

Slide 28

Slide 28 text

シナリオを用意する

Slide 29

Slide 29 text

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

Slide 30

Slide 30 text

レコーダを起動して

Slide 31

Slide 31 text

プロキシを設定して

Slide 32

Slide 32 text

ブラウザで操作する

Slide 33

Slide 33 text

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のコードが生成される

Slide 34

Slide 34 text

Scala書けなくても使える

Slide 35

Slide 35 text

レポートの生成

Slide 36

Slide 36 text

No content

Slide 37

Slide 37 text

ͨͩɺܸͪ؏͘ͷΈ IUUQEJDOJDPWJEFPKQB&"% &"&"&#&#&## &"&#&

Slide 38

Slide 38 text

ガトリング…

Slide 39

Slide 39 text

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

Slide 40

Slide 40 text

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

Slide 41

Slide 41 text

Slide 42

Slide 42 text

No content

Slide 43

Slide 43 text

ΨτϦϯάɾΫϥελʔ

Slide 44

Slide 44 text

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

Slide 45

Slide 45 text

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

Slide 46

Slide 46 text

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

Slide 47

Slide 47 text

$ serf event fire

Slide 48

Slide 48 text

No content

Slide 49

Slide 49 text

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

Slide 50

Slide 50 text

͍Ζ͍Ζܸͪ؏͍͖ͯͨ

Slide 51

Slide 51 text

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

Slide 52

Slide 52 text

ガトる内容 • 2分ぐらい • ガト 1台 • ジョジョにユーザが増えて2万まで • 1ユーザ1秒に一度アクセス • 基本チューニングはしない

Slide 53

Slide 53 text

nodejs

Slide 54

Slide 54 text

nodejs

Slide 55

Slide 55 text

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

Slide 56

Slide 56 text

nodejs

Slide 57

Slide 57 text

nodejs

Slide 58

Slide 58 text

Golang

Slide 59

Slide 59 text

Golang

Slide 60

Slide 60 text

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

Slide 61

Slide 61 text

Golang

Slide 62

Slide 62 text

Golang

Slide 63

Slide 63 text

python(wsgi)

Slide 64

Slide 64 text

python(wsgi)

Slide 65

Slide 65 text

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

Slide 66

Slide 66 text

python(wsgi)

Slide 67

Slide 67 text

python(wsgi)

Slide 68

Slide 68 text

Ruby(puma + rack)

Slide 69

Slide 69 text

Ruby(puma + rack)

Slide 70

Slide 70 text

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

Slide 71

Slide 71 text

Ruby(puma + rack)

Slide 72

Slide 72 text

No content

Slide 73

Slide 73 text

php(apache)

Slide 74

Slide 74 text

php(apache)

Slide 75

Slide 75 text

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

Slide 76

Slide 76 text

php(apache)

Slide 77

Slide 77 text

php(apache)

Slide 78

Slide 78 text

Haskell(wai + warp)

Slide 79

Slide 79 text

Haskell(wai + warp)

Slide 80

Slide 80 text

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

Slide 81

Slide 81 text

Haskell(wai + warp)

Slide 82

Slide 82 text

Haskell(wai + warp)

Slide 83

Slide 83 text

erlang(cowboy)

Slide 84

Slide 84 text

erlang(cowboy)

Slide 85

Slide 85 text

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

Slide 86

Slide 86 text

erlang(cowboy)

Slide 87

Slide 87 text

erlang(cowboy)

Slide 88

Slide 88 text

Scala(akka-http)

Slide 89

Slide 89 text

Scala(akka-http)

Slide 90

Slide 90 text

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

Slide 91

Slide 91 text

Scala(akka-http)

Slide 92

Slide 92 text

Scala(akka-http)

Slide 93

Slide 93 text

FSS  SQT 4DBMB  OPEFT  IBTLFMM  FSMBOH  FSS  SQT (P  1)1  1ZUIPO  3VCZ 

Slide 94

Slide 94 text

·ͱΊ

Slide 95

Slide 95 text

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

Slide 96

Slide 96 text

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

Slide 97

Slide 97 text

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

Slide 98

Slide 98 text

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

Slide 99

Slide 99 text

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

Slide 100

Slide 100 text

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

Slide 101

Slide 101 text

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

Slide 102

Slide 102 text

まだまだ勉強不足

Slide 103

Slide 103 text

こんな時代だからこそ

Slide 104

Slide 104 text

負荷テスト駆動開発 STDD

Slide 105

Slide 105 text

そして

Slide 106

Slide 106 text

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

Slide 107

Slide 107 text

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

Slide 108

Slide 108 text

まとめ • Gatling • サービスにたくさん人が来るの練習をできる • 楽しい。 • nodejs チューニングしてないのにすげえ • (ロジックあったらしらんけど) • アクターわからん。楽しい。 • Stress Test Deriven Development