Successfully reported this slideshow.
We use your LinkedIn profile and activity data to personalize ads and to show you more relevant ads. You can change your ad preferences anytime.

樽家昌也 (日本Rubyの会)

1,349 views

Published on

「分散unit/test」

  • Be the first to comment

  • Be the first to like this

樽家昌也 (日本Rubyの会)

  1. 1. 分散test/unit が出来るといいな 樽家 昌也 (日本Rubyの会)
  2. 2. リグレッションテストの憂鬱 終盤になればあまり問題はない 問題は序中盤 ソースコードをガシガシ リファインしたり機能追加する バグもガシガシ追加してる テスト重要! って、言うまでもないですよねー でもテストケースを追加するたびに 時間がどんどん掛るようになってくる・・・・
  3. 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. 4. 並列実行test環境ってないの? Java界にはTestNGってのがあるらしい ! そういえばMakeには-jオプションあるけれど ! Rakeにはないなぁ そもそも並列といっても色々単位が。どれがいいの? ! 複数スレッドで ! 複数プロセスで ! 複数計算機で ! でもすくなくともどれか一つは欲しい ! 今は複数計算機使わなくてもいいや(個人的理由) !
  5. 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. 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. 7. 分散testに向けて 真剣に考えると色々解決しないといけない課題は多い ! ターゲットの選定 ! 分散のモデル化 ! 並列実行されるThreadの導入推進? ! グリッド? ! 分散test/unit っていっても 本質的な全然解決できてない
  8. 8. 添付ライブラリで遊ぼう 分散test/unit が出来るといいな 樽家 昌也 (日本Rubyの会)
  9. 9. 添付ライブラリ弄りは楽しい 広く使われるものなので固い。たまにもうちょっと融通を ! 利かせてほしくなったりする。 Code Reading が自然と出来るし、 ! 弄ってこそ見えてくる事がある。深く読み込める? コードの必然性とか、工夫とか ! Rubyは非常にいじりやすい。 C実装部分以外オープン ! 後付けで変更する部分を定義しなおすだけ。 Binary2.0的な事もできたり。(idからポインタを計算) まだの方は是非一度弄ってみてください
  10. 10. 分散 これからの時代はメニーコアだ 分散だ ! Rubyをメニーコア時代のデファクトスクリプト言語に ! Regional RubyKaigi ! 栃木は分散の聖地? ! 都心からの適度な距離、dRubyな土地だし ! 分散の聖地? ! 分散の聖地はやっぱり分散して存在しないと。 ! もっと分散しましょう

×