るびー めも

Ruby の学習メモを記す

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の処理性能にもよるけど、スレッド版の方が
早く処理出来るということは明らかかな。

以上