1つのレイトレサーバに複数のスレッドで繋ぎにいってみる

複数のrtサーバプロセスを起動して試してましたが、 1つのrtサーバでもスレッドセーフな作りにしておけば、 複数のスレッドから繋げて使えるはず。

などと思って試してみると、色々とスレッドセーフになってなくて いっぱい修正が入ってしまいました。

とくに「値サーバ」。 例えば、複数のスレッドが値サーバに他のサーバの起動状況の情報を取りにいって、 起動してなかったらそのスレッドがサーバを起動しようとします。

ここで、複数のスレッドがほぼ同時に、あるサーバが起動してないと判定してしまって、 同じサーバをほぼ同時に複数起動してしまうという問題が起こってしまいました。

そこで「値サーバ」の中に、ちょっとした不可分なロックのしくみを追加して、 srvs.py の boot() からのサーバ起動確認処理で、使うようにしてみました。

v38.patch

$ mv rt_v37 rt_v38
$ cat v38.patch | ( cd rt_v38 ; patch -p1 )
$ cd rt_v38
$ make clean
$ make

では、いつもの速度確認。

まず以前の通りrtサーバは2つ起動して使う設定のままで。

$ ./cg.py eyep=[0,0,0],200,10 sec=10 data_name=objs name=out_v38/objs_1_2_sc n=1 init_sec=5 div=2
  :
wh : 76800/76800(100.0%) : fin 18.49s
  以前の
  v37  wh : 76800/76800(100.0%) : fin 15.49s
  v36  wh : 76800/76800(100.0%) : fin 15.13s
  v35  wh : 76800/76800(100.0%) : fin 16.16s
  v34  wh : 76800/76800(100.0%) : fin 38.47s
  v32  wh : 76800/76800(100.0%) : fin 26.84s
  v31  wh : 76800/76800(100.0%) : fin 40.50s
  v30  wh : 76800/76800(100.0%) : fin 38.39s
  v29  wh : 76800/76800(100.0%) : fin 1m 44.72s
  v28  wh : 76800/76800(100.0%) : fin 1m 18.06s
  v27  wh : 76800/76800(100.0%) : fin 1m 8.39s
  v26  wh : 76800/76800(100.0%) : fin 1m 6.02s

うーむ。

rt.py

#names = [ 'srv.rt' ] * 2
この行のコメントアウトを外して

names = [ 'srv.rt' ] * 2
にします。

これで、1つのrtサーバに2つのスレッドでから繋いでみます。

$ ./skill.sh 

$ ./cg.py eyep=[0,0,0],200,10 sec=10 data_name=objs name=out_v38/objs_1_2_sc n=1 init_sec=5 div=2
  :
wh : 76800/76800(100.0%) : fin 15.44s

まぁあんまり変わらんですが、 この方式の方がちょっとだけの差で最速。

rt.py
例の箇所を

#names = [ 'srv.rt' ] * 2
names = [ 'srv.rt', 'srv.rt', 'srv.rt-15', 'srv.rt-15' ]

2つのrtサーバに、それぞれ2つのスレッドをつないで、 合計4つのスレッドで走らせてみます。

$ ./skill.sh

$ ./cg.py eyep=[0,0,0],200,10 sec=10 data_name=objs name=out_v38/objs_1_2_sc n=1 init_sec=5 div=2
  :
wh : 76800/76800(100.0%) : fin 15.09s

これもまぁ誤差範囲かもですが、一応最速。

rt.py

#names = [ 'srv.rt' ] * 2
names = [ 'srv.rt' ] * 4 + [ 'srv.rt-15' ] * 4

8スレッドではいかに?

$ ./skill.sh

$ ./cg.py eyep=[0,0,0],200,10 sec=10 data_name=objs name=out_v38/objs_1_2_sc n=1 init_sec=5 div=2
  :
wh : 76800/76800(100.0%) : fin 19.80s

まぁ2サーバ * 2スレッドで 4スレッドにしておきますかね。

rt.py

names = [ 'srv.rt' ] * 2 + [ 'srv.rt-15' ] * 2

今回のその他の変更

rtサーバの中にval.pyから取得したデータのキャッシュを持ったままになっていて、 違うデータの指定で cg.py を起動しても、前回取得したデータのまま処理が進む不具合がありました。

まぁデータを変更するたび ./skill.sh でサーバを落として何とかしてたわけですが、 さすがに面倒なので cg.py の起動時にrtサーバの中のデータのキャッシュをクリアできるようにしてみました。

では、伝統パターンで視点の動きをちょっと変えてみて試してみます。

$ ./cg.py eyep=[0,0,-20],[40,40,5],10 sec=20 data_name=rxs_check2 name=out_v38/rxs_check2_tst div=8 fps=15
  :
frm : 300/300(100.0%) : fin 3m 19.42s
estimated 7.09 hour at 640*480 30fps

$ ./cg.py eyep=[0,0,-20],[40,40,5],10 sec=20 data_name=rxs_check2 name=out_v38/rxs_check2
  :
wh : 267968/307200(87.2%) : total 23.57s : rest 3.01s : 2018/05/17 06:11:42
wh : 307200/307200(100.0%) : fin 21.47s
frm : 600/600(100.0%) : fin 5h 32m 53.51s

$ ls -lt out_v38/ | head
-rw-r--r--  1 kondoh  staff  2836688  5 17 06:11 rxs_check2.mp4
  :

3MバイトOK