スローテスト刑事�(デカ) 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
Gemfileに以下を書いて
bundle�install�(1/4)
parallel̲tests�/�test-queueとい
った並列化ライブラリがある。
�����������������������������������������
ここはparallel̲testsを例にする。
スローテスト刑事�(デカ) Powered�by�Rabbit�2.1.8
各種設定を並列対応�(2/4)
データベースを並列分用意して、
config/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)
--suffixでテスト対象を絞り込んで
⾒てみても良い。
������������������������������������������
���������������������������������������������������
スローテスト刑事�(デカ) 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
プロファイリング
推測するな、計測せよ�(--profile)
��������������������������������
������
������������������������������
�����
������������������������������������������������������������������������������������������
�����
������������������������������������������������������������������������������������������
�����
������������������������������������������������������������������������������������������
����
オリコンチャート的な。
スローテスト刑事�(デカ) 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
札束で殴る✓
潤沢な⾦と権⼒✓
お⾦がんばれ✓

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