樽家昌也 (日本Rubyの会)
Upcoming SlideShare
Loading in...5
×
 

Like this? Share it with your network

Share

樽家昌也 (日本Rubyの会)

on

  • 1,832 views

「分散unit/test」

「分散unit/test」

Statistics

Views

Total Views
1,832
Views on SlideShare
1,830
Embed Views
2

Actions

Likes
0
Downloads
7
Comments
0

1 Embed 2

http://www.slideshare.net 2

Accessibility

Categories

Upload Details

Uploaded via as Adobe PDF

Usage Rights

© All Rights Reserved

Report content

Flagged as inappropriate Flag as inappropriate
Flag as inappropriate

Select your reason for flagging this presentation as inappropriate.

Cancel
  • Full Name Full Name Comment goes here.
    Are you sure you want to
    Your message goes here
    Processing…
Post Comment
Edit your comment

樽家昌也 (日本Rubyの会) Presentation Transcript

  • 1. 分散test/unit が出来るといいな 樽家 昌也 (日本Rubyの会)
  • 2. リグレッションテストの憂鬱 終盤になればあまり問題はない 問題は序中盤 ソースコードをガシガシ リファインしたり機能追加する バグもガシガシ追加してる テスト重要! って、言うまでもないですよねー でもテストケースを追加するたびに 時間がどんどん掛るようになってくる・・・・
  • 3. あるテストの例 (13 tests) >rake test Finished in 227.140242 seconds. ちょっと時間掛かりすぎじゃないか?今後が心配。 top - 17:18:13 up 7:23, 3 users, load average: 0.08, 0.86, 0.58 Tasks: 173 total, 1 running, 171 sleeping, 0 stopped, 1 zombie Cpu0 : 0.3%us, 0.0%sy, 0.0%ni, 99.7%id, 0.0%wa, 0.0%hi, 0.0%si, 0.0%st Cpu1 1 0% C 1 : 1.0%us, 0.3%sy, 0 0% i 98 7%id 0.0%wa, 0.0%hi, 0.0%si, 0.0%st 0 3% 0.0%ni, 98.7%id, 0 0% 0 0%hi 0 0% i 0 0% Cpu2 : 0.3%us, 0.0%sy, 0.0%ni, 99.3%id, 0.0%wa, 0.0%hi, 0.3%si, 0.0%st Cpu3 : 0.3%us, 0.3%sy, 0.0%ni, 99.0%id, 0.3%wa, 0.0%hi, 0.0%si, 0.0%st Mem: 2580612k total, 1030520k used, 1550092k free, 224804k buffers Swap: 2031608k total, 120k used, 2031488k free, 376652k cached ・・・・ !! CPUが4つもあるのに1つしか使ってないよ ・・・・!! CPUが (略 top - 17:18:20 up 46 days, 9:00, 13 users, load average: 0.18, 0.45, 0.51 Tasks: 353 total, 1 running, 348 sleeping, 4 stopped, 0 zombie Cpu0 : 1.0%us, 0.0%sy, 0.0%ni, 98.3%id, 0.0%wa, 0.0%hi, 0.3%si, 0.3%st Cpu1 : 0.0%us, 0.0%sy, 0.0%ni,100.0%id, 0.0%wa, 0.0%hi, 0.0%si, 0.0%st Cpu2 : 0.0%us, 0.0%sy, 0.0%ni,100.0%id, 0.0%wa, 0.0%hi, 0.0%si, 0.0%st Cpu3 : 0.0%us, 0.0%sy, 0.0%ni,100.0%id, 0.0%wa, 0.0%hi, 0.0%si, 0.0%st Cpu4 : 0.0%us, 0.0%sy, 0.0%ni,100.0%id, 0.0%wa, 0.0%hi, 0.0%si, 0.0%st Cpu5 : 0.0%us, 0.0%sy, 0.0%ni,100.0%id, 0.0%wa, 0.0%hi, 0.0%si, 0.0%st Cpu6 : 12.0%us, 7.3%sy, 0.0%ni, 80.7%id, 0.0%wa, 0.0%hi, 0.0%si, 0.0%st Cpu7 : 0.0%us, 0.0%sy, 0.0%ni,100.0%id, 0.0%wa, 0.0%hi, 0.0%si, 0.0%st なんとかせんといかん Cpu8 : 0.0%us, 0.0%sy, 0.0%ni,100.0%id, 0.0%wa, 0.0%hi, 0.0%si, 0.0%st Cpu9 : 0.0%us, 0.0%sy, 0.0%ni,100.0%id, 0.0%wa, 0.0%hi, 0.0%si, 0.0%st Cpu10 : 0.0%us, 0.0%sy, 0.0%ni,100.0%id, 0.0%wa, 0.0%hi, 0.0%si, 0.0%st Cpu11 : 0.0%us, 0.0%sy, 0.0%ni,100.0%id, 0.0%wa, 0.0%hi, 0.0%si, 0.0%st Cpu12 : 0.0%us, 0.0%sy, 0.0%ni,100.0%id, 0.0%wa, 0.0%hi, 0.0%si, 0.0%st Cpu13 : 0.0%us, 0.7%sy, 0.0%ni, 99.3%id, 0.0%wa, 0.0%hi, 0.0%si, 0.0%st Cpu14 : 0.0%us, 0.0%sy, 0.0%ni,100.0%id, 0.0%wa, 0.0%hi, 0.0%si, 0.0%st Cpu15 : 0.0%us, 0.0%sy, 0.0%ni,100.0%id, 0.0%wa, 0.0%hi, 0.0%si, 0.0%st Mem: 16400384k total, 7751860k used, 8648524k free, 257472k buffers Swap: 8191992k total, 220k used, 8191772k free, 4637040k cached
  • 4. 並列実行test環境ってないの? Java界にはTestNGってのがあるらしい ! そういえばMakeには-jオプションあるけれど ! Rakeにはないなぁ そもそも並列といっても色々単位が。どれがいいの? ! 複数スレッドで ! 複数プロセスで ! 複数計算機で ! でもすくなくともどれか一つは欲しい ! 今は複数計算機使わなくてもいいや(個人的理由) !
  • 5. 使ってるtest/unitを見てみた 実行開始している所から並列化させればいいんじゃないだろう ! か? どこで開始してるの? そんな時のcaller関数 test本体に入れてみよう module Test どうやらここらしい。 module Unit 早速手を入れる class TestSuite def run(result, &progress_block) run(result &progress block) yield(STARTED, name) 単純にThread使ってみる @tests.each do |test| test.run(result, &progress_block) カレントディレクトリが end yield(FINISHED, name) グローバルスコープだった! end そもそもThreadは時分割で 複数CPU使わないよと突っ込みが入る。
  • 6. じゃあマルチプロセスで プロセス別れるとプロセス間通信が必要 特に他所のプロセスの変数いじるんだからdRubyがよそう なんとなく完成 def run(result, &progress_block) drbserv = DRb.start_service(nil,result) d_result = DRbObject.new_with_uri(drbserv.uri) >rake test yield(STARTED, name) Finished in 227.140242 seconds. pids = @tests.map do |test| >rake test P= fork { Finished in 80.753652 seconds. test.run(d_result, &progress_block) exit } え? end resultがthread safeじゃない? pids.each {|i| Process.waitpid(i) } 並列化数が制御できてない? drbserv.stop_service() yield(FINISHED, name) end そういうこともあります。
  • 7. 分散testに向けて 真剣に考えると色々解決しないといけない課題は多い ! ターゲットの選定 ! 分散のモデル化 ! 並列実行されるThreadの導入推進? ! グリッド? ! 分散test/unit っていっても 本質的な全然解決できてない
  • 8. 添付ライブラリで遊ぼう 分散test/unit が出来るといいな 樽家 昌也 (日本Rubyの会)
  • 9. 添付ライブラリ弄りは楽しい 広く使われるものなので固い。たまにもうちょっと融通を ! 利かせてほしくなったりする。 Code Reading が自然と出来るし、 ! 弄ってこそ見えてくる事がある。深く読み込める? コードの必然性とか、工夫とか ! Rubyは非常にいじりやすい。 C実装部分以外オープン ! 後付けで変更する部分を定義しなおすだけ。 Binary2.0的な事もできたり。(idからポインタを計算) まだの方は是非一度弄ってみてください
  • 10. 分散 これからの時代はメニーコアだ 分散だ ! Rubyをメニーコア時代のデファクトスクリプト言語に ! Regional RubyKaigi ! 栃木は分散の聖地? ! 都心からの適度な距離、dRubyな土地だし ! 分散の聖地? ! 分散の聖地はやっぱり分散して存在しないと。 ! もっと分散しましょう