Ruby で Thread を使う(その2)
RSS Feed を マルチスレッドで取得するテストコードを作成。
ブログにソースコード書いても読みにくいので、github 見てください。
ちなみに、スレッド使ってない方はこっち。
処理の概要は、以下です。
スレッド版
subscriptions.xml に記載された Feed のアドレスを取得して、
登録件数分のスレッドを生成。RSS ライブラリで Feed のタイトル、リンク、記事を
標準出力に対してHTML形式で出力する。
スレッド使ってない方は、上の作業を地道に24回繰り返す。
なぜ、24件かというと普段チェックするニュースサイトの登録件数が24件だから。
$ grep xmlUrl subscriptions.xml | wc -l 24
まずはスレッド版のテストコードから。
最初、time コマンドで計測しながら
出力されるHTMLコードの行数を調べてみた。
$ time ./parallel.rb | wc -l 3294 real 0m3.779s user 0m1.985s sys 0m0.152s $ time ./parallel.rb | wc -l 3294 real 0m3.220s user 0m1.963s sys 0m0.145s $ time ./parallel.rb | wc -l 3294 real 0m5.674s user 0m1.991s sys 0m0.149s $ time ./parallel.rb | wc -l 3294 real 0m3.191s user 0m1.955s sys 0m0.158s $ time ./parallel.rb | wc -l 3294 real 0m4.874s user 0m1.974s sys 0m0.153s $ time ./parallel.rb | wc -l 3294 real 0m5.715s user 0m1.977s sys 0m0.154s
計測した結果、TAT が安定しない、、、
なんでかなー、なんでかなーと考えていて
はたと気づく。#記事の更新も、そんなに頻繁にしてなさそう
手動で、ぐだぐだ実行してるから
Ruby VM の起動に掛かる時間が、
一定してないんだろう、、、多分
というわけで、以下のような
シェルスクリプトにより連続実行テスト。
$ cat test.sh #!/bin/sh # by Yuji Shimoda COUNTER=0 while : do if [ $COUNTER -ne 10 ]; then time ./parallel.rb | wc -l COUNTER=$(($COUNTER+1)) else exit fi done
多分、TAT が安定するはず。
$ ./test.sh 3286 real 0m5.139s user 0m1.996s sys 0m0.150s 3286 real 0m2.057s user 0m1.922s sys 0m0.140s 3286 real 0m2.083s user 0m1.948s sys 0m0.141s 3286 real 0m2.095s user 0m1.949s sys 0m0.140s 3286 real 0m2.063s user 0m1.926s sys 0m0.144s 3286 real 0m2.466s user 0m1.949s sys 0m0.144s 3286 real 0m2.055s user 0m1.925s sys 0m0.141s 3286 real 0m2.093s user 0m1.955s sys 0m0.147s 3286 real 0m2.094s user 0m1.960s sys 0m0.142s 3286 real 0m2.099s user 0m1.951s sys 0m0.141s $
うん、安定した。
1回目のロードで時間が掛かってるけど、2回目以降は
キャッシュに載っかってるんで早い早い。
おおよそ、2 sec 程度
次は、スレッドなし版
test.sh を書き換えてテスト
$ ./test.sh real 0m7.561s user 0m1.938s sys 0m0.130s real 0m5.948s user 0m1.941s sys 0m0.122s real 0m7.536s user 0m1.904s sys 0m0.120s real 0m5.093s user 0m1.918s sys 0m0.119s real 0m5.987s user 0m1.929s sys 0m0.121s real 0m5.223s user 0m1.937s sys 0m0.124s real 0m7.301s user 0m1.907s sys 0m0.123s real 0m4.403s user 0m1.904s sys 0m0.120s real 0m4.466s user 0m1.915s sys 0m0.125s real 0m4.907s user 0m1.933s sys 0m0.122s $
えらい不安定やな、、、
thread 生成しない分、sys の使用率は若干低いめ
ただし、目に見えて分かるレベルの TAT の悪さ。
早くても 4.4 sec 〜 7.5 sec も処理に時間が掛かる。
最終的には、取得したフィード情報は
標準出力に出力する代わりに、SQL 発行して
データベースに登録する。
PostgreSQL とかDBの処理性能にもよるけど、スレッド版の方が
早く処理出来るということは明らかかな。
以上