狠狠撸

狠狠撸Share a Scribd company logo
スローテスト刑事?(デカ) Powered?by?Rabbit?2.1.8
スローテスト刑事
(デカ)
第74回?Ruby関??勉強会
京都??大学?C508
2016-09-11?(Sun)
伊藤?浩??(@koic)
(株)永和システムマネジメント
スローテスト刑事?(デカ) Powered?by?Rabbit?2.1.8
わたし
スローテスト刑事?(デカ) Powered?by?Rabbit?2.1.8
わたし
(株)永和システムマネジメントで
働く会社員。Rubyとかメタルと
か好きです。
https://github.com/koic?
https://twitter.com/koic?
https://koic.hatenablog.com?
スローテスト刑事?(デカ) Powered?by?Rabbit?2.1.8
?
スローテスト刑事?(デカ) Powered?by?Rabbit?2.1.8
御礼
スローテスト刑事?(デカ) Powered?by?Rabbit?2.1.8
?
スローテスト刑事?(デカ) Powered?by?Rabbit?2.1.8
今?の話
Railsアプリケーションのスロ
ーテスト対策について
?
XP?で伝えられる?Testing?と?
Continuous?Integration?への
現実的課題点について考察
?
現場での実践とポイント
オンプレJenkins?
?
スローテスト刑事?(デカ) Powered?by?Rabbit?2.1.8
まとめ
スローテスト刑事?(デカ) Powered?by?Rabbit?2.1.8
Thanks?(デカ部屋)
@1syo?
@onk?
@yattom?
スローテスト刑事?(デカ) Powered?by?Rabbit?2.1.8
フルビル
ド何分で
すか?
スローテスト刑事?(デカ) Powered?by?Rabbit?2.1.8
とあるアンケート
10分以内に抑えるようにして
います
スローテスト刑事?(デカ) Powered?by?Rabbit?2.1.8
10分と
いう目標
スローテスト刑事?(デカ) Powered?by?Rabbit?2.1.8
目標と現
実の差を
知る
スローテスト刑事?(デカ) Powered?by?Rabbit?2.1.8
ある現実
だいたい3,795?examplesほど?
ある時点で?rake?stats?した
Code?LOC:?12796?
Test?LOC:?23518?
Code?to?Test?Ratio:?1:1.8?
?
素朴にテストを書いて実?とか
だと1時間越え
?
スローテスト刑事?(デカ) Powered?by?Rabbit?2.1.8
1時間越え
24つのPull?Requestが出たら
1?の処理量を越える
?
というか翌朝出社しても終わら
ない
?
ないわー?
スローテスト刑事?(デカ) Powered?by?Rabbit?2.1.8
86,400
スローテスト刑事?(デカ) Powered?by?Rabbit?2.1.8
時間の重み
1?は86,400秒?
例えば60秒かかるスローテス
トが30つあると、
?
??に処理できるCIの上限は
48つ以下
チームは??何回のコミットをして
ますか?
?
?
スローテスト刑事?(デカ) Powered?by?Rabbit?2.1.8
?を払いま
すか?労?
を払います
か?
スローテスト刑事?(デカ) Powered?by?Rabbit?2.1.8
最速での事件解決法
札束で殴る?
潤沢な?と権??
お?がんばれ?
スローテスト刑事?(デカ) Powered?by?Rabbit?2.1.8
労?を?で解決する
問題解決の基礎戦略のひとつ?
潤沢な?と権限のあるプロジェ
クトは動きやすい
あまりそういったプロジェクトばか
りでないのが現実
?
今?の話は制約の中でどうしていく
か
?
?
スローテスト刑事?(デカ) Powered?by?Rabbit?2.1.8
スローテスト刑事?(デカ)?の
?常
テストの並列化と個別のチュー
ンナップを頑張る
?
まるで靴底をすり減らした聞き
込みのように地道な作業
デカだからね?
?
スローテスト刑事?(デカ) Powered?by?Rabbit?2.1.8
TL;DR
スローテスト刑事?(デカ) Powered?by?Rabbit?2.1.8
コアでスケー
ルアウトしメ
モリでスケー
ルアップする
スローテスト刑事?(デカ) Powered?by?Rabbit?2.1.8
私のオススメ
倍速レベルで速くなる並列化を
初?にすると良い
投資対効果が?い?
?
DBのデータファイルのメモリ
化でディスクIO削減
RDBMS自体のパフォーマンスが上
がるわけではないので、20%の速度
向上など?定?率で頭打ちはある
?
?
スローテスト刑事?(デカ) Powered?by?Rabbit?2.1.8
Topics
1.?Parallel?
2.?DB?
3.?Tips?
スローテスト刑事?(デカ) Powered?by?Rabbit?2.1.8
1.Parallel
スローテスト刑事?(デカ) Powered?by?Rabbit?2.1.8
Gem?leに以下を書いて
bundle?install?(1/4)
parallel?tests?/?test-queueとい
った並列化ライブラリがある。
?????????????????????????????????????????
ここはparallel?testsを例にする。
スローテスト刑事?(デカ) Powered?by?Rabbit?2.1.8
各種設定を並列対応?(2/4)
データベースを並列分用意して、
con?g/database.ymlを対応する
?????
?????????????????????????????????????????????????????????
RDBMSに並列実?分のスキーマ?
(あるいはDB)?を用意する
?
スローテスト刑事?(デカ) Powered?by?Rabbit?2.1.8
並列分のスキーマ作成?(3/4)
rake?db:migrate?の実?より?
rake?db:schema:load?の?が速い
ので意図がないならオススメ
???????????????????????????
????????????????????????????????????????????????
スローテスト刑事?(デカ) Powered?by?Rabbit?2.1.8
テストの並列実??(4/4)
--su?xでテスト対象を絞り込んで
?てみても良い。
??????????????????????????????????????????
???????????????????????????????????????????????????
スローテスト刑事?(デカ) Powered?by?Rabbit?2.1.8
効果
4コア:?約1時間のテストが約
15分になった。
?
2コア:?約1時間のテストが約
30分になった。
?
スローテスト刑事?(デカ) Powered?by?Rabbit?2.1.8
共有リソースが容疑者
基本的に個別のテストに?を?
れず効果を得られる
?
Isolated?Testの原則からそれ
ぞれが影響しないはず
?
Shared?resourcesに気をつ
ける
逆にいうとだいたいここくらい?
?
スローテスト刑事?(デカ) Powered?by?Rabbit?2.1.8
並列化まとめ
tmm1/test-queue,?grosser/
parallel?testsなどで並列化
?
並列化するためデータベースや
全?検索エンジンなどのリソー
スも並列可能にする
?
コアの数でほぼ頭打ちになるの
でハイスペックのマシンが良い
?
スローテスト刑事?(デカ) Powered?by?Rabbit?2.1.8
効果が?い
ので最初に
やると良い
スローテスト刑事?(デカ) Powered?by?Rabbit?2.1.8
2.?DB
スローテスト刑事?(デカ) Powered?by?Rabbit?2.1.8
データファイルのtmpfs搭載
RDBMSによるが2割減などが
?込めたりするらしい
?
??でDisk?IO減は思いのほか
効いていない
?
というかこの間、Vagrantのパ
ラメータやらtmpfs化と合わせ
てしておくREDOログの設定し
くっててMac?MiniのCI死んだ
?
スローテスト刑事?(デカ) Powered?by?Rabbit?2.1.8
Vagrantメモリ割当の変
問題.?この設定で?vagrant?reload?
してテストを流しました?(配点2点)
??????????????????????????????????????
????????????????????????????????????????????????????????
???????????????????????????????????????????????????????????????
??????????????????????????????????????????????????????
??????????????????????????????????????????????????????
???
スローテスト刑事?(デカ) Powered?by?Rabbit?2.1.8
まだ?傷が
癒えていな
いので割愛
スローテスト刑事?(デカ) Powered?by?Rabbit?2.1.8
データベースのクリーニング
を整理する
スローテストの原因は、だいた
いデータベースがネック
CI?実?もアプリケーションでの実
?もボトルネックは同じ
?
?
amatsuda/
database?rewinderというプ
ロダクトもあるが、ここでは
DatabaseCleanerのお話
?
スローテスト刑事?(デカ) Powered?by?Rabbit?2.1.8
DatabaseCleaner.strategy
スローテスト刑事?(デカ) Powered?by?Rabbit?2.1.8
spec?helper.rb
あるいはrails?helper.rbに以下が
あれば?速化の狙い目。
?????????????????????????????????
??????????????????????????????????
?????????????????????????????????????????????????????????????
??????
???????????????????????????????????????????
?????
???
スローテスト刑事?(デカ) Powered?by?Rabbit?2.1.8
DatabaseCleaner.strate
gyはできるだけ
transactionに任せる
データベースのデータ挿?と取得
で異なるスレッドが現れる
JavaScriptのテスト以外は
truncationではなく、同?スレッ
ドで扱えるtransactionにする。
スローテスト刑事?(デカ) Powered?by?Rabbit?2.1.8
容疑者探し
example.metadata?が?掛かり。
???????????????????????????
???????????????????????????????????
???????
容疑者の絞り込みまで出来るとあ
とはやるだけなので割りと楽。
スローテスト刑事?(デカ) Powered?by?Rabbit?2.1.8
やること
@javascriptを必要な場所に移す
????????????
??????????????
?????????????????????????????
?????????
??????????????
??????????????????????????
?????????
?????????????????????????????
?????????
スローテスト刑事?(デカ) Powered?by?Rabbit?2.1.8
効果?1?BEFORE
???????????????????????????????????????????????????????????
???????????????????????
スローテスト刑事?(デカ) Powered?by?Rabbit?2.1.8
効果?1?AFTER
???????????????????????????????????????????????????????????
???????????????????????
スローテスト刑事?(デカ) Powered?by?Rabbit?2.1.8
効果?2?BEFORE
???????????????????????????????????????????????????????????
??????????????????????
スローテスト刑事?(デカ) Powered?by?Rabbit?2.1.8
効果?2?AFTER
??????????????????????????????????????????????????????????
??????????????????????
スローテスト刑事?(デカ) Powered?by?Rabbit?2.1.8
効果?3?BEFORE
???????????????????????????????????????????????????????????
???????????????????????
スローテスト刑事?(デカ) Powered?by?Rabbit?2.1.8
効果?3?AFTER
???????????????????????????????????????????????????????????
???????????????????????
スローテスト刑事?(デカ) Powered?by?Rabbit?2.1.8
効果?4?BEFORE
???????????????????????????????????????????????????????????
??????????????????????
スローテスト刑事?(デカ) Powered?by?Rabbit?2.1.8
効果?4?AFTER
??????????????????????????????????????????????????????????
??????????????????????
スローテスト刑事?(デカ) Powered?by?Rabbit?2.1.8
全体効果
約40分のテストが35分になっ
た。
9%ほど削減?
?
スローテスト刑事?(デカ) Powered?by?Rabbit?2.1.8
あとは地道に細かいチューニ
ング
投資対効果が?いテストからチ
ューニングしていく
?
スローテスト刑事?(デカ) Powered?by?Rabbit?2.1.8
3.Tips
スローテスト刑事?(デカ) Powered?by?Rabbit?2.1.8
プロファイリング
推測するな、計測せよ?(--pro?le)
????????????????????????????????
??????
??????????????????????????????
?????
??????????????????????????????????????????????????????????????????????????????????????????
?????
??????????????????????????????????????????????????????????????????????????????????????????
?????
??????????????????????????????????????????????????????????????????????????????????????????
????
オリコンチャート的な。
スローテスト刑事?(デカ) Powered?by?Rabbit?2.1.8
sleepを取り締まる
grep?sleep?.?|?wc?-l?で?つか
った件数以上の待ち時間が発?
スローの原因場所は?つけやすい?
?
JavaScriptの関わるE2Eテス
トでの遭遇率?い
?
1秒もsleepするならDBに状態
を問い合わせた?が速い
?
スローテスト刑事?(デカ) Powered?by?Rabbit?2.1.8
DRY
テストの重複を消す?
コピペによる迷宮?り?
コードを書いた時点でないと?
つけることが現実的には困難?
Code?Climate的な静的解析で?掛
かりを?つけたりできる?
?
知?を知りたい?
?
スローテスト刑事?(デカ) Powered?by?Rabbit?2.1.8
断捨離
使われていないテスト?(と呼び
出される不要な)?コードを捨て
る
?
?し算より引き算の?が難しい?
コードを捨てることができて?
?前
?
スローテスト刑事?(デカ) Powered?by?Rabbit?2.1.8
最適化
before(:all),?before(:each),?
aggregate?failures?あたりの
最適化
?
毎回の初期化が必要かどうかは
?考の余地有り
?
最近は?1?example(it,specify)?
で?1?テストケースよりも速度
重視に思考が変わってきた
?
スローテスト刑事?(デカ) Powered?by?Rabbit?2.1.8
できるだけインメモリ
不要な?AR?オブジェクト作ら
ない?(factory?で関連作らず?
nil?にしておく)
?
DB?にアクセスさせない?
(FactoryGirl.create?->?build)
?
スローテスト刑事?(デカ) Powered?by?Rabbit?2.1.8
system?呼び出さない
他のテストで担保している遅い
外部コマンド?(ImageMagick)?
をスタブ化するなど
?
スローテスト刑事?(デカ) Powered?by?Rabbit?2.1.8
無駄な処理
サムネイル作らない?
スローテスト刑事?(デカ) Powered?by?Rabbit?2.1.8
付録
スローテスト刑事?(デカ) Powered?by?Rabbit?2.1.8
対象絞り込み
変更と関係のあるテストだけ実
?するという選択肢
?
タグ(rspec?--tag)で対象のテ
ストを絞る
ただし全テストを?たいCIの前段ま
で
?
?
スローテスト刑事?(デカ) Powered?by?Rabbit?2.1.8
ci?skip
rails/railsはじめ常套?段?
コメント修正といったレビュー
をパスすれば良いだけのものは
テストしない
CI?の設定?
?
ci?skip?/?CI?SKIP?/?skip?ci?/?
SKIP?CI?いずれでも受?れるよ
うにしておくと良い
?
スローテスト刑事?(デカ) Powered?by?Rabbit?2.1.8
To?be?continued...
スローテスト刑事?(デカ)?の捜
査は続く
?
スローテスト刑事?(デカ) Powered?by?Rabbit?2.1.8
?
スローテスト刑事?(デカ) Powered?by?Rabbit?2.1.8
Dying?Message
札束で殴る?
潤沢な?と権??
お?がんばれ?

More Related Content

スローテスト刑事 (デカ)