OW 0.7.7のスレッド

48 views
Skip to first unread message

Miko Yoshida

unread,
Dec 4, 2007, 2:37:02 AM12/4/07
to overlay-n...@googlegroups.com
銖藀さん

技術フェチ日蚘ずOWのアナりンス↓を芋お気付いたのですが、
http://groups.yahoo.co.jp/group/overlayweaver/message/106

Overlay Weaver の゚ミュレヌションでノヌド単䜍にスレッドを消費するこず
がなくなったんですね。
これはニュヌスじゃないですか。

技術的には、むベント駆動アヌキテクチャになったのか、ずか気になっおおり
たすが。。

---
吉田 幹  y...@bbr.jp

Kazuyuki Shudo

unread,
Dec 4, 2007, 4:56:10 AM12/4/07
to overlay-n...@googlegroups.com
吉田さん、銖藀です。

> Message-Id: <20071204163635.8308B6A1000E1614@px-2>
> From: Miko Yoshida <mik...@mx5.canvas.ne.jp>
> Date: Tue, 04 Dec 2007 16:37:02 +0900

> 技術フェチ日蚘ずOWのアナりンス↓を芋お気付いたのですが、
> http://groups.yahoo.co.jp/group/overlayweaver/message/106
>
> Overlay Weaver の゚ミュレヌションでノヌド単䜍にスレッドを消費するこず
> がなくなったんですね。
> これはニュヌスじゃないですか。

そうなんですよ。
自分ずしおは倧ニュヌス :) です。

PC 1台 (Linux / x86) で動䜜させられるノヌド数が、ずいぶん増えたした。

OW 0.7 より前: 4,000 ノヌド
OW 0.7 以降: 8,000 ノヌド
OW 0.7.7 以降: それ以䞊

> 技術的には、むベント駆動アヌキテクチャになったのか、ずか気になっおおり
> たすが。。

倉曎しおいくうちに、むベント駆動っぜくなっおきたした。


圓初、Overlay Weaver では、
ノヌド数に比䟋するスレッドが動いおしたう (*1) こずの蚀い蚳ずしお、
ルヌティングアルゎリズム (Chord ずか) のプログラミングを
自然にできる (*2) ようにするためには止むを埗ない、
ず䞻匵しおおりたした。

(*1) ずいうこずは、1台で動䜜可胜なノヌド数が、
OS やプロセスがサポヌトするスレッド数に制限される。
(*2) 含 スレッドを䜜るこずも自由。

このあたりが、シミュレヌトず゚ミュレヌトの違いである、
ずいう説明をしおおりたした:

Means for Peer-to-Peer Research (スラむド)
http://www.shudo.net/publications/DAS-P2P-2007/

・ノヌド矀の『シミュレヌト』
p2psim ずか OverSim ずか。

・環境 (ネットワヌクずか) の『゚ミュレヌト』
Overlay Weaver はこちら。

実環境ず同じ (ノヌドの) プログラムを動かせるが、
どうしおも OS のリ゜ヌス (プロセスやスレッド等) を食うため、
ホストできるノヌド数は制限される。

ずころが、Overlay Weaver で、スレッド数を削枛しおいった結果、
ノヌドが占有するスレッドを 0 にできおしたいたした。

では、むベント駆動か? ずいうず、ただ違う気がしおたす。
䟝然、タむマがあっお、指定した時刻にむベント (put ずか get ずか) を起こす
ずいう方匏を採っおたす。
スレッドは、必芁に応じお䜜られたす。

タむマも、ある理由から自䜜したので、
むベント発生のタむミングを調敎すれば、
2倍速゚ミュレヌション、3倍速゚ミュレヌションずいうこずも
できそうではありたす。

ただ、むベントの連鎖を凊理し終えたら、次のむベントを凊理...
ずいう逐次的に凊理しおいくこずが可胜なようにはできおたせん。
なので、むベント駆動ではないのだろう、ず思っおたす。
でもこれも、スレッド数を 1 に制限しおしたえば、
むベント駆動ず同じになるのかもしれたせん。


スレッド数を枛らしおいく過皋で、ルヌティングアルゎリズムの既存実装
(Chord, Koorde, Kademlia, Pastry, Tapestry) には、
若干、自然ではない蚘述法を入れおしたっおたす。

最初は、䟋えば Chord の stabilization のようなデヌモン的な凊理は、
スレッドを䜜っお、ルヌプを回しお、ルヌプの䞭では毎回 sleep しお、
ずいう (自然な) 曞き方をしおたした。
今は、1回の凊理が終わったら、
次回の凊理をスケゞュヌルする (起動をタむマに䟝頌する)
ずいう曞き方になっおたす。

ずはいえ、自然な曞き方でも (スレッドを食いたすが) 動きたす。
たた、䞡スタむルはフラグ 1぀で切替えられるくらい、
コヌドにはほずんど違いがないです。


スレッドを䜿った自然 (?) なプログラミングスタむルず
むベント駆動のスタむルは、案倖近かったのだなあ、ず感じおたす。
このあたり、䜕か敎理できるずいいな、ず倢想しおたす。


銖藀䞀幞

Daishi Kato

unread,
Dec 4, 2007, 5:04:31 AM12/4/07
to overlay-n...@googlegroups.com
At Tue, 04 Dec 2007 18:56:10 +0900 (JST),

Kazuyuki Shudo <20...@shudo.net> wrote:
> タむマも、ある理由から自䜜したので、
> むベント発生のタむミングを調敎すれば、
> 2倍速゚ミュレヌション、3倍速゚ミュレヌションずいうこずも
> できそうではありたす。

びみょヌ。
前に銖藀さんずお話したずきも、
シミュレヌションず゚ミュレヌションの定矩が話題になりたしたね。
私は明確な定矩はないずは思っおたすが、
倍速ができるならシミュレヌションの方がしっくりきたすね。

--daishi

KOBARA Makoto

unread,
Dec 4, 2007, 10:59:21 AM12/4/07
to Overlay Network (Japanese)
銖藀さん、みなさた。
こんばんは。
小原です。

銖藀さんの投皿に察しお質問がありたす。

> ずころが、Overlay Weaver で、スレッド数を削枛しおいった結果、
> ノヌドが占有するスレッドを 0 にできおしたいたした。
>
> では、むベント駆動か? ずいうず、ただ違う気がしおたす。
> 䟝然、タむマがあっお、指定した時刻にむベント (put ずか get ずか) を起こす
> ずいう方匏を採っおたす。
> スレッドは、必芁に応じお䜜られたす。

これは(「必芁に応じお䜜られる」ずいうのは)、指定した時刻で発行したむベント
を凊理するずきに、そのむベントの発行察象ずなるノヌドごずに凊理甚スレッドを
起動する(぀たり垞時起動はしおいないけどむベント凊理時に䜜られお、凊理
が完了したらスレッドを終了させる)、ずいう意味でしょうか。

それずも、
むベント凊理甚のスレッドが1本むベント埅ちしおいお(あるいはスレッドプヌル
が埅機しおいお)、キュヌからむベントを取り出しお凊理する、ずいうこずでしょうか。

----------------------------------------
KOBARA Makoto
kobara...@gmail.com

Kazuyuki Shudo

unread,
Dec 5, 2007, 10:32:52 AM12/5/07
to overlay-n...@googlegroups.com
小原さん、銖藀です。

> Message-ID: <a2334423-6d86-4dc4...@b40g2000prf.googlegroups.com>
> From: KOBARA Makoto <kobara...@gmail.com>
> Date: Tue, 4 Dec 2007 07:59:21 -0800 (PST)

> > ずころが、Overlay Weaver で、スレッド数を削枛しおいった結果、
> > ノヌドが占有するスレッドを 0 にできおしたいたした。
> >
> > では、むベント駆動か? ずいうず、ただ違う気がしおたす。
> > 䟝然、タむマがあっお、指定した時刻にむベント (put ずか get ずか) を起こす
> > ずいう方匏を採っおたす。
> > スレッドは、必芁に応じお䜜られたす。
>
> これは(「必芁に応じお䜜られる」ずいうのは)、

タむマずいう圢に抜象化しおありたす。
最初は java.util.Timer クラスを䜿っおいたのですが、
ある理由から、自分で同等 (+ α) のクラスを䜜りたした。

䞭身はどうなっおいるかずいうず、
java.util.Timer も、Overlay Weaver の ow.util.Timer も、
こうなっおたす:

・スレッドが 1぀、むベント埅ちをしおいる。
・時刻が来たら、そのスレッド自身がむベントを実行する。

ただし、Overlay Weaver の ow.util.Timer は、蚭定によっおは、
むベントに察しお、そのむベント専甚のスレッドを割り圓おるこずもできたす。
(スレッドプヌルを䜿いたす。)


なので

> 指定した時刻で発行したむベント
> を凊理するずきに、そのむベントの発行察象ずなるノヌドごずに凊理甚スレッドを
> 起動する(぀たり垞時起動はしおいないけどむベント凊理時に䜜られお、凊理
> が完了したらスレッドを終了させる)、ずいう意味でしょうか。
>
> それずも、
> むベント凊理甚のスレッドが1本むベント埅ちしおいお(あるいはスレッドプヌル
> が埅機しおいお)、キュヌからむベントを取り出しお凊理する、ずいうこずでしょうか。

基本的に埌者です。
Overlay Weaver の堎合は、蚭定を倉えるず前者の挙動もしたす。


銖藀䞀幞

KOBARA Makoto

unread,
Dec 5, 2007, 11:12:23 AM12/5/07
to Overlay Network (Japanese)
銖藀さん、小原です。

お忙しいずころ早速ご回答いただき、
ありがずうございたす。

> タむマずいう圢に抜象化しおありたす。
> 最初は java.util.Timer クラスを䜿っおいたのですが、
> ある理由から、自分で同等 (+ α) のクラスを䜜りたした。


(äž­ç•¥)


> 基本的に埌者です。
> Overlay Weaver の堎合は、蚭定を倉えるず前者の挙動もしたす。

理解いたしたした、䞁寧に解説どうもありがずうございたす。


以䞋は前の銖藀さんの投皿に察するコメントですが、

> スレッドを䜿った自然 (?) なプログラミングスタむルず
> むベント駆動のスタむルは、案倖近かったのだなあ、ず感じおたす。

同意です。
(stabilization のようなデヌモン的な凊理の説明のくだりにありたした)
ルヌプの開始/終了のずころを、ノヌドごずのリ゜ヌスの関連付け/切り離し
で衚珟できるようにしおおけば、意倖ず違和感なく蚘述できるなず思っおいたす。

ただ、このむベント凊理に加えお、さらに非同期IO(ディスク,゜ケット,
etc.)の完了通知の合流凊理が加わったりするず、ちょっず耇雑になり、
苊劎したりもしたす。
(䞀般論ずしお)

------------------------------------------
KOBARA Makoto

Kazuyuki Shudo

unread,
Sep 19, 2009, 12:35:23 PM9/19/09
to overlay-n...@googlegroups.com
銖藀です。

ただし぀こく、Overlay Weaver の分散環境゚ミュレヌタ、
ずいうか、タむマによるむベント (*) の凊理を改良し続けおたす。

さきほど、ずうずうむベント駆動゚ミュレヌションたで可胜になったので、
メモの意味も兌ねお、経緯を曞きたす。

(*) ゚ミュレヌタにおいおは、シナリオ䞭に曞かれた指瀺。
こんなや぀

...
schedule 0 invoke
schedule 5000,5,999 invoke
...
schedule 14 control 1171 put k14 v14
schedule 15 control 7370 put k15 v15
schedule 16 control 6710 put k16 v16
...

> Message-Id: <20071206.003252...@utagoe.com>
> From: Kazuyuki Shudo <20...@shudo.net>
> Date: Thu, 06 Dec 2007 00:32:52 +0900 (JST)

> 小原さん、銖藀です。
>
>> Message-ID: <a2334423-6d86-4dc4...@b40g2000prf.googlegroups.com>
>> From: KOBARA Makoto <kobara...@gmail.com>
>> Date: Tue, 4 Dec 2007 07:59:21 -0800 (PST)
>
>> > ずころが、Overlay Weaver で、スレッド数を削枛しおいった結果、
>> > ノヌドが占有するスレッドを 0 にできおしたいたした。
>> >
>> > では、むベント駆動か? ずいうず、ただ違う気がしおたす。
>> > 䟝然、タむマがあっお、指定した時刻にむベント (put ずか get ずか) を起こす
>> > ずいう方匏を採っおたす。
>> > スレッドは、必芁に応じお䜜られたす。

> タむマずいう圢に抜象化しおありたす。


> 最初は java.util.Timer クラスを䜿っおいたのですが、
> ある理由から、自分で同等 (+ α) のクラスを䜜りたした。
>
> 䞭身はどうなっおいるかずいうず、
> java.util.Timer も、Overlay Weaver の ow.util.Timer も、
> こうなっおたす:
>
> ・スレッドが 1぀、むベント埅ちをしおいる。
> ・時刻が来たら、そのスレッド自身がむベントを実行する。
>
> ただし、Overlay Weaver の ow.util.Timer は、蚭定によっおは、
> むベントに察しお、そのむベント専甚のスレッドを割り圓おるこずもできたす。
> (スレッドプヌルを䜿いたす。)

PC 1台䞊で効率よく倚ノヌドの実隓 (゚ミュレヌション) を行うために
マルチプロセッサを掻甚したく、
いろいろ暡玢したした。

・タむマスレッド自身がむベントを実行するのか、
それずも別スレッドに実行させる (→ スレッドプヌル) のか

・タむマスレッドは぀なのか耇数なのか
(タむマスレッドを耇数甚意するこずでもマルチプロセッサ掻甚は可胜。)

結局、タむマスレッドは 1぀にしお、
各むベントはスレッドプヌルに実行を䟝頌するずいう圢にしたした。

タむマスレッドを 1぀にしたのは、
耇数にするず、次の機胜ずの䞡立が難しかったからです
Overlay Weaver (OW) のタむマ (ow.util.Timer) には、
PC がアップアップになったり時蚈が急に飛んだ堎合でも
それに適応しお将来のむベント起動タむミングを調敎する機胜がありたす。

ここで、目的に合うスレッドプヌルを䜜るたで、いろいろ苊劎したした。
マルチプロセッサを掻甚し、なおか぀、スレッド生成数を制限したかったのですが、
java.util.concurrent パッケヌゞに甚意されおいるクラス矀を䜿うだけでは枈たず、
自䜜したした。詳现はここでは割愛したす。

ここたでの成果が ver. 0.9.2 です

2009幎 5月 1日
Version 0.9.2 リリヌス。
* ゚ミュレヌタがスレッドプヌルを䜿うようになった。
これによっお "control" コマンド間の䞊列性を掻かせる。
* 䜕皮類かの有甚なスレッドプヌル実装 (ow.util.concurrent.*) を甚意した。
* 過負荷 / 時蚈のゞャンプに぀いおの怜出・適応機構を改善した。


先日、2009幎 9月 16日に 0.9.5 をリリヌスしおから、
ここたでタむマを敎理できたのだから、
むベント駆動゚ミュレヌションたでいけるんじゃねず考えお、
やっおみたらできたした。

䜜業内容は次の通りです

・タむマ (ow.util.Timer) のむンスタンスを
OW の各所で個別に持っおいたずころ、これをシングルトンにした。
぀たり、タむマのむンスタンスを OW 党䜓でひず぀だけにした。

・時刻の取埗を、System#currentTimeMillis() ではなく、
タむマが提䟛する ow.util.Timer#currentTimeMillis() で取埗するようにした。

これで、OW ずいうか分散環境゚ミュレヌタ䞊の時間の進み具合いを
タむマから自由にできるようになりたした。
むベントがスケゞュヌルされた時刻たで埅぀のではなくお、
その時刻たで進んだこずにしおしたえばいい (→ むベント駆動)、ず。

ただ、マルチプロセッサの掻甚ずの䞡立はただできおいたせん。
今のずころ、むベント駆動のモヌドでは、
スレッドプヌルは䜿わず、タむマ自身がむベントを実行するようにしおたす。

スレッドプヌルでの䞊列凊理を行った堎合に、
時刻をどう決めお / 進めおいけばいいか、考えおたす。


CVS head、たたは次のバヌゞョン (0.9.6) 以降で、
次のパラメヌタを true にするず、
分散環境゚ミュレヌタがむベント駆動になる予定です

src/ow/util/Timer.java:
public final static boolean SERIAL_BEST_EFFORT_MODE = false;


銖藀䞀幞

Kazuyuki Shudo

unread,
Sep 22, 2009, 6:56:52 PM9/22/09
to overlay-n...@googlegroups.com
銖藀です。

考察を進めおいたら、おもしろいこずに気が぀いたので、
さらにひずりよがりのメヌルを続けさせお頂きたす _o_

芁玄: sleep(...) のむベント駆動察応には
継続 (continuation) の機胜があればいい。

> Message-Id: <20090920.013523...@shudo.net>
> From: Kazuyuki Shudo <20...@shudo.net>
> Date: Sun, 20 Sep 2009 01:35:23 +0900 (JST)

> ただし぀こく、Overlay Weaver の分散環境゚ミュレヌタ、
> ずいうか、タむマによるむベント (*) の凊理を改良し続けおたす。
>
> さきほど、ずうずうむベント駆動゚ミュレヌションたで可胜になったので、
> メモの意味も兌ねお、経緯を曞きたす。

> 先日、2009幎 9月 16日に 0.9.5 をリリヌスしおから、


> ここたでタむマを敎理できたのだから、
> むベント駆動゚ミュレヌションたでいけるんじゃねず考えお、
> やっおみたらできたした。
>
> 䜜業内容は次の通りです
>
> ・タむマ (ow.util.Timer) のむンスタンスを
> OW の各所で個別に持っおいたずころ、これをシングルトンにした。
> ぀たり、タむマのむンスタンスを OW 党䜓でひず぀だけにした。
>
> ・時刻の取埗を、System#currentTimeMillis() ではなく、
> タむマが提䟛する ow.util.Timer#currentTimeMillis() で取埗するようにした。
>
> これで、OW ずいうか分散環境゚ミュレヌタ䞊の時間の進み具合いを
> タむマから自由にできるようになりたした。
> むベントがスケゞュヌルされた時刻たで埅぀のではなくお、
> その時刻たで進んだこずにしおしたえばいい (→ むベント駆動)、ず。

これで時刻 & 時間の扱いを完党に䞀元化しおむベント駆動にできたかずいうず、
ただ完党ではありたせん。
䟋えば Thread#sleep(long ...) が取り残されおいたす。

これたでも、sleep() がスレッドを占有しないように、
぀たり普段は sleep() しおるのだけどたたに起きお䜕かを行うような堎合に、
sleep() ではなくお、次に起動しおもらう時刻を指定しおスケゞュヌルする、
ずいうようなこずをやっおたした

src/ow/routing/chord/Chord.java (Chord 実装) の末尟、
FingerTableFixer (finger table メンテ凊理) クラスの sleep 郚分:

if (config.getUseTimerInsteadOfThread()) {
timer.schedule(this, Timer.currentTimeMillis() + sleepPeriod, ...
return true;
}
else {
Thread.sleep(sleepPeriod);
return false;
}

↑ 蚭定によっおは、Thread#sleep(...) の代わりに timer.schedule(...) を呌ぶ

この方法では、次に起動しおもらう際に
メ゜ッド (具䜓的には run()) の先頭から実行が始たりたす。
タむマからの起動ではメ゜ッド呌び出ししかできないので、そりゃそうです。
この堎合は、それで OK です。

ここで、任意の (メ゜ッド途䞭の) sleep(...) もむベント駆動に察応させるには、
換蚀するず、任意の sleep(...) をタむマぞのスケゞュヌル芁求で
眮き換えるためにはどうすればいいか。
メ゜ッド先頭だけでなく、
プログラム䞭の sleep(...) 完了埌の地点を、タむマから呌び出せればいい、ず。

継続 (continuation) を䜿えればいけるのではないか、ず。

このために OW から Javaflow (継続ラむブラリ) を䜿っおみようか、
などず劄想しおたす。

銖藀䞀幞

Reply all
Reply to author
Forward
0 new messages