kai-devel-ja Mailing List for kai (Page 10)
Kai is a distributed key-value datastore
Status: Beta
Brought to you by:
takemaru
You can subscribe to this list here.
2008 |
Jan
|
Feb
|
Mar
|
Apr
|
May
(14) |
Jun
(95) |
Jul
(94) |
Aug
(44) |
Sep
(5) |
Oct
(8) |
Nov
(14) |
Dec
(6) |
---|---|---|---|---|---|---|---|---|---|---|---|---|
2009 |
Jan
|
Feb
(18) |
Mar
(19) |
Apr
|
May
(11) |
Jun
(8) |
Jul
(4) |
Aug
|
Sep
(3) |
Oct
|
Nov
|
Dec
|
2011 |
Jan
|
Feb
|
Mar
(1) |
Apr
|
May
|
Jun
|
Jul
|
Aug
|
Sep
|
Oct
|
Nov
|
Dec
|
From: masahito i. <coo...@gm...> - 2008-07-07 12:32:17
|
ご指摘頂いて箇所のみ修正した版を commit 致しました。 取り急ぎ、ご報告まで〜。 2008/7/7 masahito ikuta <coo...@gm...>: > 結構、抜けありますね…申し訳ないです。 > 今晩、修正できるところから対応していきます。 > >>N:1 (30:10 とか) くらいが妥当かなと. > > とりあえず、max_connections のデフォルト値を 30 > memcache_max_connections のデフォルト値を 10 にしておきます。 > >> あと,src/kai.app.src と kai.config で値を変えているのには意図があります? > > kai.app の更新をすっかり忘れてました。 > んー・・・make をうまく使って、設定を一カ所に > まとめられないものでしょうか? > > 2008/7/6 Takeru INOUE <tak...@gm...>: >> おつかれさまでした. >> >> まだソースは見切れてないのですが,動かしてみていくつか気になった点があったので,とりあえず報告します. >> 動作環境は,R12B-0 (macports) と R12B-3 です. >> >> ■ typo in kai.config >> >> kai.config に "," 抜けがありました. >> >> --- kai.config (revision 372) >> +++ kai.config (local) >> @@ -1,7 +1,7 @@ >> [{kai, [%{logfile, "kai.log"}, >> %{hostname, "localhost"}, >> {port, 11011}, >> - {max_connections, 30} >> + {max_connections, 30}, >> {memcache_port, 11211}, >> {memcache_max_connections, 30}, >> {n, 3}, >> >> ■ 起動エラー >> >> Getting Started http://kai.wiki.sourceforge.net/getting+started >> の手順に従ってスタンドアローンとして起動すると,次のエラーが出るようです. >> >> % erl -pa ebin -config kai -kai n 1 -kai r 1 -kai w 1 >> 1> application:load(kai). >> 2> application:start(kai). >> 2008-07-06 22:33:35.298615 [info] ./kai_hash.erl:162: {update, >> [{{{192,168,1,225}, >> 11011}, >> >> [{number_of_virtual_nodes, >> 128}]}], >> []} >> >> =INFO REPORT==== 6-Jul-2008::22:33:35 === >> application: kai >> exited: {shutdown,{kai,start,[normal,[]]}} >> type: temporary >> {error,{shutdown,{kai,start,[normal,[]]}}} >> >> ■ max_connections のデフォルト値 >> >> max_connections と memcache_max_connections のデフォルト値ですが,memcach API に対して >> 1 つのリクエストが来ると,内部 API には N のリクエストが飛び交うことになります.これだけ考えると,max_connections >> : memcache_max_connections = N:1 (たとえば 30:10) とかがいいのかなと思います. >> >> 一方で,memcache API は内部 API の処理が終わるのを待つことになります.つまり,memcache API のほうが内部 >> API より処理時間が長くなります.これを考えると,30:15 のように memcach API >> の値を大きくしたほうがいいのかなと思います. >> >> さらに,内部 API は,memcache API だけでなくタイマから呼ばれることもあります.たとえば,定期的な bucket >> 同期などです.これを考えると,40:15 のように内部 API 野間対を大きくしたほうがいいのかなと思います. >> >> まぁ,いろいろと考えてみましたが,実際のところは実験してみないとよく分からないので,N:1 (30:10 とか) くらいが妥当かなと. >> >> あと,src/kai.app.src と kai.config で値を変えているのには意図があります? >> >> >> 2008/7/6 masahito ikuta <coo...@gm...>: >>> 一通り実装が終わったのでご報告申し上げます。 >>> http://kai.svn.sourceforge.net/viewvc/kai/branches/cooldaemon_embed_tcp_server/ >>> たけまるさん OK を頂ければ本体に merge します。 >>> >>> ▼kai_tcp_server について >>> たけまるさん日記バージョンに下記の修正を入れました。 >>> ・behaviour 化 >>> ・Mod:handle_call に Socket を渡す >>> ・{active, true} で listen 可能 >>> >>> ▼テストについて >>> ・make test 時に ./ebin を参照 >>> >>> ・Coverage Analysis 対応の為、test/kai.coverspec 追加 >>> 現状、kai_tcp_server, kai_api, kai_memcache を直書きしています。 >>> 後で、make test コマンドで Makefile 内の SOURCES から生成したいと考えております。 >>> make に詳しい方のご助言希望。 >>> >>> ・Coverage Analysis 対応の為、make 時に +debug_info を付加 >>> make test を実行しない場合であっても、強制的に erlc +debug_info になります。 >>> これも、make に詳しい方のご助言希望。 >>> >>> ▼現状、認識している残作業 >>> テストの Coverage を上げる。 >>> >>> 以上です。 >>> >>> 2008/7/1 Takeru INOUE <tak...@gm...>: >>>> {packet, line} とかのことはまったく気にしてませんでした.. >>>> >>>>> 2.Mod:handle_call に Socket を渡してしまう。 >>>>> {packet, line} だけ、kai_tcp_server に任せ、複雑な事は Mod で行ってしまおうかと。 >>>>> 個人的には、これが一番良いかな?と思っています。 >>>> >>>> 僕も 2 が良いように思いました. >>>> {packet, line} に戻すことを指示するキレイな方法があるかなぁ. >>>> >>>>> 3.Mod に gen_tcp:recv や gen_tcp:send を完全に任せる。 >>>>> http://d.hatena.ne.jp/cooldaemon/20080624/1214315157 >>>>> これに近い感じです。(そのままは使いません) >>>> >>>> あんまり複雑になるようなら 3 にしてしまったほうがいいのかもしれないですね. >>>> >>>> >>>> 2008/7/1 masahito ikuta <coo...@gm...>: >>>>> 自分の才能の無さに絶望したので、お知恵を拝借させて下さい orz >>>>> >>>>> 下記、kai_tcp_server のコード片です。 >>>>> --- >>>>> acceptor_loop(Socket, State, Mod, Option) -> >>>>> case gen_tcp:recv( >>>>> Socket, Option:get(recv_length), Option:get(recv_timeout) >>>>> ) of >>>>> {ok, Data} -> >>>>> case Mod:handle_call(Data, State) of >>>>> {reply, DataToSend, State} -> >>>>> gen_tcp:send(Socket, DataToSend), >>>>> acceptor_loop(Socket, State, Mod, Option); >>>>> {noreply, State} -> >>>>> acceptor_loop(Socket, State, Mod, Option); >>>>> {setopts, SocketOptions, RecvLength, State} -> >>>>> inet:setopts(Socket, SocketOptions), >>>>> NewOption = kai_option:new( >>>>> [ >>>>> {recv_length, RecvLength}, >>>>> {recv_timeout, Option:get(recv_timeout)} >>>>> ], >>>>> ?DEFAULT_OPT_PROP >>>>> ), >>>>> acceptor_loop(Socket, State, Mod, NewOption); >>>>> {close, DataToSend, State} -> >>>>> gen_tcp:send(Socket, DataToSend), >>>>> gen_tcp:close(Socket); >>>>> _Error -> >>>>> gen_tcp:close(Socket) >>>>> end; >>>>> {error, Reason} -> >>>>> exit({error, Reason}) >>>>> end. >>>>> --- >>>>> たけまるさん版に改良を加え >>>>> Mod:handle_call/2 に {setopts, SocketOptions, RecvLength, State} という戻り値を加えてみました。 >>>>> こうする事で、{packet, line} <-> {packet, raw} のオプション変更に対応しています。 >>>>> >>>>> ※RecvLength あたりが美しくないですよね・・・ >>>>> ※まだ、kai_option を使っているのですが、これは後で別途相談を・・・ >>>>> >>>>> この状態で、kai_memcache を途中まで修正してみたのですが >>>>> put クエリ対応がカオスになってしまいました。 >>>>> --- >>>>> handle_call(Data, [{packet, line}] = State) -> >>>>> dispatch(string:tokens(binary_to_list(Data), " \r\n"), State). >>>>> >>>>> dispatch(["set", Key, Flags, "0", Bytes], [{packet, line}] = State) -> >>>>> { >>>>> setopts, >>>>> [{packet, raw}], >>>>> Bytes, >>>>> [{packet, raw}, {state, Key, Flags}] >>>>> }; >>>>> dispatch(["set", Key, Flags, Exptime, Bytes], [{packet, line}] = State) -> >>>>> {reply, "CLIENT_ERROR Exptime must be zero.\r\n", State}. >>>>> >>>>> handle_call(Value, [{packet, raw}, {state, Key, Flags}] = State) -> >>>>> Data = #data{key=Key, flags=Flags, value=Value}, >>>>> case kai_coordinator:route({put, Data}) of >>>>> ok -> >>>>> {reply, <<"STORED\r\n">>, State}; >>>>> _Other -> >>>>> send_error_and_close("Failed to read.", State) >>>>> end. >>>>> --- >>>>> 作りかけなので、上記は、下記のようなバグを持っています。 >>>>> ・<<"STORED\r\n">> した後に {packet, line} に戻していない >>>>> ・Value の後に続く、<<"\r\n">> を受信しきっていない >>>>> >>>>> で、今後の対応として、下記の三つを考えております。 >>>>> 1.このまま続ける。 >>>>> Mod:handle_call/2 に gen_tcp:send しつつ inet:setopts するモードを追加すれば >>>>> このままいけそうな気がしています。カオスですが・・・。 >>>>> >>>>> 2.Mod:handle_call に Socket を渡してしまう。 >>>>> {packet, line} だけ、kai_tcp_server に任せ、複雑な事は Mod で行ってしまおうかと。 >>>>> 個人的には、これが一番良いかな?と思っています。 >>>>> >>>>> 3.Mod に gen_tcp:recv や gen_tcp:send を完全に任せる。 >>>>> http://d.hatena.ne.jp/cooldaemon/20080624/1214315157 >>>>> これに近い感じです。(そのままは使いません) >>>>> >>>>> と言う事で、意見募集中です。 >>>>> >>>>> 2008/6/25 Takeru INOUE <tak...@gm...>: >>>>>>> では、諸々考慮しつつ、kai へ組み込んでみますね。 >>>>>> >>>>>> はい,ガンガン進めちゃってください. >>>>>> >>>>>>> 念のため、branch を作ります。 >>>>>>> >>>>>>> embed_tcp_server >>>>>>> >>>>>>> と言う branch で、如何でしょうか? >>>>>> >>>>>> それでもいいですし,kai/branches/cooldaemon/hoge/ >>>>>> のようにアカウント名でディレクトリを掘ったほうが気楽であれば,こっちでもいいです. >>>>>> >>>>>> >>>>>>> 2008/6/25 Takeru INOUE <tak...@gm...>: >>>>>>>>> おー、この方が素敵ですね! >>>>>>>>> tcp_server.erl 用に behaviour を作っても良いかもしれませんね。 >>>>>>>> >>>>>>>> Kai に限定されない,汎用モジュールっぽくていい感じです :-) >>>>>>>> >>>>>>>>> あと、kai の場合は、tcp_server.erl 二つ(api と memcache)起動する必要があるので >>>>>>>>> supervisor 二重起動を許可しないといけませんね。 >>>>>>>>> (確認とってませんが、確か、同名の supervisor は起動できないハズ) >>>>>>>> >>>>>>>> そんな制約があるかもなのですね. >>>>>>>> >>>>>>>>> そう言えば、TrapExit かどこかで >>>>>>>>> application、supervisor、gen_server を >>>>>>>>> 一ファイルに記述する方法が掲載されていました。 >>>>>>>> >>>>>>>> いろんな技があるのですねぇ. >>>>>>>> 僕はそういうサイトを読み込めてないので,車輪の再発明をしてそうです.. >>>>>>>> >>>>>>>>> 今回の、tcp_server.erl は、supervisor と proc_lib が同居しているので >>>>>>>>> module として持ち運びが簡単かなぁと思うのですが >>>>>>>>> コード量によっては、分割した方が良い気もします。 >>>>>>>>> (今回のファイルサイズであれば、分割は不要だと思います) >>>>>>>> >>>>>>>> 今回も迷ったのですが,何となく一つのファイルにまとめてみて,そのままにしてあります. >>>>>>>> 書きやすさ・読みやすさに合わせて分割してしまってください. >>>>>>>> >>>>>>>>> 2008/6/25 Takeru INOUE <tak...@gm...>: >>>>>>>>>>> http://d.hatena.ne.jp/cooldaemon/20071024/1193193093 >>>>>>>>>>> ここの Server Design のアスキーアートをベースに話をします。 >>>>>>>>>>> >>>>>>>>>>> tcp_server_sup は、tcp_acceptor と tcp_client_sup を起動し監視下に置きます。 >>>>>>>>>>> その際、tcp_acceptor を、最大接続数分 起動します。 >>>>>>>>>> >>>>>>>>>> これを読んで合点がいきました. >>>>>>>>>> >>>>>>>>>>> http://d.hatena.ne.jp/cooldaemon/20080624 >>>>>>>>>>> こんな感じで、どうでしょうか? >>>>>>>>>> >>>>>>>>>> 素晴らしいです. >>>>>>>>>> >>>>>>>>>> せっかくなので,完全に OTP にしてみました. >>>>>>>>>> 使いやすくなってるかは微妙.. >>>>>>>>>> >>>>>>>>>> たけまる / 続・Erlang で Apache worker MPM っぽいこと >>>>>>>>>> http://teahut.sakura.ne.jp/b/2008-06-25-1.html >>>>>>>>>> >>>>>>>>>>> Mochiweb 方式より、accept 待ちプロセスを複数持つ方式の方が >>>>>>>>>>> シンプルでコード量が少ないですねぇ >>>>>>>>>> >>>>>>>>>> そういう気がします. >>>>>>>>>> 同時に accept できるというのは比較的新しい機能のようですね. >>>>>>>>>> >>>>>>>>>>> 2008/6/24 masahito ikuta <coo...@gm...>: >>>>>>>>>>>>> 僕がイメージしていたのは,つねに一定数のプロセスを起動しておいて,暇なやつにリクエストを処理させる >>>>>>>>>>>>> (暇やつがいなければリクエストを待たせておく) という振る舞いでした. >>>>>>>>>>>> >>>>>>>>>>>> メール&ブログのエントリを拝見致しましたが >>>>>>>>>>>> たけまるさんと私の考え方は >>>>>>>>>>>> 一致しているかなーと思います。 >>>>>>>>>>>> ※私が勘違いしているかも? >>>>>>>>>>>> >>>>>>>>>>>>> cooldaemon さんの方法だと,プロセスの死活監視はできるのですが,プロセス数が一定ではないので,同時接続数を制限することはできません. >>>>>>>>>>>> >>>>>>>>>>>> Mochiweb もそうなのですが >>>>>>>>>>>> accept した時点で、現在のプロセス数をインクリメントし >>>>>>>>>>>> 最大接続数に達した時点で、accept を止めます。 >>>>>>>>>>>> >>>>>>>>>>>> プロセスが終了する度、EXIT メッセージが親に通達されるので >>>>>>>>>>>> プロセス数をデクリメントします。 >>>>>>>>>>>> (accept ループを抜けていた場合は、再開) >>>>>>>>>>>> >>>>>>>>>>>> なんとなくですが >>>>>>>>>>>> 私は、accept するプロセスをプーリングする方式の方が >>>>>>>>>>>> 速度が出そうな気がしますけれど。 >>>>>>>>>>>> >>>>>>>>>>>>> cooldaemon さんの方法は,プロセスを増やしながら生死を管理するための高度な方法です. >>>>>>>>>>>> >>>>>>>>>>>> ついでに、kai_api, kai_memcache のコードの共通化も可能です。 >>>>>>>>>>>> >>>>>>>>>>>> で、両者の良いとこ取りを出来ないかと思い >>>>>>>>>>>> >>>>>>>>>>>>>> spawn のコストが高くなった時点で >>>>>>>>>>>>>> acceptor をプーリングしておく方式に切り替える事も >>>>>>>>>>>>>> 検討材料として残しつつ、作業を進めます。 >>>>>>>>>>>>>> >>>>>>>>>>>>>> その場合は、tcp_client_sup がプロセスの死活監視を行う事になります。 >>>>>>>>>>>>>> (名前は、kai_tcp_client_sup とかが良いでしょうか?) >>>>>>>>>>>> >>>>>>>>>>>> と書いたのですが、これの説明が悪いので、もう少しだけ補足を書かせて下さい。 >>>>>>>>>>>> >>>>>>>>>>>> http://d.hatena.ne.jp/cooldaemon/20071024/1193193093 >>>>>>>>>>>> ここの Server Design のアスキーアートをベースに話をします。 >>>>>>>>>>>> >>>>>>>>>>>> tcp_server_sup は、tcp_acceptor と tcp_client_sup を起動し監視下に置きます。 >>>>>>>>>>>> その際、tcp_acceptor を、最大接続数分 起動します。 >>>>>>>>>>>> >>>>>>>>>>>> 接続があると、tcp_acceptor は >>>>>>>>>>>> tcp_client_sup に tcp_echo(kai_memcache) を起動しなさい!と >>>>>>>>>>>> メッセージを送ります。 >>>>>>>>>>>> >>>>>>>>>>>> 接続時に spawn しているので tcp_acceptor を複数起動するメリットが >>>>>>>>>>>> accept ループを出たり入ったりする処理を >>>>>>>>>>>> 書かなくて良い点だけになってしまいますが・・・。 >>>>>>>>>>>> (単一プロセスのループ処理を、複数プロセスに置き換えているところが >>>>>>>>>>>> Erlang っぽくて萌えるのですがw;) >>>>>>>>>>>> >>>>>>>>>>>> 死活監視と接続最大数は別の話だとは思いつつも >>>>>>>>>>>> proc_lib の下に proc_lib や普通のプロセス(?) を配置すると >>>>>>>>>>>> OTP の恩恵を受けられないので、何とかならないかなぁと思ってます。 >>>>>>>>>>>> >>>>>>>>>>>>> これに懲りずにおつきあいくださいませ. >>>>>>>>>>>> >>>>>>>>>>>> いやー、こういう話がないと、開発してる気分になれない気が(w; >>>>>>>>>>>> お気になさらずにー。 >>>>>>>>>>>> >>>>>>>>>>>> 2008/6/23 Takeru INOUE <tak...@gm...>: >>>>>>>>>>>>> 井上 (たけまる) です. >>>>>>>>>>>>> >>>>>>>>>>>>> すいません,少し勘違いしていました. >>>>>>>>>>>>> >>>>>>>>>>>>> 今回やろうとしていたことは,同時接続数の制限です (という言い方をすれば誤解がなかったのか). >>>>>>>>>>>>> よく考えれば, >>>>>>>>>>>>> >>>>>>>>>>>>> - プロセスの生死を管理すること >>>>>>>>>>>>> - 同時接続数を制限すること >>>>>>>>>>>>> >>>>>>>>>>>>> これらは別の話ですね. >>>>>>>>>>>>> >>>>>>>>>>>>> 僕がイメージしていたのは,つねに一定数のプロセスを起動しておいて,暇なやつにリクエストを処理させる >>>>>>>>>>>>> (暇やつがいなければリクエストを待たせておく) という振る舞いでした. >>>>>>>>>>>>> cooldaemon さんの方法だと,プロセスの死活監視はできるのですが,プロセス数が一定ではないので,同時接続数を制限することはできません. >>>>>>>>>>>>> >>>>>>>>>>>>> cooldaemon さんの方法は,プロセスを増やしながら生死を管理するための高度な方法です. >>>>>>>>>>>>> 今回の局面で使うには少し違うかも,という気がしています. >>>>>>>>>>>>> 僕のイメージとは少し違ったのですが,有用な方法であることは間違いないので,どこかで役に立つと思います >>>>>>>>>>>>> (まだ勘違いしてるかもしれないので,気づいた点がありましたら指摘してください><). >>>>>>>>>>>>> >>>>>>>>>>>>> 詳しくはブログに書きました. >>>>>>>>>>>>> >>>>>>>>>>>>> たけまる / Erlang で Apache worker MPM っぽいこと >>>>>>>>>>>>> http://teahut.sakura.ne.jp/b/2008-06-23-1.html >>>>>>>>>>>>> >>>>>>>>>>>>> というわけで,混乱させてしまってすみません m(_ _)m >>>>>>>>>>>>> これに懲りずにおつきあいくださいませ. >>>>>>>>>>>>> >>>>>>>>>>>>> >>>>>>>>>>>>> 2008/6/23 masahito ikuta <coo...@gm...>: >>>>>>>>>>>>>>> ただこの方法だと worker の生死管理を自分で書かないといけないので,cooldaemon さんの方法のがよさそうです. >>>>>>>>>>>>>> >>>>>>>>>>>>>> spawn のコストが高くなった時点で >>>>>>>>>>>>>> acceptor をプーリングしておく方式に切り替える事も >>>>>>>>>>>>>> 検討材料として残しつつ、作業を進めます。 >>>>>>>>>>>>>> >>>>>>>>>>>>>> その場合は、tcp_client_sup がプロセスの死活監視を行う事になります。 >>>>>>>>>>>>>> (名前は、kai_tcp_client_sup とかが良いでしょうか?) >>>>>>>>>>>>>> >>>>>>>>>>>>>> 2008/6/23 Takeru INOUE <tak...@gm...>: >>>>>>>>>>>>>>>>>>- kai_api, kai_memcache のプロセスプール >>>>>>>>>>>>>>>>> >>>>>>>>>>>>>>>>> こちらの作業内容を >>>>>>>>>>>>>>>>> もう少し詳しく教えて頂いて宜しいでしょうか? >>>>>>>>>>>>>>>>> (何となく、参加できそうな気がしたので・・・) >>>>>>>>>>>>>>>> >>>>>>>>>>>>>>>> http://d.hatena.ne.jp/cooldaemon/20071024/1193193093 >>>>>>>>>>>>>>>> ↑この仕組みで汎用化してしまい >>>>>>>>>>>>>>>> tcp_acceptor の箇所で接続数の制限を行うのは >>>>>>>>>>>>>>>> 如何でしょうか? >>>>>>>>>>>>>>> >>>>>>>>>>>>>>> はい,そんな感じです. >>>>>>>>>>>>>>> >>>>>>>>>>>>>>> やろうとしていることは,『プログラミングErlang』14.1 の最後に書いてあることそのままです. >>>>>>>>>>>>>>> >>>>>>>>>>>>>>> | Erlang バージョン R11B-3 では,1つの待ち受け用ソケットに >>>>>>>>>>>>>>> | 対して複数の Erlang プロセスが gen_tcp:accept/1 を呼び出すことが >>>>>>>>>>>>>>> | できる.この機能を利用すれば,前もって生成しておいたプロセスのプー >>>>>>>>>>>>>>> | ルを用意しておいて,その各プロセスを gen_tcp:accept/1 で接続待ち >>>>>>>>>>>>>>> | 状態にしておくことができるので,並列サーバを作るのが簡単になる.(p.207) >>>>>>>>>>>>>>> >>>>>>>>>>>>>>> 僕がどうするつもりだったかというと,わりと適当にしか考えてなくて,『プログラミングErlang』付録D に出てくる lib_chan_cs >>>>>>>>>>>>>>> のように,accept 待ちのプロセスを指定した数だけ spawn しておけばいいかなくらいに思ってました. >>>>>>>>>>>>>>> >>>>>>>>>>>>>>> possibly_start_another(false, Listen, Active, Fun, max) -> >>>>>>>>>>>>>>> case length(Active) of >>>>>>>>>>>>>>> N when N < Max -> % worker 数が Max 未満なら >>>>>>>>>>>>>>> New = start_accept(Listen, Fun), % accept 待ちプロセスを起動 >>>>>>>>>>>>>>> >>>>>>>>>>>>>>> ただこの方法だと worker の生死管理を自分で書かないといけないので,cooldaemon さんの方法のがよさそうです. >>>>>>>>>>>>>>> というわけで,いけそうなら sourceforge の tracker で自分にアサインしちゃってください. >>>>>>>>>>>>>>> kai_api と kai_memcache がありますが,kai_memcache のほうがデバッグしやすい気がします. >>>>>>>>>>>>>>> >>>>>>>>>>>>>>> ちなみに,プロセスプールを TODO に入れた理由は次のとおりです. >>>>>>>>>>>>>>> いまの Kai は,毎秒数百リクエストを送りつけると負荷が高くなって,メンバシップの管理ができなくなり,クラスタが分解してしまいます. >>>>>>>>>>>>>>> これを回避できるとしたら,API の受け付け数を制限するしかないかなと. >>>>>>>>>>>>>>> 『プログラミングErlang』でも,この機能をトラフィックシェーピング (流量制御) と読んでますね. >>>>>>>>>>>>>>> >>>>>>>>>>>>>>> >>>>>>>>>>>>>>>> 2008/6/23 masahito ikuta <coo...@gm...>: >>>>>>>>>>>>>>>>> cooldaemon です。 >>>>>>>>>>>>>>>>> >>>>>>>>>>>>>>>>>>- kai_api, kai_memcache のプロセスプール >>>>>>>>>>>>>>>>> >>>>>>>>>>>>>>>>> こちらの作業内容を >>>>>>>>>>>>>>>>> もう少し詳しく教えて頂いて宜しいでしょうか? >>>>>>>>>>>>>>>>> (何となく、参加できそうな気がしたので・・・) >>>>>>>>>>>>>>>>> >>>>>>>>>>>>>>>>>>チューニングの類 (特にトリッキーなコードを伴うもの) は後回しにしたいと思います. >>>>>>>>>>>>>>>>> >>>>>>>>>>>>>>>>> とても細かい話で申し訳ないのですが・・・ >>>>>>>>>>>>>>>>> 現在、make すると src ディレクトリ配下に beam ファイルが出来てしまうので >>>>>>>>>>>>>>>>> OTP っぽく ebin ディレクトリ配下に配置したいと思いますが、如何でしょうか? >>>>>>>>>>>>>>>>> (autotools に対応する気力は無いのですが orz) >>>>>>>>>>>>>>>>> >>>>>>>>>>>>>>>>> >>>>>>>>>>>>>>>>> 2008/6/22 Takeru INOUE <tak...@gm...>: >>>>>>>>>>>>>>>>>> 井上 (たけまる) です. >>>>>>>>>>>>>>>>>> >>>>>>>>>>>>>>>>>> 6/19 にこのメールを送ったのですが,sourceforge の作業中だったから送られてないようなので (archive に表示されない),再送します. >>>>>>>>>>>>>>>>>> >>>>>>>>>>>>>>>>>> >>>>>>>>>>>>>>>>>> ---------- Forwarded message ---------- >>>>>>>>>>>>>>>>>> From: Takeru INOUE <tak...@gm...> >>>>>>>>>>>>>>>>>> Date: 2008/6/19 >>>>>>>>>>>>>>>>>> Subject: 開発の進め方 >>>>>>>>>>>>>>>>>> To: kai...@li... >>>>>>>>>>>>>>>>>> >>>>>>>>>>>>>>>>>> >>>>>>>>>>>>>>>>>> 井上 (たけまる) です. >>>>>>>>>>>>>>>>>> >>>>>>>>>>>>>>>>>> きのうは勉強会に参加いただきありがとうございました. >>>>>>>>>>>>>>>>>> お陰様で,面白い会になったと思います. >>>>>>>>>>>>>>>>>> >>>>>>>>>>>>>>>>>> さて,開発の進め方についてです. >>>>>>>>>>>>>>>>>> >>>>>>>>>>>>>>>>>> まず,発表で言ったように,kai_memcache から coordinator の機能を分離しておきます. >>>>>>>>>>>>>>>>>> また,kai_version という空のモジュールを作っておきます. >>>>>>>>>>>>>>>>>> これで,基本的なモジュール構成が固まるので,開発しやすくなると思います. >>>>>>>>>>>>>>>>>> >>>>>>>>>>>>>>>>>> 次に,実装の順序についてです. >>>>>>>>>>>>>>>>>> >>>>>>>>>>>>>>>>>> 基本的には好きなところから実装してもらって構わないと思うのですが,次のようなのが他の部分への影響が少なく取りかかりやすいでしょうか (面白みも少ないけど). >>>>>>>>>>>>>>>>>> >>>>>>>>>>>>>>>>>> - ./configure >>>>>>>>>>>>>>>>>> - test_server >>>>>>>>>>>>>>>>>> - kai_store の永続化 >>>>>>>>>>>>>>>>>> - kai_api, kai_memcache のプロセスプール >>>>>>>>>>>>>>>>>> >>>>>>>>>>>>>>>>>> チューニングの類 (特にトリッキーなコードを伴うもの) は後回しにしたいと思います. >>>>>>>>>>>>>>>>>> >>>>>>>>>>>>>>>>>> コミッタは 5-10名と多くないので,管理はゆるめで進めたいです. >>>>>>>>>>>>>>>>>> 早い者勝ちで手を挙げた人が実装してみて,行き詰まったら ML などでヘルプを求めるというのでいいかなぁ. >>>>>>>>>>>>>>>>>> 誰が取り組んでいるかを知るために,sourceforge の Tracker を使うべきかなぁ. >>>>>>>>>>>>>>>>>> 適当にブランチを切って自由に進めてもらって,落ち着いたところで merge するというので大丈夫だろうか. >>>>>>>>>>>>>>>>>> モジュールのインタフェースが変更されるときは気をつけないといけないけど (merge は僕がやったほうがいいのかも). >>>>>>>>>>>>>>>>>> >>>>>>>>>>>>>>>>>> といったあたりについて意見を聞かせてください. >>>>>>>>>>>>>>>>>> >>>>>>>>>>>>>>>>>> # こういった開発者のための意識合わせ的なことは,Wiki にまとめて後で周知します. >>>>>>>>>>>>>>>>>> >>>>>>>>>>>>>>>>>> # うまく回り始めたら,僕は全体のコーディネートにまわるつもりです. >>>>>>>>>>>>>>>>>> >>>>>>>>>>>>>>>>>> -- >>>>>>>>>>>>>>>>>> Takeru INOUE <tak...@gm...> >>>>>>>>>>>>>>>>>> >>>>>>>>>>>>>>>>>> ------------------------------------------------------------------------- >>>>>>>>>>>>>>>>>> Check out the new SourceForge.net Marketplace. >>>>>>>>>>>>>>>>>> It's the best place to buy or sell services for >>>>>>>>>>>>>>>>>> just about anything Open Source. >>>>>>>>>>>>>>>>>> http://sourceforge.net/services/buy/index.php >>>>>>>>>>>>>>>>>> _______________________________________________ >>>>>>>>>>>>>>>>>> Kai-devel-ja mailing list >>>>>>>>>>>>>>>>>> Kai...@li... >>>>>>>>>>>>>>>>>> https://lists.sourceforge.net/lists/listinfo/kai-devel-ja >>>>>>>>>>>>>>>>>> >>>>>>>>>>>>>>>>> >>>>>>>>>>>>>>>>> >>>>>>>>>>>>>>>>> >>>>>>>>>>>>>>>>> -- >>>>>>>>>>>>>>>>> cooldaemon >>>>>>>>>>>>>>>>> >>>>>>>>>>>>>>>> >>>>>>>>>>>>>>>> >>>>>>>>>>>>>>>> >>>>>>>>>>>>>>>> -- >>>>>>>>>>>>>>>> cooldaemon >>>>>>>>>>>>>>>> >>>>>>>>>>>>>>> >>>>>>>>>>>>>>> >>>>>>>>>>>>>>> >>>>>>>>>>>>>>> -- >>>>>>>>>>>>>>> Takeru INOUE <tak...@gm...> >>>>>>>>>>>>>>> >>>>>>>>>>>>>> >>>>>>>>>>>>>> >>>>>>>>>>>>>> >>>>>>>>>>>>>> -- >>>>>>>>>>>>>> cooldaemon >>>>>>>>>>>>>> >>>>>>>>>>>>> >>>>>>>>>>>>> >>>>>>>>>>>>> >>>>>>>>>>>>> -- >>>>>>>>>>>>> Takeru INOUE <tak...@gm...> >>>>>>>>>>>>> >>>>>>>>>>>> >>>>>>>>>>>> >>>>>>>>>>>> >>>>>>>>>>>> -- >>>>>>>>>>>> cooldaemon >>>>>>>>>>>> >>>>>>>>>>>> ------------------------------------------------------------------------- >>>>>>>>>>>> Check out the new SourceForge.net Marketplace. >>>>>>>>>>>> It's the best place to buy or sell services for >>>>>>>>>>>> just about anything Open Source. >>>>>>>>>>>> http://sourceforge.net/services/buy/index.php >>>>>>>>>>>> _______________________________________________ >>>>>>>>>>>> Kai-devel-ja mailing list >>>>>>>>>>>> Kai...@li... >>>>>>>>>>>> https://lists.sourceforge.net/lists/listinfo/kai-devel-ja >>>>>>>>>>>> >>>>>>>>>>> >>>>>>>>>>> >>>>>>>>>>> >>>>>>>>>>> -- >>>>>>>>>>> cooldaemon >>>>>>>>>>> >>>>>>>>>> >>>>>>>>>> >>>>>>>>>> >>>>>>>>>> -- >>>>>>>>>> Takeru INOUE <tak...@gm...> >>>>>>>>>> >>>>>>>>> >>>>>>>>> >>>>>>>>> >>>>>>>>> -- >>>>>>>>> cooldaemon >>>>>>>>> >>>>>>>> >>>>>>>> >>>>>>>> >>>>>>>> -- >>>>>>>> Takeru INOUE <tak...@gm...> >>>>>>>> >>>>>>> >>>>>>> >>>>>>> >>>>>>> -- >>>>>>> cooldaemon >>>>>>> >>>>>> >>>>>> >>>>>> >>>>>> -- >>>>>> Takeru INOUE <tak...@gm...> >>>>>> >>>>> >>>>> >>>>> >>>>> -- >>>>> cooldaemon >>>>> >>>> >>>> >>>> >>>> -- >>>> Takeru INOUE <tak...@gm...> >>>> >>> >>> >>> >>> -- >>> cooldaemon >>> >> >> >> >> -- >> Takeru INOUE <tak...@gm...> >> > > > > -- > cooldaemon > -- cooldaemon |
From: masahito i. <coo...@gm...> - 2008-07-07 01:07:47
|
結構、抜けありますね…申し訳ないです。 今晩、修正できるところから対応していきます。 >N:1 (30:10 とか) くらいが妥当かなと. とりあえず、max_connections のデフォルト値を 30 memcache_max_connections のデフォルト値を 10 にしておきます。 > あと,src/kai.app.src と kai.config で値を変えているのには意図があります? kai.app の更新をすっかり忘れてました。 んー・・・make をうまく使って、設定を一カ所に まとめられないものでしょうか? 2008/7/6 Takeru INOUE <tak...@gm...>: > おつかれさまでした. > > まだソースは見切れてないのですが,動かしてみていくつか気になった点があったので,とりあえず報告します. > 動作環境は,R12B-0 (macports) と R12B-3 です. > > ■ typo in kai.config > > kai.config に "," 抜けがありました. > > --- kai.config (revision 372) > +++ kai.config (local) > @@ -1,7 +1,7 @@ > [{kai, [%{logfile, "kai.log"}, > %{hostname, "localhost"}, > {port, 11011}, > - {max_connections, 30} > + {max_connections, 30}, > {memcache_port, 11211}, > {memcache_max_connections, 30}, > {n, 3}, > > ■ 起動エラー > > Getting Started http://kai.wiki.sourceforge.net/getting+started > の手順に従ってスタンドアローンとして起動すると,次のエラーが出るようです. > > % erl -pa ebin -config kai -kai n 1 -kai r 1 -kai w 1 > 1> application:load(kai). > 2> application:start(kai). > 2008-07-06 22:33:35.298615 [info] ./kai_hash.erl:162: {update, > [{{{192,168,1,225}, > 11011}, > > [{number_of_virtual_nodes, > 128}]}], > []} > > =INFO REPORT==== 6-Jul-2008::22:33:35 === > application: kai > exited: {shutdown,{kai,start,[normal,[]]}} > type: temporary > {error,{shutdown,{kai,start,[normal,[]]}}} > > ■ max_connections のデフォルト値 > > max_connections と memcache_max_connections のデフォルト値ですが,memcach API に対して > 1 つのリクエストが来ると,内部 API には N のリクエストが飛び交うことになります.これだけ考えると,max_connections > : memcache_max_connections = N:1 (たとえば 30:10) とかがいいのかなと思います. > > 一方で,memcache API は内部 API の処理が終わるのを待つことになります.つまり,memcache API のほうが内部 > API より処理時間が長くなります.これを考えると,30:15 のように memcach API > の値を大きくしたほうがいいのかなと思います. > > さらに,内部 API は,memcache API だけでなくタイマから呼ばれることもあります.たとえば,定期的な bucket > 同期などです.これを考えると,40:15 のように内部 API 野間対を大きくしたほうがいいのかなと思います. > > まぁ,いろいろと考えてみましたが,実際のところは実験してみないとよく分からないので,N:1 (30:10 とか) くらいが妥当かなと. > > あと,src/kai.app.src と kai.config で値を変えているのには意図があります? > > > 2008/7/6 masahito ikuta <coo...@gm...>: >> 一通り実装が終わったのでご報告申し上げます。 >> http://kai.svn.sourceforge.net/viewvc/kai/branches/cooldaemon_embed_tcp_server/ >> たけまるさん OK を頂ければ本体に merge します。 >> >> ▼kai_tcp_server について >> たけまるさん日記バージョンに下記の修正を入れました。 >> ・behaviour 化 >> ・Mod:handle_call に Socket を渡す >> ・{active, true} で listen 可能 >> >> ▼テストについて >> ・make test 時に ./ebin を参照 >> >> ・Coverage Analysis 対応の為、test/kai.coverspec 追加 >> 現状、kai_tcp_server, kai_api, kai_memcache を直書きしています。 >> 後で、make test コマンドで Makefile 内の SOURCES から生成したいと考えております。 >> make に詳しい方のご助言希望。 >> >> ・Coverage Analysis 対応の為、make 時に +debug_info を付加 >> make test を実行しない場合であっても、強制的に erlc +debug_info になります。 >> これも、make に詳しい方のご助言希望。 >> >> ▼現状、認識している残作業 >> テストの Coverage を上げる。 >> >> 以上です。 >> >> 2008/7/1 Takeru INOUE <tak...@gm...>: >>> {packet, line} とかのことはまったく気にしてませんでした.. >>> >>>> 2.Mod:handle_call に Socket を渡してしまう。 >>>> {packet, line} だけ、kai_tcp_server に任せ、複雑な事は Mod で行ってしまおうかと。 >>>> 個人的には、これが一番良いかな?と思っています。 >>> >>> 僕も 2 が良いように思いました. >>> {packet, line} に戻すことを指示するキレイな方法があるかなぁ. >>> >>>> 3.Mod に gen_tcp:recv や gen_tcp:send を完全に任せる。 >>>> http://d.hatena.ne.jp/cooldaemon/20080624/1214315157 >>>> これに近い感じです。(そのままは使いません) >>> >>> あんまり複雑になるようなら 3 にしてしまったほうがいいのかもしれないですね. >>> >>> >>> 2008/7/1 masahito ikuta <coo...@gm...>: >>>> 自分の才能の無さに絶望したので、お知恵を拝借させて下さい orz >>>> >>>> 下記、kai_tcp_server のコード片です。 >>>> --- >>>> acceptor_loop(Socket, State, Mod, Option) -> >>>> case gen_tcp:recv( >>>> Socket, Option:get(recv_length), Option:get(recv_timeout) >>>> ) of >>>> {ok, Data} -> >>>> case Mod:handle_call(Data, State) of >>>> {reply, DataToSend, State} -> >>>> gen_tcp:send(Socket, DataToSend), >>>> acceptor_loop(Socket, State, Mod, Option); >>>> {noreply, State} -> >>>> acceptor_loop(Socket, State, Mod, Option); >>>> {setopts, SocketOptions, RecvLength, State} -> >>>> inet:setopts(Socket, SocketOptions), >>>> NewOption = kai_option:new( >>>> [ >>>> {recv_length, RecvLength}, >>>> {recv_timeout, Option:get(recv_timeout)} >>>> ], >>>> ?DEFAULT_OPT_PROP >>>> ), >>>> acceptor_loop(Socket, State, Mod, NewOption); >>>> {close, DataToSend, State} -> >>>> gen_tcp:send(Socket, DataToSend), >>>> gen_tcp:close(Socket); >>>> _Error -> >>>> gen_tcp:close(Socket) >>>> end; >>>> {error, Reason} -> >>>> exit({error, Reason}) >>>> end. >>>> --- >>>> たけまるさん版に改良を加え >>>> Mod:handle_call/2 に {setopts, SocketOptions, RecvLength, State} という戻り値を加えてみました。 >>>> こうする事で、{packet, line} <-> {packet, raw} のオプション変更に対応しています。 >>>> >>>> ※RecvLength あたりが美しくないですよね・・・ >>>> ※まだ、kai_option を使っているのですが、これは後で別途相談を・・・ >>>> >>>> この状態で、kai_memcache を途中まで修正してみたのですが >>>> put クエリ対応がカオスになってしまいました。 >>>> --- >>>> handle_call(Data, [{packet, line}] = State) -> >>>> dispatch(string:tokens(binary_to_list(Data), " \r\n"), State). >>>> >>>> dispatch(["set", Key, Flags, "0", Bytes], [{packet, line}] = State) -> >>>> { >>>> setopts, >>>> [{packet, raw}], >>>> Bytes, >>>> [{packet, raw}, {state, Key, Flags}] >>>> }; >>>> dispatch(["set", Key, Flags, Exptime, Bytes], [{packet, line}] = State) -> >>>> {reply, "CLIENT_ERROR Exptime must be zero.\r\n", State}. >>>> >>>> handle_call(Value, [{packet, raw}, {state, Key, Flags}] = State) -> >>>> Data = #data{key=Key, flags=Flags, value=Value}, >>>> case kai_coordinator:route({put, Data}) of >>>> ok -> >>>> {reply, <<"STORED\r\n">>, State}; >>>> _Other -> >>>> send_error_and_close("Failed to read.", State) >>>> end. >>>> --- >>>> 作りかけなので、上記は、下記のようなバグを持っています。 >>>> ・<<"STORED\r\n">> した後に {packet, line} に戻していない >>>> ・Value の後に続く、<<"\r\n">> を受信しきっていない >>>> >>>> で、今後の対応として、下記の三つを考えております。 >>>> 1.このまま続ける。 >>>> Mod:handle_call/2 に gen_tcp:send しつつ inet:setopts するモードを追加すれば >>>> このままいけそうな気がしています。カオスですが・・・。 >>>> >>>> 2.Mod:handle_call に Socket を渡してしまう。 >>>> {packet, line} だけ、kai_tcp_server に任せ、複雑な事は Mod で行ってしまおうかと。 >>>> 個人的には、これが一番良いかな?と思っています。 >>>> >>>> 3.Mod に gen_tcp:recv や gen_tcp:send を完全に任せる。 >>>> http://d.hatena.ne.jp/cooldaemon/20080624/1214315157 >>>> これに近い感じです。(そのままは使いません) >>>> >>>> と言う事で、意見募集中です。 >>>> >>>> 2008/6/25 Takeru INOUE <tak...@gm...>: >>>>>> では、諸々考慮しつつ、kai へ組み込んでみますね。 >>>>> >>>>> はい,ガンガン進めちゃってください. >>>>> >>>>>> 念のため、branch を作ります。 >>>>>> >>>>>> embed_tcp_server >>>>>> >>>>>> と言う branch で、如何でしょうか? >>>>> >>>>> それでもいいですし,kai/branches/cooldaemon/hoge/ >>>>> のようにアカウント名でディレクトリを掘ったほうが気楽であれば,こっちでもいいです. >>>>> >>>>> >>>>>> 2008/6/25 Takeru INOUE <tak...@gm...>: >>>>>>>> おー、この方が素敵ですね! >>>>>>>> tcp_server.erl 用に behaviour を作っても良いかもしれませんね。 >>>>>>> >>>>>>> Kai に限定されない,汎用モジュールっぽくていい感じです :-) >>>>>>> >>>>>>>> あと、kai の場合は、tcp_server.erl 二つ(api と memcache)起動する必要があるので >>>>>>>> supervisor 二重起動を許可しないといけませんね。 >>>>>>>> (確認とってませんが、確か、同名の supervisor は起動できないハズ) >>>>>>> >>>>>>> そんな制約があるかもなのですね. >>>>>>> >>>>>>>> そう言えば、TrapExit かどこかで >>>>>>>> application、supervisor、gen_server を >>>>>>>> 一ファイルに記述する方法が掲載されていました。 >>>>>>> >>>>>>> いろんな技があるのですねぇ. >>>>>>> 僕はそういうサイトを読み込めてないので,車輪の再発明をしてそうです.. >>>>>>> >>>>>>>> 今回の、tcp_server.erl は、supervisor と proc_lib が同居しているので >>>>>>>> module として持ち運びが簡単かなぁと思うのですが >>>>>>>> コード量によっては、分割した方が良い気もします。 >>>>>>>> (今回のファイルサイズであれば、分割は不要だと思います) >>>>>>> >>>>>>> 今回も迷ったのですが,何となく一つのファイルにまとめてみて,そのままにしてあります. >>>>>>> 書きやすさ・読みやすさに合わせて分割してしまってください. >>>>>>> >>>>>>>> 2008/6/25 Takeru INOUE <tak...@gm...>: >>>>>>>>>> http://d.hatena.ne.jp/cooldaemon/20071024/1193193093 >>>>>>>>>> ここの Server Design のアスキーアートをベースに話をします。 >>>>>>>>>> >>>>>>>>>> tcp_server_sup は、tcp_acceptor と tcp_client_sup を起動し監視下に置きます。 >>>>>>>>>> その際、tcp_acceptor を、最大接続数分 起動します。 >>>>>>>>> >>>>>>>>> これを読んで合点がいきました. >>>>>>>>> >>>>>>>>>> http://d.hatena.ne.jp/cooldaemon/20080624 >>>>>>>>>> こんな感じで、どうでしょうか? >>>>>>>>> >>>>>>>>> 素晴らしいです. >>>>>>>>> >>>>>>>>> せっかくなので,完全に OTP にしてみました. >>>>>>>>> 使いやすくなってるかは微妙.. >>>>>>>>> >>>>>>>>> たけまる / 続・Erlang で Apache worker MPM っぽいこと >>>>>>>>> http://teahut.sakura.ne.jp/b/2008-06-25-1.html >>>>>>>>> >>>>>>>>>> Mochiweb 方式より、accept 待ちプロセスを複数持つ方式の方が >>>>>>>>>> シンプルでコード量が少ないですねぇ >>>>>>>>> >>>>>>>>> そういう気がします. >>>>>>>>> 同時に accept できるというのは比較的新しい機能のようですね. >>>>>>>>> >>>>>>>>>> 2008/6/24 masahito ikuta <coo...@gm...>: >>>>>>>>>>>> 僕がイメージしていたのは,つねに一定数のプロセスを起動しておいて,暇なやつにリクエストを処理させる >>>>>>>>>>>> (暇やつがいなければリクエストを待たせておく) という振る舞いでした. >>>>>>>>>>> >>>>>>>>>>> メール&ブログのエントリを拝見致しましたが >>>>>>>>>>> たけまるさんと私の考え方は >>>>>>>>>>> 一致しているかなーと思います。 >>>>>>>>>>> ※私が勘違いしているかも? >>>>>>>>>>> >>>>>>>>>>>> cooldaemon さんの方法だと,プロセスの死活監視はできるのですが,プロセス数が一定ではないので,同時接続数を制限することはできません. >>>>>>>>>>> >>>>>>>>>>> Mochiweb もそうなのですが >>>>>>>>>>> accept した時点で、現在のプロセス数をインクリメントし >>>>>>>>>>> 最大接続数に達した時点で、accept を止めます。 >>>>>>>>>>> >>>>>>>>>>> プロセスが終了する度、EXIT メッセージが親に通達されるので >>>>>>>>>>> プロセス数をデクリメントします。 >>>>>>>>>>> (accept ループを抜けていた場合は、再開) >>>>>>>>>>> >>>>>>>>>>> なんとなくですが >>>>>>>>>>> 私は、accept するプロセスをプーリングする方式の方が >>>>>>>>>>> 速度が出そうな気がしますけれど。 >>>>>>>>>>> >>>>>>>>>>>> cooldaemon さんの方法は,プロセスを増やしながら生死を管理するための高度な方法です. >>>>>>>>>>> >>>>>>>>>>> ついでに、kai_api, kai_memcache のコードの共通化も可能です。 >>>>>>>>>>> >>>>>>>>>>> で、両者の良いとこ取りを出来ないかと思い >>>>>>>>>>> >>>>>>>>>>>>> spawn のコストが高くなった時点で >>>>>>>>>>>>> acceptor をプーリングしておく方式に切り替える事も >>>>>>>>>>>>> 検討材料として残しつつ、作業を進めます。 >>>>>>>>>>>>> >>>>>>>>>>>>> その場合は、tcp_client_sup がプロセスの死活監視を行う事になります。 >>>>>>>>>>>>> (名前は、kai_tcp_client_sup とかが良いでしょうか?) >>>>>>>>>>> >>>>>>>>>>> と書いたのですが、これの説明が悪いので、もう少しだけ補足を書かせて下さい。 >>>>>>>>>>> >>>>>>>>>>> http://d.hatena.ne.jp/cooldaemon/20071024/1193193093 >>>>>>>>>>> ここの Server Design のアスキーアートをベースに話をします。 >>>>>>>>>>> >>>>>>>>>>> tcp_server_sup は、tcp_acceptor と tcp_client_sup を起動し監視下に置きます。 >>>>>>>>>>> その際、tcp_acceptor を、最大接続数分 起動します。 >>>>>>>>>>> >>>>>>>>>>> 接続があると、tcp_acceptor は >>>>>>>>>>> tcp_client_sup に tcp_echo(kai_memcache) を起動しなさい!と >>>>>>>>>>> メッセージを送ります。 >>>>>>>>>>> >>>>>>>>>>> 接続時に spawn しているので tcp_acceptor を複数起動するメリットが >>>>>>>>>>> accept ループを出たり入ったりする処理を >>>>>>>>>>> 書かなくて良い点だけになってしまいますが・・・。 >>>>>>>>>>> (単一プロセスのループ処理を、複数プロセスに置き換えているところが >>>>>>>>>>> Erlang っぽくて萌えるのですがw;) >>>>>>>>>>> >>>>>>>>>>> 死活監視と接続最大数は別の話だとは思いつつも >>>>>>>>>>> proc_lib の下に proc_lib や普通のプロセス(?) を配置すると >>>>>>>>>>> OTP の恩恵を受けられないので、何とかならないかなぁと思ってます。 >>>>>>>>>>> >>>>>>>>>>>> これに懲りずにおつきあいくださいませ. >>>>>>>>>>> >>>>>>>>>>> いやー、こういう話がないと、開発してる気分になれない気が(w; >>>>>>>>>>> お気になさらずにー。 >>>>>>>>>>> >>>>>>>>>>> 2008/6/23 Takeru INOUE <tak...@gm...>: >>>>>>>>>>>> 井上 (たけまる) です. >>>>>>>>>>>> >>>>>>>>>>>> すいません,少し勘違いしていました. >>>>>>>>>>>> >>>>>>>>>>>> 今回やろうとしていたことは,同時接続数の制限です (という言い方をすれば誤解がなかったのか). >>>>>>>>>>>> よく考えれば, >>>>>>>>>>>> >>>>>>>>>>>> - プロセスの生死を管理すること >>>>>>>>>>>> - 同時接続数を制限すること >>>>>>>>>>>> >>>>>>>>>>>> これらは別の話ですね. >>>>>>>>>>>> >>>>>>>>>>>> 僕がイメージしていたのは,つねに一定数のプロセスを起動しておいて,暇なやつにリクエストを処理させる >>>>>>>>>>>> (暇やつがいなければリクエストを待たせておく) という振る舞いでした. >>>>>>>>>>>> cooldaemon さんの方法だと,プロセスの死活監視はできるのですが,プロセス数が一定ではないので,同時接続数を制限することはできません. >>>>>>>>>>>> >>>>>>>>>>>> cooldaemon さんの方法は,プロセスを増やしながら生死を管理するための高度な方法です. >>>>>>>>>>>> 今回の局面で使うには少し違うかも,という気がしています. >>>>>>>>>>>> 僕のイメージとは少し違ったのですが,有用な方法であることは間違いないので,どこかで役に立つと思います >>>>>>>>>>>> (まだ勘違いしてるかもしれないので,気づいた点がありましたら指摘してください><). >>>>>>>>>>>> >>>>>>>>>>>> 詳しくはブログに書きました. >>>>>>>>>>>> >>>>>>>>>>>> たけまる / Erlang で Apache worker MPM っぽいこと >>>>>>>>>>>> http://teahut.sakura.ne.jp/b/2008-06-23-1.html >>>>>>>>>>>> >>>>>>>>>>>> というわけで,混乱させてしまってすみません m(_ _)m >>>>>>>>>>>> これに懲りずにおつきあいくださいませ. >>>>>>>>>>>> >>>>>>>>>>>> >>>>>>>>>>>> 2008/6/23 masahito ikuta <coo...@gm...>: >>>>>>>>>>>>>> ただこの方法だと worker の生死管理を自分で書かないといけないので,cooldaemon さんの方法のがよさそうです. >>>>>>>>>>>>> >>>>>>>>>>>>> spawn のコストが高くなった時点で >>>>>>>>>>>>> acceptor をプーリングしておく方式に切り替える事も >>>>>>>>>>>>> 検討材料として残しつつ、作業を進めます。 >>>>>>>>>>>>> >>>>>>>>>>>>> その場合は、tcp_client_sup がプロセスの死活監視を行う事になります。 >>>>>>>>>>>>> (名前は、kai_tcp_client_sup とかが良いでしょうか?) >>>>>>>>>>>>> >>>>>>>>>>>>> 2008/6/23 Takeru INOUE <tak...@gm...>: >>>>>>>>>>>>>>>>>- kai_api, kai_memcache のプロセスプール >>>>>>>>>>>>>>>> >>>>>>>>>>>>>>>> こちらの作業内容を >>>>>>>>>>>>>>>> もう少し詳しく教えて頂いて宜しいでしょうか? >>>>>>>>>>>>>>>> (何となく、参加できそうな気がしたので・・・) >>>>>>>>>>>>>>> >>>>>>>>>>>>>>> http://d.hatena.ne.jp/cooldaemon/20071024/1193193093 >>>>>>>>>>>>>>> ↑この仕組みで汎用化してしまい >>>>>>>>>>>>>>> tcp_acceptor の箇所で接続数の制限を行うのは >>>>>>>>>>>>>>> 如何でしょうか? >>>>>>>>>>>>>> >>>>>>>>>>>>>> はい,そんな感じです. >>>>>>>>>>>>>> >>>>>>>>>>>>>> やろうとしていることは,『プログラミングErlang』14.1 の最後に書いてあることそのままです. >>>>>>>>>>>>>> >>>>>>>>>>>>>> | Erlang バージョン R11B-3 では,1つの待ち受け用ソケットに >>>>>>>>>>>>>> | 対して複数の Erlang プロセスが gen_tcp:accept/1 を呼び出すことが >>>>>>>>>>>>>> | できる.この機能を利用すれば,前もって生成しておいたプロセスのプー >>>>>>>>>>>>>> | ルを用意しておいて,その各プロセスを gen_tcp:accept/1 で接続待ち >>>>>>>>>>>>>> | 状態にしておくことができるので,並列サーバを作るのが簡単になる.(p.207) >>>>>>>>>>>>>> >>>>>>>>>>>>>> 僕がどうするつもりだったかというと,わりと適当にしか考えてなくて,『プログラミングErlang』付録D に出てくる lib_chan_cs >>>>>>>>>>>>>> のように,accept 待ちのプロセスを指定した数だけ spawn しておけばいいかなくらいに思ってました. >>>>>>>>>>>>>> >>>>>>>>>>>>>> possibly_start_another(false, Listen, Active, Fun, max) -> >>>>>>>>>>>>>> case length(Active) of >>>>>>>>>>>>>> N when N < Max -> % worker 数が Max 未満なら >>>>>>>>>>>>>> New = start_accept(Listen, Fun), % accept 待ちプロセスを起動 >>>>>>>>>>>>>> >>>>>>>>>>>>>> ただこの方法だと worker の生死管理を自分で書かないといけないので,cooldaemon さんの方法のがよさそうです. >>>>>>>>>>>>>> というわけで,いけそうなら sourceforge の tracker で自分にアサインしちゃってください. >>>>>>>>>>>>>> kai_api と kai_memcache がありますが,kai_memcache のほうがデバッグしやすい気がします. >>>>>>>>>>>>>> >>>>>>>>>>>>>> ちなみに,プロセスプールを TODO に入れた理由は次のとおりです. >>>>>>>>>>>>>> いまの Kai は,毎秒数百リクエストを送りつけると負荷が高くなって,メンバシップの管理ができなくなり,クラスタが分解してしまいます. >>>>>>>>>>>>>> これを回避できるとしたら,API の受け付け数を制限するしかないかなと. >>>>>>>>>>>>>> 『プログラミングErlang』でも,この機能をトラフィックシェーピング (流量制御) と読んでますね. >>>>>>>>>>>>>> >>>>>>>>>>>>>> >>>>>>>>>>>>>>> 2008/6/23 masahito ikuta <coo...@gm...>: >>>>>>>>>>>>>>>> cooldaemon です。 >>>>>>>>>>>>>>>> >>>>>>>>>>>>>>>>>- kai_api, kai_memcache のプロセスプール >>>>>>>>>>>>>>>> >>>>>>>>>>>>>>>> こちらの作業内容を >>>>>>>>>>>>>>>> もう少し詳しく教えて頂いて宜しいでしょうか? >>>>>>>>>>>>>>>> (何となく、参加できそうな気がしたので・・・) >>>>>>>>>>>>>>>> >>>>>>>>>>>>>>>>>チューニングの類 (特にトリッキーなコードを伴うもの) は後回しにしたいと思います. >>>>>>>>>>>>>>>> >>>>>>>>>>>>>>>> とても細かい話で申し訳ないのですが・・・ >>>>>>>>>>>>>>>> 現在、make すると src ディレクトリ配下に beam ファイルが出来てしまうので >>>>>>>>>>>>>>>> OTP っぽく ebin ディレクトリ配下に配置したいと思いますが、如何でしょうか? >>>>>>>>>>>>>>>> (autotools に対応する気力は無いのですが orz) >>>>>>>>>>>>>>>> >>>>>>>>>>>>>>>> >>>>>>>>>>>>>>>> 2008/6/22 Takeru INOUE <tak...@gm...>: >>>>>>>>>>>>>>>>> 井上 (たけまる) です. >>>>>>>>>>>>>>>>> >>>>>>>>>>>>>>>>> 6/19 にこのメールを送ったのですが,sourceforge の作業中だったから送られてないようなので (archive に表示されない),再送します. >>>>>>>>>>>>>>>>> >>>>>>>>>>>>>>>>> >>>>>>>>>>>>>>>>> ---------- Forwarded message ---------- >>>>>>>>>>>>>>>>> From: Takeru INOUE <tak...@gm...> >>>>>>>>>>>>>>>>> Date: 2008/6/19 >>>>>>>>>>>>>>>>> Subject: 開発の進め方 >>>>>>>>>>>>>>>>> To: kai...@li... >>>>>>>>>>>>>>>>> >>>>>>>>>>>>>>>>> >>>>>>>>>>>>>>>>> 井上 (たけまる) です. >>>>>>>>>>>>>>>>> >>>>>>>>>>>>>>>>> きのうは勉強会に参加いただきありがとうございました. >>>>>>>>>>>>>>>>> お陰様で,面白い会になったと思います. >>>>>>>>>>>>>>>>> >>>>>>>>>>>>>>>>> さて,開発の進め方についてです. >>>>>>>>>>>>>>>>> >>>>>>>>>>>>>>>>> まず,発表で言ったように,kai_memcache から coordinator の機能を分離しておきます. >>>>>>>>>>>>>>>>> また,kai_version という空のモジュールを作っておきます. >>>>>>>>>>>>>>>>> これで,基本的なモジュール構成が固まるので,開発しやすくなると思います. >>>>>>>>>>>>>>>>> >>>>>>>>>>>>>>>>> 次に,実装の順序についてです. >>>>>>>>>>>>>>>>> >>>>>>>>>>>>>>>>> 基本的には好きなところから実装してもらって構わないと思うのですが,次のようなのが他の部分への影響が少なく取りかかりやすいでしょうか (面白みも少ないけど). >>>>>>>>>>>>>>>>> >>>>>>>>>>>>>>>>> - ./configure >>>>>>>>>>>>>>>>> - test_server >>>>>>>>>>>>>>>>> - kai_store の永続化 >>>>>>>>>>>>>>>>> - kai_api, kai_memcache のプロセスプール >>>>>>>>>>>>>>>>> >>>>>>>>>>>>>>>>> チューニングの類 (特にトリッキーなコードを伴うもの) は後回しにしたいと思います. >>>>>>>>>>>>>>>>> >>>>>>>>>>>>>>>>> コミッタは 5-10名と多くないので,管理はゆるめで進めたいです. >>>>>>>>>>>>>>>>> 早い者勝ちで手を挙げた人が実装してみて,行き詰まったら ML などでヘルプを求めるというのでいいかなぁ. >>>>>>>>>>>>>>>>> 誰が取り組んでいるかを知るために,sourceforge の Tracker を使うべきかなぁ. >>>>>>>>>>>>>>>>> 適当にブランチを切って自由に進めてもらって,落ち着いたところで merge するというので大丈夫だろうか. >>>>>>>>>>>>>>>>> モジュールのインタフェースが変更されるときは気をつけないといけないけど (merge は僕がやったほうがいいのかも). >>>>>>>>>>>>>>>>> >>>>>>>>>>>>>>>>> といったあたりについて意見を聞かせてください. >>>>>>>>>>>>>>>>> >>>>>>>>>>>>>>>>> # こういった開発者のための意識合わせ的なことは,Wiki にまとめて後で周知します. >>>>>>>>>>>>>>>>> >>>>>>>>>>>>>>>>> # うまく回り始めたら,僕は全体のコーディネートにまわるつもりです. >>>>>>>>>>>>>>>>> >>>>>>>>>>>>>>>>> -- >>>>>>>>>>>>>>>>> Takeru INOUE <tak...@gm...> >>>>>>>>>>>>>>>>> >>>>>>>>>>>>>>>>> ------------------------------------------------------------------------- >>>>>>>>>>>>>>>>> Check out the new SourceForge.net Marketplace. >>>>>>>>>>>>>>>>> It's the best place to buy or sell services for >>>>>>>>>>>>>>>>> just about anything Open Source. >>>>>>>>>>>>>>>>> http://sourceforge.net/services/buy/index.php >>>>>>>>>>>>>>>>> _______________________________________________ >>>>>>>>>>>>>>>>> Kai-devel-ja mailing list >>>>>>>>>>>>>>>>> Kai...@li... >>>>>>>>>>>>>>>>> https://lists.sourceforge.net/lists/listinfo/kai-devel-ja >>>>>>>>>>>>>>>>> >>>>>>>>>>>>>>>> >>>>>>>>>>>>>>>> >>>>>>>>>>>>>>>> >>>>>>>>>>>>>>>> -- >>>>>>>>>>>>>>>> cooldaemon >>>>>>>>>>>>>>>> >>>>>>>>>>>>>>> >>>>>>>>>>>>>>> >>>>>>>>>>>>>>> >>>>>>>>>>>>>>> -- >>>>>>>>>>>>>>> cooldaemon >>>>>>>>>>>>>>> >>>>>>>>>>>>>> >>>>>>>>>>>>>> >>>>>>>>>>>>>> >>>>>>>>>>>>>> -- >>>>>>>>>>>>>> Takeru INOUE <tak...@gm...> >>>>>>>>>>>>>> >>>>>>>>>>>>> >>>>>>>>>>>>> >>>>>>>>>>>>> >>>>>>>>>>>>> -- >>>>>>>>>>>>> cooldaemon >>>>>>>>>>>>> >>>>>>>>>>>> >>>>>>>>>>>> >>>>>>>>>>>> >>>>>>>>>>>> -- >>>>>>>>>>>> Takeru INOUE <tak...@gm...> >>>>>>>>>>>> >>>>>>>>>>> >>>>>>>>>>> >>>>>>>>>>> >>>>>>>>>>> -- >>>>>>>>>>> cooldaemon >>>>>>>>>>> >>>>>>>>>>> ------------------------------------------------------------------------- >>>>>>>>>>> Check out the new SourceForge.net Marketplace. >>>>>>>>>>> It's the best place to buy or sell services for >>>>>>>>>>> just about anything Open Source. >>>>>>>>>>> http://sourceforge.net/services/buy/index.php >>>>>>>>>>> _______________________________________________ >>>>>>>>>>> Kai-devel-ja mailing list >>>>>>>>>>> Kai...@li... >>>>>>>>>>> https://lists.sourceforge.net/lists/listinfo/kai-devel-ja >>>>>>>>>>> >>>>>>>>>> >>>>>>>>>> >>>>>>>>>> >>>>>>>>>> -- >>>>>>>>>> cooldaemon >>>>>>>>>> >>>>>>>>> >>>>>>>>> >>>>>>>>> >>>>>>>>> -- >>>>>>>>> Takeru INOUE <tak...@gm...> >>>>>>>>> >>>>>>>> >>>>>>>> >>>>>>>> >>>>>>>> -- >>>>>>>> cooldaemon >>>>>>>> >>>>>>> >>>>>>> >>>>>>> >>>>>>> -- >>>>>>> Takeru INOUE <tak...@gm...> >>>>>>> >>>>>> >>>>>> >>>>>> >>>>>> -- >>>>>> cooldaemon >>>>>> >>>>> >>>>> >>>>> >>>>> -- >>>>> Takeru INOUE <tak...@gm...> >>>>> >>>> >>>> >>>> >>>> -- >>>> cooldaemon >>>> >>> >>> >>> >>> -- >>> Takeru INOUE <tak...@gm...> >>> >> >> >> >> -- >> cooldaemon >> > > > > -- > Takeru INOUE <tak...@gm...> > -- cooldaemon |
From: Takeru I. <tak...@gm...> - 2008-07-06 14:04:53
|
おつかれさまでした. まだソースは見切れてないのですが,動かしてみていくつか気になった点があったので,とりあえず報告します. 動作環境は,R12B-0 (macports) と R12B-3 です. ■ typo in kai.config kai.config に "," 抜けがありました. --- kai.config (revision 372) +++ kai.config (local) @@ -1,7 +1,7 @@ [{kai, [%{logfile, "kai.log"}, %{hostname, "localhost"}, {port, 11011}, - {max_connections, 30} + {max_connections, 30}, {memcache_port, 11211}, {memcache_max_connections, 30}, {n, 3}, ■ 起動エラー Getting Started http://kai.wiki.sourceforge.net/getting+started の手順に従ってスタンドアローンとして起動すると,次のエラーが出るようです. % erl -pa ebin -config kai -kai n 1 -kai r 1 -kai w 1 1> application:load(kai). 2> application:start(kai). 2008-07-06 22:33:35.298615 [info] ./kai_hash.erl:162: {update, [{{{192,168,1,225}, 11011}, [{number_of_virtual_nodes, 128}]}], []} =INFO REPORT==== 6-Jul-2008::22:33:35 === application: kai exited: {shutdown,{kai,start,[normal,[]]}} type: temporary {error,{shutdown,{kai,start,[normal,[]]}}} ■ max_connections のデフォルト値 max_connections と memcache_max_connections のデフォルト値ですが,memcach API に対して 1 つのリクエストが来ると,内部 API には N のリクエストが飛び交うことになります.これだけ考えると,max_connections : memcache_max_connections = N:1 (たとえば 30:10) とかがいいのかなと思います. 一方で,memcache API は内部 API の処理が終わるのを待つことになります.つまり,memcache API のほうが内部 API より処理時間が長くなります.これを考えると,30:15 のように memcach API の値を大きくしたほうがいいのかなと思います. さらに,内部 API は,memcache API だけでなくタイマから呼ばれることもあります.たとえば,定期的な bucket 同期などです.これを考えると,40:15 のように内部 API 野間対を大きくしたほうがいいのかなと思います. まぁ,いろいろと考えてみましたが,実際のところは実験してみないとよく分からないので,N:1 (30:10 とか) くらいが妥当かなと. あと,src/kai.app.src と kai.config で値を変えているのには意図があります? 2008/7/6 masahito ikuta <coo...@gm...>: > 一通り実装が終わったのでご報告申し上げます。 > http://kai.svn.sourceforge.net/viewvc/kai/branches/cooldaemon_embed_tcp_server/ > たけまるさん OK を頂ければ本体に merge します。 > > ▼kai_tcp_server について > たけまるさん日記バージョンに下記の修正を入れました。 > ・behaviour 化 > ・Mod:handle_call に Socket を渡す > ・{active, true} で listen 可能 > > ▼テストについて > ・make test 時に ./ebin を参照 > > ・Coverage Analysis 対応の為、test/kai.coverspec 追加 > 現状、kai_tcp_server, kai_api, kai_memcache を直書きしています。 > 後で、make test コマンドで Makefile 内の SOURCES から生成したいと考えております。 > make に詳しい方のご助言希望。 > > ・Coverage Analysis 対応の為、make 時に +debug_info を付加 > make test を実行しない場合であっても、強制的に erlc +debug_info になります。 > これも、make に詳しい方のご助言希望。 > > ▼現状、認識している残作業 > テストの Coverage を上げる。 > > 以上です。 > > 2008/7/1 Takeru INOUE <tak...@gm...>: >> {packet, line} とかのことはまったく気にしてませんでした.. >> >>> 2.Mod:handle_call に Socket を渡してしまう。 >>> {packet, line} だけ、kai_tcp_server に任せ、複雑な事は Mod で行ってしまおうかと。 >>> 個人的には、これが一番良いかな?と思っています。 >> >> 僕も 2 が良いように思いました. >> {packet, line} に戻すことを指示するキレイな方法があるかなぁ. >> >>> 3.Mod に gen_tcp:recv や gen_tcp:send を完全に任せる。 >>> http://d.hatena.ne.jp/cooldaemon/20080624/1214315157 >>> これに近い感じです。(そのままは使いません) >> >> あんまり複雑になるようなら 3 にしてしまったほうがいいのかもしれないですね. >> >> >> 2008/7/1 masahito ikuta <coo...@gm...>: >>> 自分の才能の無さに絶望したので、お知恵を拝借させて下さい orz >>> >>> 下記、kai_tcp_server のコード片です。 >>> --- >>> acceptor_loop(Socket, State, Mod, Option) -> >>> case gen_tcp:recv( >>> Socket, Option:get(recv_length), Option:get(recv_timeout) >>> ) of >>> {ok, Data} -> >>> case Mod:handle_call(Data, State) of >>> {reply, DataToSend, State} -> >>> gen_tcp:send(Socket, DataToSend), >>> acceptor_loop(Socket, State, Mod, Option); >>> {noreply, State} -> >>> acceptor_loop(Socket, State, Mod, Option); >>> {setopts, SocketOptions, RecvLength, State} -> >>> inet:setopts(Socket, SocketOptions), >>> NewOption = kai_option:new( >>> [ >>> {recv_length, RecvLength}, >>> {recv_timeout, Option:get(recv_timeout)} >>> ], >>> ?DEFAULT_OPT_PROP >>> ), >>> acceptor_loop(Socket, State, Mod, NewOption); >>> {close, DataToSend, State} -> >>> gen_tcp:send(Socket, DataToSend), >>> gen_tcp:close(Socket); >>> _Error -> >>> gen_tcp:close(Socket) >>> end; >>> {error, Reason} -> >>> exit({error, Reason}) >>> end. >>> --- >>> たけまるさん版に改良を加え >>> Mod:handle_call/2 に {setopts, SocketOptions, RecvLength, State} という戻り値を加えてみました。 >>> こうする事で、{packet, line} <-> {packet, raw} のオプション変更に対応しています。 >>> >>> ※RecvLength あたりが美しくないですよね・・・ >>> ※まだ、kai_option を使っているのですが、これは後で別途相談を・・・ >>> >>> この状態で、kai_memcache を途中まで修正してみたのですが >>> put クエリ対応がカオスになってしまいました。 >>> --- >>> handle_call(Data, [{packet, line}] = State) -> >>> dispatch(string:tokens(binary_to_list(Data), " \r\n"), State). >>> >>> dispatch(["set", Key, Flags, "0", Bytes], [{packet, line}] = State) -> >>> { >>> setopts, >>> [{packet, raw}], >>> Bytes, >>> [{packet, raw}, {state, Key, Flags}] >>> }; >>> dispatch(["set", Key, Flags, Exptime, Bytes], [{packet, line}] = State) -> >>> {reply, "CLIENT_ERROR Exptime must be zero.\r\n", State}. >>> >>> handle_call(Value, [{packet, raw}, {state, Key, Flags}] = State) -> >>> Data = #data{key=Key, flags=Flags, value=Value}, >>> case kai_coordinator:route({put, Data}) of >>> ok -> >>> {reply, <<"STORED\r\n">>, State}; >>> _Other -> >>> send_error_and_close("Failed to read.", State) >>> end. >>> --- >>> 作りかけなので、上記は、下記のようなバグを持っています。 >>> ・<<"STORED\r\n">> した後に {packet, line} に戻していない >>> ・Value の後に続く、<<"\r\n">> を受信しきっていない >>> >>> で、今後の対応として、下記の三つを考えております。 >>> 1.このまま続ける。 >>> Mod:handle_call/2 に gen_tcp:send しつつ inet:setopts するモードを追加すれば >>> このままいけそうな気がしています。カオスですが・・・。 >>> >>> 2.Mod:handle_call に Socket を渡してしまう。 >>> {packet, line} だけ、kai_tcp_server に任せ、複雑な事は Mod で行ってしまおうかと。 >>> 個人的には、これが一番良いかな?と思っています。 >>> >>> 3.Mod に gen_tcp:recv や gen_tcp:send を完全に任せる。 >>> http://d.hatena.ne.jp/cooldaemon/20080624/1214315157 >>> これに近い感じです。(そのままは使いません) >>> >>> と言う事で、意見募集中です。 >>> >>> 2008/6/25 Takeru INOUE <tak...@gm...>: >>>>> では、諸々考慮しつつ、kai へ組み込んでみますね。 >>>> >>>> はい,ガンガン進めちゃってください. >>>> >>>>> 念のため、branch を作ります。 >>>>> >>>>> embed_tcp_server >>>>> >>>>> と言う branch で、如何でしょうか? >>>> >>>> それでもいいですし,kai/branches/cooldaemon/hoge/ >>>> のようにアカウント名でディレクトリを掘ったほうが気楽であれば,こっちでもいいです. >>>> >>>> >>>>> 2008/6/25 Takeru INOUE <tak...@gm...>: >>>>>>> おー、この方が素敵ですね! >>>>>>> tcp_server.erl 用に behaviour を作っても良いかもしれませんね。 >>>>>> >>>>>> Kai に限定されない,汎用モジュールっぽくていい感じです :-) >>>>>> >>>>>>> あと、kai の場合は、tcp_server.erl 二つ(api と memcache)起動する必要があるので >>>>>>> supervisor 二重起動を許可しないといけませんね。 >>>>>>> (確認とってませんが、確か、同名の supervisor は起動できないハズ) >>>>>> >>>>>> そんな制約があるかもなのですね. >>>>>> >>>>>>> そう言えば、TrapExit かどこかで >>>>>>> application、supervisor、gen_server を >>>>>>> 一ファイルに記述する方法が掲載されていました。 >>>>>> >>>>>> いろんな技があるのですねぇ. >>>>>> 僕はそういうサイトを読み込めてないので,車輪の再発明をしてそうです.. >>>>>> >>>>>>> 今回の、tcp_server.erl は、supervisor と proc_lib が同居しているので >>>>>>> module として持ち運びが簡単かなぁと思うのですが >>>>>>> コード量によっては、分割した方が良い気もします。 >>>>>>> (今回のファイルサイズであれば、分割は不要だと思います) >>>>>> >>>>>> 今回も迷ったのですが,何となく一つのファイルにまとめてみて,そのままにしてあります. >>>>>> 書きやすさ・読みやすさに合わせて分割してしまってください. >>>>>> >>>>>>> 2008/6/25 Takeru INOUE <tak...@gm...>: >>>>>>>>> http://d.hatena.ne.jp/cooldaemon/20071024/1193193093 >>>>>>>>> ここの Server Design のアスキーアートをベースに話をします。 >>>>>>>>> >>>>>>>>> tcp_server_sup は、tcp_acceptor と tcp_client_sup を起動し監視下に置きます。 >>>>>>>>> その際、tcp_acceptor を、最大接続数分 起動します。 >>>>>>>> >>>>>>>> これを読んで合点がいきました. >>>>>>>> >>>>>>>>> http://d.hatena.ne.jp/cooldaemon/20080624 >>>>>>>>> こんな感じで、どうでしょうか? >>>>>>>> >>>>>>>> 素晴らしいです. >>>>>>>> >>>>>>>> せっかくなので,完全に OTP にしてみました. >>>>>>>> 使いやすくなってるかは微妙.. >>>>>>>> >>>>>>>> たけまる / 続・Erlang で Apache worker MPM っぽいこと >>>>>>>> http://teahut.sakura.ne.jp/b/2008-06-25-1.html >>>>>>>> >>>>>>>>> Mochiweb 方式より、accept 待ちプロセスを複数持つ方式の方が >>>>>>>>> シンプルでコード量が少ないですねぇ >>>>>>>> >>>>>>>> そういう気がします. >>>>>>>> 同時に accept できるというのは比較的新しい機能のようですね. >>>>>>>> >>>>>>>>> 2008/6/24 masahito ikuta <coo...@gm...>: >>>>>>>>>>> 僕がイメージしていたのは,つねに一定数のプロセスを起動しておいて,暇なやつにリクエストを処理させる >>>>>>>>>>> (暇やつがいなければリクエストを待たせておく) という振る舞いでした. >>>>>>>>>> >>>>>>>>>> メール&ブログのエントリを拝見致しましたが >>>>>>>>>> たけまるさんと私の考え方は >>>>>>>>>> 一致しているかなーと思います。 >>>>>>>>>> ※私が勘違いしているかも? >>>>>>>>>> >>>>>>>>>>> cooldaemon さんの方法だと,プロセスの死活監視はできるのですが,プロセス数が一定ではないので,同時接続数を制限することはできません. >>>>>>>>>> >>>>>>>>>> Mochiweb もそうなのですが >>>>>>>>>> accept した時点で、現在のプロセス数をインクリメントし >>>>>>>>>> 最大接続数に達した時点で、accept を止めます。 >>>>>>>>>> >>>>>>>>>> プロセスが終了する度、EXIT メッセージが親に通達されるので >>>>>>>>>> プロセス数をデクリメントします。 >>>>>>>>>> (accept ループを抜けていた場合は、再開) >>>>>>>>>> >>>>>>>>>> なんとなくですが >>>>>>>>>> 私は、accept するプロセスをプーリングする方式の方が >>>>>>>>>> 速度が出そうな気がしますけれど。 >>>>>>>>>> >>>>>>>>>>> cooldaemon さんの方法は,プロセスを増やしながら生死を管理するための高度な方法です. >>>>>>>>>> >>>>>>>>>> ついでに、kai_api, kai_memcache のコードの共通化も可能です。 >>>>>>>>>> >>>>>>>>>> で、両者の良いとこ取りを出来ないかと思い >>>>>>>>>> >>>>>>>>>>>> spawn のコストが高くなった時点で >>>>>>>>>>>> acceptor をプーリングしておく方式に切り替える事も >>>>>>>>>>>> 検討材料として残しつつ、作業を進めます。 >>>>>>>>>>>> >>>>>>>>>>>> その場合は、tcp_client_sup がプロセスの死活監視を行う事になります。 >>>>>>>>>>>> (名前は、kai_tcp_client_sup とかが良いでしょうか?) >>>>>>>>>> >>>>>>>>>> と書いたのですが、これの説明が悪いので、もう少しだけ補足を書かせて下さい。 >>>>>>>>>> >>>>>>>>>> http://d.hatena.ne.jp/cooldaemon/20071024/1193193093 >>>>>>>>>> ここの Server Design のアスキーアートをベースに話をします。 >>>>>>>>>> >>>>>>>>>> tcp_server_sup は、tcp_acceptor と tcp_client_sup を起動し監視下に置きます。 >>>>>>>>>> その際、tcp_acceptor を、最大接続数分 起動します。 >>>>>>>>>> >>>>>>>>>> 接続があると、tcp_acceptor は >>>>>>>>>> tcp_client_sup に tcp_echo(kai_memcache) を起動しなさい!と >>>>>>>>>> メッセージを送ります。 >>>>>>>>>> >>>>>>>>>> 接続時に spawn しているので tcp_acceptor を複数起動するメリットが >>>>>>>>>> accept ループを出たり入ったりする処理を >>>>>>>>>> 書かなくて良い点だけになってしまいますが・・・。 >>>>>>>>>> (単一プロセスのループ処理を、複数プロセスに置き換えているところが >>>>>>>>>> Erlang っぽくて萌えるのですがw;) >>>>>>>>>> >>>>>>>>>> 死活監視と接続最大数は別の話だとは思いつつも >>>>>>>>>> proc_lib の下に proc_lib や普通のプロセス(?) を配置すると >>>>>>>>>> OTP の恩恵を受けられないので、何とかならないかなぁと思ってます。 >>>>>>>>>> >>>>>>>>>>> これに懲りずにおつきあいくださいませ. >>>>>>>>>> >>>>>>>>>> いやー、こういう話がないと、開発してる気分になれない気が(w; >>>>>>>>>> お気になさらずにー。 >>>>>>>>>> >>>>>>>>>> 2008/6/23 Takeru INOUE <tak...@gm...>: >>>>>>>>>>> 井上 (たけまる) です. >>>>>>>>>>> >>>>>>>>>>> すいません,少し勘違いしていました. >>>>>>>>>>> >>>>>>>>>>> 今回やろうとしていたことは,同時接続数の制限です (という言い方をすれば誤解がなかったのか). >>>>>>>>>>> よく考えれば, >>>>>>>>>>> >>>>>>>>>>> - プロセスの生死を管理すること >>>>>>>>>>> - 同時接続数を制限すること >>>>>>>>>>> >>>>>>>>>>> これらは別の話ですね. >>>>>>>>>>> >>>>>>>>>>> 僕がイメージしていたのは,つねに一定数のプロセスを起動しておいて,暇なやつにリクエストを処理させる >>>>>>>>>>> (暇やつがいなければリクエストを待たせておく) という振る舞いでした. >>>>>>>>>>> cooldaemon さんの方法だと,プロセスの死活監視はできるのですが,プロセス数が一定ではないので,同時接続数を制限することはできません. >>>>>>>>>>> >>>>>>>>>>> cooldaemon さんの方法は,プロセスを増やしながら生死を管理するための高度な方法です. >>>>>>>>>>> 今回の局面で使うには少し違うかも,という気がしています. >>>>>>>>>>> 僕のイメージとは少し違ったのですが,有用な方法であることは間違いないので,どこかで役に立つと思います >>>>>>>>>>> (まだ勘違いしてるかもしれないので,気づいた点がありましたら指摘してください><). >>>>>>>>>>> >>>>>>>>>>> 詳しくはブログに書きました. >>>>>>>>>>> >>>>>>>>>>> たけまる / Erlang で Apache worker MPM っぽいこと >>>>>>>>>>> http://teahut.sakura.ne.jp/b/2008-06-23-1.html >>>>>>>>>>> >>>>>>>>>>> というわけで,混乱させてしまってすみません m(_ _)m >>>>>>>>>>> これに懲りずにおつきあいくださいませ. >>>>>>>>>>> >>>>>>>>>>> >>>>>>>>>>> 2008/6/23 masahito ikuta <coo...@gm...>: >>>>>>>>>>>>> ただこの方法だと worker の生死管理を自分で書かないといけないので,cooldaemon さんの方法のがよさそうです. >>>>>>>>>>>> >>>>>>>>>>>> spawn のコストが高くなった時点で >>>>>>>>>>>> acceptor をプーリングしておく方式に切り替える事も >>>>>>>>>>>> 検討材料として残しつつ、作業を進めます。 >>>>>>>>>>>> >>>>>>>>>>>> その場合は、tcp_client_sup がプロセスの死活監視を行う事になります。 >>>>>>>>>>>> (名前は、kai_tcp_client_sup とかが良いでしょうか?) >>>>>>>>>>>> >>>>>>>>>>>> 2008/6/23 Takeru INOUE <tak...@gm...>: >>>>>>>>>>>>>>>>- kai_api, kai_memcache のプロセスプール >>>>>>>>>>>>>>> >>>>>>>>>>>>>>> こちらの作業内容を >>>>>>>>>>>>>>> もう少し詳しく教えて頂いて宜しいでしょうか? >>>>>>>>>>>>>>> (何となく、参加できそうな気がしたので・・・) >>>>>>>>>>>>>> >>>>>>>>>>>>>> http://d.hatena.ne.jp/cooldaemon/20071024/1193193093 >>>>>>>>>>>>>> ↑この仕組みで汎用化してしまい >>>>>>>>>>>>>> tcp_acceptor の箇所で接続数の制限を行うのは >>>>>>>>>>>>>> 如何でしょうか? >>>>>>>>>>>>> >>>>>>>>>>>>> はい,そんな感じです. >>>>>>>>>>>>> >>>>>>>>>>>>> やろうとしていることは,『プログラミングErlang』14.1 の最後に書いてあることそのままです. >>>>>>>>>>>>> >>>>>>>>>>>>> | Erlang バージョン R11B-3 では,1つの待ち受け用ソケットに >>>>>>>>>>>>> | 対して複数の Erlang プロセスが gen_tcp:accept/1 を呼び出すことが >>>>>>>>>>>>> | できる.この機能を利用すれば,前もって生成しておいたプロセスのプー >>>>>>>>>>>>> | ルを用意しておいて,その各プロセスを gen_tcp:accept/1 で接続待ち >>>>>>>>>>>>> | 状態にしておくことができるので,並列サーバを作るのが簡単になる.(p.207) >>>>>>>>>>>>> >>>>>>>>>>>>> 僕がどうするつもりだったかというと,わりと適当にしか考えてなくて,『プログラミングErlang』付録D に出てくる lib_chan_cs >>>>>>>>>>>>> のように,accept 待ちのプロセスを指定した数だけ spawn しておけばいいかなくらいに思ってました. >>>>>>>>>>>>> >>>>>>>>>>>>> possibly_start_another(false, Listen, Active, Fun, max) -> >>>>>>>>>>>>> case length(Active) of >>>>>>>>>>>>> N when N < Max -> % worker 数が Max 未満なら >>>>>>>>>>>>> New = start_accept(Listen, Fun), % accept 待ちプロセスを起動 >>>>>>>>>>>>> >>>>>>>>>>>>> ただこの方法だと worker の生死管理を自分で書かないといけないので,cooldaemon さんの方法のがよさそうです. >>>>>>>>>>>>> というわけで,いけそうなら sourceforge の tracker で自分にアサインしちゃってください. >>>>>>>>>>>>> kai_api と kai_memcache がありますが,kai_memcache のほうがデバッグしやすい気がします. >>>>>>>>>>>>> >>>>>>>>>>>>> ちなみに,プロセスプールを TODO に入れた理由は次のとおりです. >>>>>>>>>>>>> いまの Kai は,毎秒数百リクエストを送りつけると負荷が高くなって,メンバシップの管理ができなくなり,クラスタが分解してしまいます. >>>>>>>>>>>>> これを回避できるとしたら,API の受け付け数を制限するしかないかなと. >>>>>>>>>>>>> 『プログラミングErlang』でも,この機能をトラフィックシェーピング (流量制御) と読んでますね. >>>>>>>>>>>>> >>>>>>>>>>>>> >>>>>>>>>>>>>> 2008/6/23 masahito ikuta <coo...@gm...>: >>>>>>>>>>>>>>> cooldaemon です。 >>>>>>>>>>>>>>> >>>>>>>>>>>>>>>>- kai_api, kai_memcache のプロセスプール >>>>>>>>>>>>>>> >>>>>>>>>>>>>>> こちらの作業内容を >>>>>>>>>>>>>>> もう少し詳しく教えて頂いて宜しいでしょうか? >>>>>>>>>>>>>>> (何となく、参加できそうな気がしたので・・・) >>>>>>>>>>>>>>> >>>>>>>>>>>>>>>>チューニングの類 (特にトリッキーなコードを伴うもの) は後回しにしたいと思います. >>>>>>>>>>>>>>> >>>>>>>>>>>>>>> とても細かい話で申し訳ないのですが・・・ >>>>>>>>>>>>>>> 現在、make すると src ディレクトリ配下に beam ファイルが出来てしまうので >>>>>>>>>>>>>>> OTP っぽく ebin ディレクトリ配下に配置したいと思いますが、如何でしょうか? >>>>>>>>>>>>>>> (autotools に対応する気力は無いのですが orz) >>>>>>>>>>>>>>> >>>>>>>>>>>>>>> >>>>>>>>>>>>>>> 2008/6/22 Takeru INOUE <tak...@gm...>: >>>>>>>>>>>>>>>> 井上 (たけまる) です. >>>>>>>>>>>>>>>> >>>>>>>>>>>>>>>> 6/19 にこのメールを送ったのですが,sourceforge の作業中だったから送られてないようなので (archive に表示されない),再送します. >>>>>>>>>>>>>>>> >>>>>>>>>>>>>>>> >>>>>>>>>>>>>>>> ---------- Forwarded message ---------- >>>>>>>>>>>>>>>> From: Takeru INOUE <tak...@gm...> >>>>>>>>>>>>>>>> Date: 2008/6/19 >>>>>>>>>>>>>>>> Subject: 開発の進め方 >>>>>>>>>>>>>>>> To: kai...@li... >>>>>>>>>>>>>>>> >>>>>>>>>>>>>>>> >>>>>>>>>>>>>>>> 井上 (たけまる) です. >>>>>>>>>>>>>>>> >>>>>>>>>>>>>>>> きのうは勉強会に参加いただきありがとうございました. >>>>>>>>>>>>>>>> お陰様で,面白い会になったと思います. >>>>>>>>>>>>>>>> >>>>>>>>>>>>>>>> さて,開発の進め方についてです. >>>>>>>>>>>>>>>> >>>>>>>>>>>>>>>> まず,発表で言ったように,kai_memcache から coordinator の機能を分離しておきます. >>>>>>>>>>>>>>>> また,kai_version という空のモジュールを作っておきます. >>>>>>>>>>>>>>>> これで,基本的なモジュール構成が固まるので,開発しやすくなると思います. >>>>>>>>>>>>>>>> >>>>>>>>>>>>>>>> 次に,実装の順序についてです. >>>>>>>>>>>>>>>> >>>>>>>>>>>>>>>> 基本的には好きなところから実装してもらって構わないと思うのですが,次のようなのが他の部分への影響が少なく取りかかりやすいでしょうか (面白みも少ないけど). >>>>>>>>>>>>>>>> >>>>>>>>>>>>>>>> - ./configure >>>>>>>>>>>>>>>> - test_server >>>>>>>>>>>>>>>> - kai_store の永続化 >>>>>>>>>>>>>>>> - kai_api, kai_memcache のプロセスプール >>>>>>>>>>>>>>>> >>>>>>>>>>>>>>>> チューニングの類 (特にトリッキーなコードを伴うもの) は後回しにしたいと思います. >>>>>>>>>>>>>>>> >>>>>>>>>>>>>>>> コミッタは 5-10名と多くないので,管理はゆるめで進めたいです. >>>>>>>>>>>>>>>> 早い者勝ちで手を挙げた人が実装してみて,行き詰まったら ML などでヘルプを求めるというのでいいかなぁ. >>>>>>>>>>>>>>>> 誰が取り組んでいるかを知るために,sourceforge の Tracker を使うべきかなぁ. >>>>>>>>>>>>>>>> 適当にブランチを切って自由に進めてもらって,落ち着いたところで merge するというので大丈夫だろうか. >>>>>>>>>>>>>>>> モジュールのインタフェースが変更されるときは気をつけないといけないけど (merge は僕がやったほうがいいのかも). >>>>>>>>>>>>>>>> >>>>>>>>>>>>>>>> といったあたりについて意見を聞かせてください. >>>>>>>>>>>>>>>> >>>>>>>>>>>>>>>> # こういった開発者のための意識合わせ的なことは,Wiki にまとめて後で周知します. >>>>>>>>>>>>>>>> >>>>>>>>>>>>>>>> # うまく回り始めたら,僕は全体のコーディネートにまわるつもりです. >>>>>>>>>>>>>>>> >>>>>>>>>>>>>>>> -- >>>>>>>>>>>>>>>> Takeru INOUE <tak...@gm...> >>>>>>>>>>>>>>>> >>>>>>>>>>>>>>>> ------------------------------------------------------------------------- >>>>>>>>>>>>>>>> Check out the new SourceForge.net Marketplace. >>>>>>>>>>>>>>>> It's the best place to buy or sell services for >>>>>>>>>>>>>>>> just about anything Open Source. >>>>>>>>>>>>>>>> http://sourceforge.net/services/buy/index.php >>>>>>>>>>>>>>>> _______________________________________________ >>>>>>>>>>>>>>>> Kai-devel-ja mailing list >>>>>>>>>>>>>>>> Kai...@li... >>>>>>>>>>>>>>>> https://lists.sourceforge.net/lists/listinfo/kai-devel-ja >>>>>>>>>>>>>>>> >>>>>>>>>>>>>>> >>>>>>>>>>>>>>> >>>>>>>>>>>>>>> >>>>>>>>>>>>>>> -- >>>>>>>>>>>>>>> cooldaemon >>>>>>>>>>>>>>> >>>>>>>>>>>>>> >>>>>>>>>>>>>> >>>>>>>>>>>>>> >>>>>>>>>>>>>> -- >>>>>>>>>>>>>> cooldaemon >>>>>>>>>>>>>> >>>>>>>>>>>>> >>>>>>>>>>>>> >>>>>>>>>>>>> >>>>>>>>>>>>> -- >>>>>>>>>>>>> Takeru INOUE <tak...@gm...> >>>>>>>>>>>>> >>>>>>>>>>>> >>>>>>>>>>>> >>>>>>>>>>>> >>>>>>>>>>>> -- >>>>>>>>>>>> cooldaemon >>>>>>>>>>>> >>>>>>>>>>> >>>>>>>>>>> >>>>>>>>>>> >>>>>>>>>>> -- >>>>>>>>>>> Takeru INOUE <tak...@gm...> >>>>>>>>>>> >>>>>>>>>> >>>>>>>>>> >>>>>>>>>> >>>>>>>>>> -- >>>>>>>>>> cooldaemon >>>>>>>>>> >>>>>>>>>> ------------------------------------------------------------------------- >>>>>>>>>> Check out the new SourceForge.net Marketplace. >>>>>>>>>> It's the best place to buy or sell services for >>>>>>>>>> just about anything Open Source. >>>>>>>>>> http://sourceforge.net/services/buy/index.php >>>>>>>>>> _______________________________________________ >>>>>>>>>> Kai-devel-ja mailing list >>>>>>>>>> Kai...@li... >>>>>>>>>> https://lists.sourceforge.net/lists/listinfo/kai-devel-ja >>>>>>>>>> >>>>>>>>> >>>>>>>>> >>>>>>>>> >>>>>>>>> -- >>>>>>>>> cooldaemon >>>>>>>>> >>>>>>>> >>>>>>>> >>>>>>>> >>>>>>>> -- >>>>>>>> Takeru INOUE <tak...@gm...> >>>>>>>> >>>>>>> >>>>>>> >>>>>>> >>>>>>> -- >>>>>>> cooldaemon >>>>>>> >>>>>> >>>>>> >>>>>> >>>>>> -- >>>>>> Takeru INOUE <tak...@gm...> >>>>>> >>>>> >>>>> >>>>> >>>>> -- >>>>> cooldaemon >>>>> >>>> >>>> >>>> >>>> -- >>>> Takeru INOUE <tak...@gm...> >>>> >>> >>> >>> >>> -- >>> cooldaemon >>> >> >> >> >> -- >> Takeru INOUE <tak...@gm...> >> > > > > -- > cooldaemon > -- Takeru INOUE <tak...@gm...> |
From: masahito i. <coo...@gm...> - 2008-07-06 12:37:10
|
一通り実装が終わったのでご報告申し上げます。 http://kai.svn.sourceforge.net/viewvc/kai/branches/cooldaemon_embed_tcp_server/ たけまるさん OK を頂ければ本体に merge します。 ▼kai_tcp_server について たけまるさん日記バージョンに下記の修正を入れました。 ・behaviour 化 ・Mod:handle_call に Socket を渡す ・{active, true} で listen 可能 ▼テストについて ・make test 時に ./ebin を参照 ・Coverage Analysis 対応の為、test/kai.coverspec 追加 現状、kai_tcp_server, kai_api, kai_memcache を直書きしています。 後で、make test コマンドで Makefile 内の SOURCES から生成したいと考えております。 make に詳しい方のご助言希望。 ・Coverage Analysis 対応の為、make 時に +debug_info を付加 make test を実行しない場合であっても、強制的に erlc +debug_info になります。 これも、make に詳しい方のご助言希望。 ▼現状、認識している残作業 テストの Coverage を上げる。 以上です。 2008/7/1 Takeru INOUE <tak...@gm...>: > {packet, line} とかのことはまったく気にしてませんでした.. > >> 2.Mod:handle_call に Socket を渡してしまう。 >> {packet, line} だけ、kai_tcp_server に任せ、複雑な事は Mod で行ってしまおうかと。 >> 個人的には、これが一番良いかな?と思っています。 > > 僕も 2 が良いように思いました. > {packet, line} に戻すことを指示するキレイな方法があるかなぁ. > >> 3.Mod に gen_tcp:recv や gen_tcp:send を完全に任せる。 >> http://d.hatena.ne.jp/cooldaemon/20080624/1214315157 >> これに近い感じです。(そのままは使いません) > > あんまり複雑になるようなら 3 にしてしまったほうがいいのかもしれないですね. > > > 2008/7/1 masahito ikuta <coo...@gm...>: >> 自分の才能の無さに絶望したので、お知恵を拝借させて下さい orz >> >> 下記、kai_tcp_server のコード片です。 >> --- >> acceptor_loop(Socket, State, Mod, Option) -> >> case gen_tcp:recv( >> Socket, Option:get(recv_length), Option:get(recv_timeout) >> ) of >> {ok, Data} -> >> case Mod:handle_call(Data, State) of >> {reply, DataToSend, State} -> >> gen_tcp:send(Socket, DataToSend), >> acceptor_loop(Socket, State, Mod, Option); >> {noreply, State} -> >> acceptor_loop(Socket, State, Mod, Option); >> {setopts, SocketOptions, RecvLength, State} -> >> inet:setopts(Socket, SocketOptions), >> NewOption = kai_option:new( >> [ >> {recv_length, RecvLength}, >> {recv_timeout, Option:get(recv_timeout)} >> ], >> ?DEFAULT_OPT_PROP >> ), >> acceptor_loop(Socket, State, Mod, NewOption); >> {close, DataToSend, State} -> >> gen_tcp:send(Socket, DataToSend), >> gen_tcp:close(Socket); >> _Error -> >> gen_tcp:close(Socket) >> end; >> {error, Reason} -> >> exit({error, Reason}) >> end. >> --- >> たけまるさん版に改良を加え >> Mod:handle_call/2 に {setopts, SocketOptions, RecvLength, State} という戻り値を加えてみました。 >> こうする事で、{packet, line} <-> {packet, raw} のオプション変更に対応しています。 >> >> ※RecvLength あたりが美しくないですよね・・・ >> ※まだ、kai_option を使っているのですが、これは後で別途相談を・・・ >> >> この状態で、kai_memcache を途中まで修正してみたのですが >> put クエリ対応がカオスになってしまいました。 >> --- >> handle_call(Data, [{packet, line}] = State) -> >> dispatch(string:tokens(binary_to_list(Data), " \r\n"), State). >> >> dispatch(["set", Key, Flags, "0", Bytes], [{packet, line}] = State) -> >> { >> setopts, >> [{packet, raw}], >> Bytes, >> [{packet, raw}, {state, Key, Flags}] >> }; >> dispatch(["set", Key, Flags, Exptime, Bytes], [{packet, line}] = State) -> >> {reply, "CLIENT_ERROR Exptime must be zero.\r\n", State}. >> >> handle_call(Value, [{packet, raw}, {state, Key, Flags}] = State) -> >> Data = #data{key=Key, flags=Flags, value=Value}, >> case kai_coordinator:route({put, Data}) of >> ok -> >> {reply, <<"STORED\r\n">>, State}; >> _Other -> >> send_error_and_close("Failed to read.", State) >> end. >> --- >> 作りかけなので、上記は、下記のようなバグを持っています。 >> ・<<"STORED\r\n">> した後に {packet, line} に戻していない >> ・Value の後に続く、<<"\r\n">> を受信しきっていない >> >> で、今後の対応として、下記の三つを考えております。 >> 1.このまま続ける。 >> Mod:handle_call/2 に gen_tcp:send しつつ inet:setopts するモードを追加すれば >> このままいけそうな気がしています。カオスですが・・・。 >> >> 2.Mod:handle_call に Socket を渡してしまう。 >> {packet, line} だけ、kai_tcp_server に任せ、複雑な事は Mod で行ってしまおうかと。 >> 個人的には、これが一番良いかな?と思っています。 >> >> 3.Mod に gen_tcp:recv や gen_tcp:send を完全に任せる。 >> http://d.hatena.ne.jp/cooldaemon/20080624/1214315157 >> これに近い感じです。(そのままは使いません) >> >> と言う事で、意見募集中です。 >> >> 2008/6/25 Takeru INOUE <tak...@gm...>: >>>> では、諸々考慮しつつ、kai へ組み込んでみますね。 >>> >>> はい,ガンガン進めちゃってください. >>> >>>> 念のため、branch を作ります。 >>>> >>>> embed_tcp_server >>>> >>>> と言う branch で、如何でしょうか? >>> >>> それでもいいですし,kai/branches/cooldaemon/hoge/ >>> のようにアカウント名でディレクトリを掘ったほうが気楽であれば,こっちでもいいです. >>> >>> >>>> 2008/6/25 Takeru INOUE <tak...@gm...>: >>>>>> おー、この方が素敵ですね! >>>>>> tcp_server.erl 用に behaviour を作っても良いかもしれませんね。 >>>>> >>>>> Kai に限定されない,汎用モジュールっぽくていい感じです :-) >>>>> >>>>>> あと、kai の場合は、tcp_server.erl 二つ(api と memcache)起動する必要があるので >>>>>> supervisor 二重起動を許可しないといけませんね。 >>>>>> (確認とってませんが、確か、同名の supervisor は起動できないハズ) >>>>> >>>>> そんな制約があるかもなのですね. >>>>> >>>>>> そう言えば、TrapExit かどこかで >>>>>> application、supervisor、gen_server を >>>>>> 一ファイルに記述する方法が掲載されていました。 >>>>> >>>>> いろんな技があるのですねぇ. >>>>> 僕はそういうサイトを読み込めてないので,車輪の再発明をしてそうです.. >>>>> >>>>>> 今回の、tcp_server.erl は、supervisor と proc_lib が同居しているので >>>>>> module として持ち運びが簡単かなぁと思うのですが >>>>>> コード量によっては、分割した方が良い気もします。 >>>>>> (今回のファイルサイズであれば、分割は不要だと思います) >>>>> >>>>> 今回も迷ったのですが,何となく一つのファイルにまとめてみて,そのままにしてあります. >>>>> 書きやすさ・読みやすさに合わせて分割してしまってください. >>>>> >>>>>> 2008/6/25 Takeru INOUE <tak...@gm...>: >>>>>>>> http://d.hatena.ne.jp/cooldaemon/20071024/1193193093 >>>>>>>> ここの Server Design のアスキーアートをベースに話をします。 >>>>>>>> >>>>>>>> tcp_server_sup は、tcp_acceptor と tcp_client_sup を起動し監視下に置きます。 >>>>>>>> その際、tcp_acceptor を、最大接続数分 起動します。 >>>>>>> >>>>>>> これを読んで合点がいきました. >>>>>>> >>>>>>>> http://d.hatena.ne.jp/cooldaemon/20080624 >>>>>>>> こんな感じで、どうでしょうか? >>>>>>> >>>>>>> 素晴らしいです. >>>>>>> >>>>>>> せっかくなので,完全に OTP にしてみました. >>>>>>> 使いやすくなってるかは微妙.. >>>>>>> >>>>>>> たけまる / 続・Erlang で Apache worker MPM っぽいこと >>>>>>> http://teahut.sakura.ne.jp/b/2008-06-25-1.html >>>>>>> >>>>>>>> Mochiweb 方式より、accept 待ちプロセスを複数持つ方式の方が >>>>>>>> シンプルでコード量が少ないですねぇ >>>>>>> >>>>>>> そういう気がします. >>>>>>> 同時に accept できるというのは比較的新しい機能のようですね. >>>>>>> >>>>>>>> 2008/6/24 masahito ikuta <coo...@gm...>: >>>>>>>>>> 僕がイメージしていたのは,つねに一定数のプロセスを起動しておいて,暇なやつにリクエストを処理させる >>>>>>>>>> (暇やつがいなければリクエストを待たせておく) という振る舞いでした. >>>>>>>>> >>>>>>>>> メール&ブログのエントリを拝見致しましたが >>>>>>>>> たけまるさんと私の考え方は >>>>>>>>> 一致しているかなーと思います。 >>>>>>>>> ※私が勘違いしているかも? >>>>>>>>> >>>>>>>>>> cooldaemon さんの方法だと,プロセスの死活監視はできるのですが,プロセス数が一定ではないので,同時接続数を制限することはできません. >>>>>>>>> >>>>>>>>> Mochiweb もそうなのですが >>>>>>>>> accept した時点で、現在のプロセス数をインクリメントし >>>>>>>>> 最大接続数に達した時点で、accept を止めます。 >>>>>>>>> >>>>>>>>> プロセスが終了する度、EXIT メッセージが親に通達されるので >>>>>>>>> プロセス数をデクリメントします。 >>>>>>>>> (accept ループを抜けていた場合は、再開) >>>>>>>>> >>>>>>>>> なんとなくですが >>>>>>>>> 私は、accept するプロセスをプーリングする方式の方が >>>>>>>>> 速度が出そうな気がしますけれど。 >>>>>>>>> >>>>>>>>>> cooldaemon さんの方法は,プロセスを増やしながら生死を管理するための高度な方法です. >>>>>>>>> >>>>>>>>> ついでに、kai_api, kai_memcache のコードの共通化も可能です。 >>>>>>>>> >>>>>>>>> で、両者の良いとこ取りを出来ないかと思い >>>>>>>>> >>>>>>>>>>> spawn のコストが高くなった時点で >>>>>>>>>>> acceptor をプーリングしておく方式に切り替える事も >>>>>>>>>>> 検討材料として残しつつ、作業を進めます。 >>>>>>>>>>> >>>>>>>>>>> その場合は、tcp_client_sup がプロセスの死活監視を行う事になります。 >>>>>>>>>>> (名前は、kai_tcp_client_sup とかが良いでしょうか?) >>>>>>>>> >>>>>>>>> と書いたのですが、これの説明が悪いので、もう少しだけ補足を書かせて下さい。 >>>>>>>>> >>>>>>>>> http://d.hatena.ne.jp/cooldaemon/20071024/1193193093 >>>>>>>>> ここの Server Design のアスキーアートをベースに話をします。 >>>>>>>>> >>>>>>>>> tcp_server_sup は、tcp_acceptor と tcp_client_sup を起動し監視下に置きます。 >>>>>>>>> その際、tcp_acceptor を、最大接続数分 起動します。 >>>>>>>>> >>>>>>>>> 接続があると、tcp_acceptor は >>>>>>>>> tcp_client_sup に tcp_echo(kai_memcache) を起動しなさい!と >>>>>>>>> メッセージを送ります。 >>>>>>>>> >>>>>>>>> 接続時に spawn しているので tcp_acceptor を複数起動するメリットが >>>>>>>>> accept ループを出たり入ったりする処理を >>>>>>>>> 書かなくて良い点だけになってしまいますが・・・。 >>>>>>>>> (単一プロセスのループ処理を、複数プロセスに置き換えているところが >>>>>>>>> Erlang っぽくて萌えるのですがw;) >>>>>>>>> >>>>>>>>> 死活監視と接続最大数は別の話だとは思いつつも >>>>>>>>> proc_lib の下に proc_lib や普通のプロセス(?) を配置すると >>>>>>>>> OTP の恩恵を受けられないので、何とかならないかなぁと思ってます。 >>>>>>>>> >>>>>>>>>> これに懲りずにおつきあいくださいませ. >>>>>>>>> >>>>>>>>> いやー、こういう話がないと、開発してる気分になれない気が(w; >>>>>>>>> お気になさらずにー。 >>>>>>>>> >>>>>>>>> 2008/6/23 Takeru INOUE <tak...@gm...>: >>>>>>>>>> 井上 (たけまる) です. >>>>>>>>>> >>>>>>>>>> すいません,少し勘違いしていました. >>>>>>>>>> >>>>>>>>>> 今回やろうとしていたことは,同時接続数の制限です (という言い方をすれば誤解がなかったのか). >>>>>>>>>> よく考えれば, >>>>>>>>>> >>>>>>>>>> - プロセスの生死を管理すること >>>>>>>>>> - 同時接続数を制限すること >>>>>>>>>> >>>>>>>>>> これらは別の話ですね. >>>>>>>>>> >>>>>>>>>> 僕がイメージしていたのは,つねに一定数のプロセスを起動しておいて,暇なやつにリクエストを処理させる >>>>>>>>>> (暇やつがいなければリクエストを待たせておく) という振る舞いでした. >>>>>>>>>> cooldaemon さんの方法だと,プロセスの死活監視はできるのですが,プロセス数が一定ではないので,同時接続数を制限することはできません. >>>>>>>>>> >>>>>>>>>> cooldaemon さんの方法は,プロセスを増やしながら生死を管理するための高度な方法です. >>>>>>>>>> 今回の局面で使うには少し違うかも,という気がしています. >>>>>>>>>> 僕のイメージとは少し違ったのですが,有用な方法であることは間違いないので,どこかで役に立つと思います >>>>>>>>>> (まだ勘違いしてるかもしれないので,気づいた点がありましたら指摘してください><). >>>>>>>>>> >>>>>>>>>> 詳しくはブログに書きました. >>>>>>>>>> >>>>>>>>>> たけまる / Erlang で Apache worker MPM っぽいこと >>>>>>>>>> http://teahut.sakura.ne.jp/b/2008-06-23-1.html >>>>>>>>>> >>>>>>>>>> というわけで,混乱させてしまってすみません m(_ _)m >>>>>>>>>> これに懲りずにおつきあいくださいませ. >>>>>>>>>> >>>>>>>>>> >>>>>>>>>> 2008/6/23 masahito ikuta <coo...@gm...>: >>>>>>>>>>>> ただこの方法だと worker の生死管理を自分で書かないといけないので,cooldaemon さんの方法のがよさそうです. >>>>>>>>>>> >>>>>>>>>>> spawn のコストが高くなった時点で >>>>>>>>>>> acceptor をプーリングしておく方式に切り替える事も >>>>>>>>>>> 検討材料として残しつつ、作業を進めます。 >>>>>>>>>>> >>>>>>>>>>> その場合は、tcp_client_sup がプロセスの死活監視を行う事になります。 >>>>>>>>>>> (名前は、kai_tcp_client_sup とかが良いでしょうか?) >>>>>>>>>>> >>>>>>>>>>> 2008/6/23 Takeru INOUE <tak...@gm...>: >>>>>>>>>>>>>>>- kai_api, kai_memcache のプロセスプール >>>>>>>>>>>>>> >>>>>>>>>>>>>> こちらの作業内容を >>>>>>>>>>>>>> もう少し詳しく教えて頂いて宜しいでしょうか? >>>>>>>>>>>>>> (何となく、参加できそうな気がしたので・・・) >>>>>>>>>>>>> >>>>>>>>>>>>> http://d.hatena.ne.jp/cooldaemon/20071024/1193193093 >>>>>>>>>>>>> ↑この仕組みで汎用化してしまい >>>>>>>>>>>>> tcp_acceptor の箇所で接続数の制限を行うのは >>>>>>>>>>>>> 如何でしょうか? >>>>>>>>>>>> >>>>>>>>>>>> はい,そんな感じです. >>>>>>>>>>>> >>>>>>>>>>>> やろうとしていることは,『プログラミングErlang』14.1 の最後に書いてあることそのままです. >>>>>>>>>>>> >>>>>>>>>>>> | Erlang バージョン R11B-3 では,1つの待ち受け用ソケットに >>>>>>>>>>>> | 対して複数の Erlang プロセスが gen_tcp:accept/1 を呼び出すことが >>>>>>>>>>>> | できる.この機能を利用すれば,前もって生成しておいたプロセスのプー >>>>>>>>>>>> | ルを用意しておいて,その各プロセスを gen_tcp:accept/1 で接続待ち >>>>>>>>>>>> | 状態にしておくことができるので,並列サーバを作るのが簡単になる.(p.207) >>>>>>>>>>>> >>>>>>>>>>>> 僕がどうするつもりだったかというと,わりと適当にしか考えてなくて,『プログラミングErlang』付録D に出てくる lib_chan_cs >>>>>>>>>>>> のように,accept 待ちのプロセスを指定した数だけ spawn しておけばいいかなくらいに思ってました. >>>>>>>>>>>> >>>>>>>>>>>> possibly_start_another(false, Listen, Active, Fun, max) -> >>>>>>>>>>>> case length(Active) of >>>>>>>>>>>> N when N < Max -> % worker 数が Max 未満なら >>>>>>>>>>>> New = start_accept(Listen, Fun), % accept 待ちプロセスを起動 >>>>>>>>>>>> >>>>>>>>>>>> ただこの方法だと worker の生死管理を自分で書かないといけないので,cooldaemon さんの方法のがよさそうです. >>>>>>>>>>>> というわけで,いけそうなら sourceforge の tracker で自分にアサインしちゃってください. >>>>>>>>>>>> kai_api と kai_memcache がありますが,kai_memcache のほうがデバッグしやすい気がします. >>>>>>>>>>>> >>>>>>>>>>>> ちなみに,プロセスプールを TODO に入れた理由は次のとおりです. >>>>>>>>>>>> いまの Kai は,毎秒数百リクエストを送りつけると負荷が高くなって,メンバシップの管理ができなくなり,クラスタが分解してしまいます. >>>>>>>>>>>> これを回避できるとしたら,API の受け付け数を制限するしかないかなと. >>>>>>>>>>>> 『プログラミングErlang』でも,この機能をトラフィックシェーピング (流量制御) と読んでますね. >>>>>>>>>>>> >>>>>>>>>>>> >>>>>>>>>>>>> 2008/6/23 masahito ikuta <coo...@gm...>: >>>>>>>>>>>>>> cooldaemon です。 >>>>>>>>>>>>>> >>>>>>>>>>>>>>>- kai_api, kai_memcache のプロセスプール >>>>>>>>>>>>>> >>>>>>>>>>>>>> こちらの作業内容を >>>>>>>>>>>>>> もう少し詳しく教えて頂いて宜しいでしょうか? >>>>>>>>>>>>>> (何となく、参加できそうな気がしたので・・・) >>>>>>>>>>>>>> >>>>>>>>>>>>>>>チューニングの類 (特にトリッキーなコードを伴うもの) は後回しにしたいと思います. >>>>>>>>>>>>>> >>>>>>>>>>>>>> とても細かい話で申し訳ないのですが・・・ >>>>>>>>>>>>>> 現在、make すると src ディレクトリ配下に beam ファイルが出来てしまうので >>>>>>>>>>>>>> OTP っぽく ebin ディレクトリ配下に配置したいと思いますが、如何でしょうか? >>>>>>>>>>>>>> (autotools に対応する気力は無いのですが orz) >>>>>>>>>>>>>> >>>>>>>>>>>>>> >>>>>>>>>>>>>> 2008/6/22 Takeru INOUE <tak...@gm...>: >>>>>>>>>>>>>>> 井上 (たけまる) です. >>>>>>>>>>>>>>> >>>>>>>>>>>>>>> 6/19 にこのメールを送ったのですが,sourceforge の作業中だったから送られてないようなので (archive に表示されない),再送します. >>>>>>>>>>>>>>> >>>>>>>>>>>>>>> >>>>>>>>>>>>>>> ---------- Forwarded message ---------- >>>>>>>>>>>>>>> From: Takeru INOUE <tak...@gm...> >>>>>>>>>>>>>>> Date: 2008/6/19 >>>>>>>>>>>>>>> Subject: 開発の進め方 >>>>>>>>>>>>>>> To: kai...@li... >>>>>>>>>>>>>>> >>>>>>>>>>>>>>> >>>>>>>>>>>>>>> 井上 (たけまる) です. >>>>>>>>>>>>>>> >>>>>>>>>>>>>>> きのうは勉強会に参加いただきありがとうございました. >>>>>>>>>>>>>>> お陰様で,面白い会になったと思います. >>>>>>>>>>>>>>> >>>>>>>>>>>>>>> さて,開発の進め方についてです. >>>>>>>>>>>>>>> >>>>>>>>>>>>>>> まず,発表で言ったように,kai_memcache から coordinator の機能を分離しておきます. >>>>>>>>>>>>>>> また,kai_version という空のモジュールを作っておきます. >>>>>>>>>>>>>>> これで,基本的なモジュール構成が固まるので,開発しやすくなると思います. >>>>>>>>>>>>>>> >>>>>>>>>>>>>>> 次に,実装の順序についてです. >>>>>>>>>>>>>>> >>>>>>>>>>>>>>> 基本的には好きなところから実装してもらって構わないと思うのですが,次のようなのが他の部分への影響が少なく取りかかりやすいでしょうか (面白みも少ないけど). >>>>>>>>>>>>>>> >>>>>>>>>>>>>>> - ./configure >>>>>>>>>>>>>>> - test_server >>>>>>>>>>>>>>> - kai_store の永続化 >>>>>>>>>>>>>>> - kai_api, kai_memcache のプロセスプール >>>>>>>>>>>>>>> >>>>>>>>>>>>>>> チューニングの類 (特にトリッキーなコードを伴うもの) は後回しにしたいと思います. >>>>>>>>>>>>>>> >>>>>>>>>>>>>>> コミッタは 5-10名と多くないので,管理はゆるめで進めたいです. >>>>>>>>>>>>>>> 早い者勝ちで手を挙げた人が実装してみて,行き詰まったら ML などでヘルプを求めるというのでいいかなぁ. >>>>>>>>>>>>>>> 誰が取り組んでいるかを知るために,sourceforge の Tracker を使うべきかなぁ. >>>>>>>>>>>>>>> 適当にブランチを切って自由に進めてもらって,落ち着いたところで merge するというので大丈夫だろうか. >>>>>>>>>>>>>>> モジュールのインタフェースが変更されるときは気をつけないといけないけど (merge は僕がやったほうがいいのかも). >>>>>>>>>>>>>>> >>>>>>>>>>>>>>> といったあたりについて意見を聞かせてください. >>>>>>>>>>>>>>> >>>>>>>>>>>>>>> # こういった開発者のための意識合わせ的なことは,Wiki にまとめて後で周知します. >>>>>>>>>>>>>>> >>>>>>>>>>>>>>> # うまく回り始めたら,僕は全体のコーディネートにまわるつもりです. >>>>>>>>>>>>>>> >>>>>>>>>>>>>>> -- >>>>>>>>>>>>>>> Takeru INOUE <tak...@gm...> >>>>>>>>>>>>>>> >>>>>>>>>>>>>>> ------------------------------------------------------------------------- >>>>>>>>>>>>>>> Check out the new SourceForge.net Marketplace. >>>>>>>>>>>>>>> It's the best place to buy or sell services for >>>>>>>>>>>>>>> just about anything Open Source. >>>>>>>>>>>>>>> http://sourceforge.net/services/buy/index.php >>>>>>>>>>>>>>> _______________________________________________ >>>>>>>>>>>>>>> Kai-devel-ja mailing list >>>>>>>>>>>>>>> Kai...@li... >>>>>>>>>>>>>>> https://lists.sourceforge.net/lists/listinfo/kai-devel-ja >>>>>>>>>>>>>>> >>>>>>>>>>>>>> >>>>>>>>>>>>>> >>>>>>>>>>>>>> >>>>>>>>>>>>>> -- >>>>>>>>>>>>>> cooldaemon >>>>>>>>>>>>>> >>>>>>>>>>>>> >>>>>>>>>>>>> >>>>>>>>>>>>> >>>>>>>>>>>>> -- >>>>>>>>>>>>> cooldaemon >>>>>>>>>>>>> >>>>>>>>>>>> >>>>>>>>>>>> >>>>>>>>>>>> >>>>>>>>>>>> -- >>>>>>>>>>>> Takeru INOUE <tak...@gm...> >>>>>>>>>>>> >>>>>>>>>>> >>>>>>>>>>> >>>>>>>>>>> >>>>>>>>>>> -- >>>>>>>>>>> cooldaemon >>>>>>>>>>> >>>>>>>>>> >>>>>>>>>> >>>>>>>>>> >>>>>>>>>> -- >>>>>>>>>> Takeru INOUE <tak...@gm...> >>>>>>>>>> >>>>>>>>> >>>>>>>>> >>>>>>>>> >>>>>>>>> -- >>>>>>>>> cooldaemon >>>>>>>>> >>>>>>>>> ------------------------------------------------------------------------- >>>>>>>>> Check out the new SourceForge.net Marketplace. >>>>>>>>> It's the best place to buy or sell services for >>>>>>>>> just about anything Open Source. >>>>>>>>> http://sourceforge.net/services/buy/index.php >>>>>>>>> _______________________________________________ >>>>>>>>> Kai-devel-ja mailing list >>>>>>>>> Kai...@li... >>>>>>>>> https://lists.sourceforge.net/lists/listinfo/kai-devel-ja >>>>>>>>> >>>>>>>> >>>>>>>> >>>>>>>> >>>>>>>> -- >>>>>>>> cooldaemon >>>>>>>> >>>>>>> >>>>>>> >>>>>>> >>>>>>> -- >>>>>>> Takeru INOUE <tak...@gm...> >>>>>>> >>>>>> >>>>>> >>>>>> >>>>>> -- >>>>>> cooldaemon >>>>>> >>>>> >>>>> >>>>> >>>>> -- >>>>> Takeru INOUE <tak...@gm...> >>>>> >>>> >>>> >>>> >>>> -- >>>> cooldaemon >>>> >>> >>> >>> >>> -- >>> Takeru INOUE <tak...@gm...> >>> >> >> >> >> -- >> cooldaemon >> > > > > -- > Takeru INOUE <tak...@gm...> > -- cooldaemon |
From: shun s. <shi...@gm...> - 2008-07-05 05:31:13
|
2008/07/04 22:37 Takeru INOUE <tak...@gm...>: > とりあえず作る方向で進めましょう.アーカイブが面倒かも. ap4r のときは、rubyforge.org のアーカイブがニホンゴでコケるようになったので、 mail-archive と gmane にアーカイブされるようにしました。 そのときのアナウンスは↓ http://article.gmane.org/gmane.comp.lang.ruby.ap4r.user.japanese/1 なので、自前でアーカイブしなきゃ、ってこともないかなと。 日本語(ISO-2022-JP etc.)でもちゃんとアーカイブされてますし、 google でもひっかかるらしい。 あ、erlang-users.jp 以下にアーカイブを置きたい、という意味だとこれじゃ ダメか? shino |
From: Takeru I. <tak...@gm...> - 2008-07-04 13:36:57
|
とりあえず作る方向で進めましょう. 手を抜いて,google groups でいいかなとか思ってたんですが,ちゃんと自ドメインでやったほうが立派な感じがするかなぁ. アーカイブが面倒かも. ちなみに,sourceforge で作ると Kai- から始まる名前になります. 2008/7/4 Tsukasa Hamano <ml...@cu...>: > To: 井上さん、幾田さん > > こんにちは、濱野です。 > > At Wed, 2 Jul 2008 21:24:26 +0900, > Takeru INOUE wrote: >> >> 日本語の erlang ML 的なものがほとんどないみたいなので,erlang-ja でも作ってみようかと思うのですけどどうでしょう? > > おお、大賛成です。 > erlang-questions もめっきり追えて無いのですが、日本語なら無理なく参加出 > 来るので嬉しいです。 > > sourceforge で erlang-ja at lists.sourceforge.net という ML を作成出来 > たかどうか解りませんが(prefix に project name が付く?) > > erlang-users.jp を使う場合 mx を mail.sourceforge.net に向ける、あるい > は ML システムを用意する事も出来ますのでこのドメインを使用について遠慮 > なくご意見お待ちしております。 > > 以上、よろしくお願い致します。 > > At Wed, 2 Jul 2008 21:24:26 +0900, > Takeru INOUE wrote: >> >> 日本語の erlang ML 的なものがほとんどないみたいなので,erlang-ja でも作ってみようかと思うのですけどどうでしょう? >> ほとんど使われないとは思いますが,Erlang-users.jp とセットであってもいいかなという気もします. >> >> -- >> Takeru INOUE <tak...@gm...> >> >> ------------------------------------------------------------------------- >> Sponsored by: SourceForge.net Community Choice Awards: VOTE NOW! >> Studies have shown that voting for your favorite open source project, >> along with a healthy diet, reduces your potential for chronic lameness >> and boredom. Vote Now at http://www.sourceforge.net/community/cca08 >> _______________________________________________ >> Kai-devel-ja mailing list >> Kai...@li... >> https://lists.sourceforge.net/lists/listinfo/kai-devel-ja > -- > Tsukasa Hamano <ha...@cu...> > -- Takeru INOUE <tak...@gm...> |
From: Tsukasa H. <ml...@cu...> - 2008-07-04 06:33:39
|
To: 井上さん、幾田さん こんにちは、濱野です。 At Wed, 2 Jul 2008 21:24:26 +0900, Takeru INOUE wrote: > > 日本語の erlang ML 的なものがほとんどないみたいなので,erlang-ja でも作ってみようかと思うのですけどどうでしょう? おお、大賛成です。 erlang-questions もめっきり追えて無いのですが、日本語なら無理なく参加出 来るので嬉しいです。 sourceforge で erlang-ja at lists.sourceforge.net という ML を作成出来 たかどうか解りませんが(prefix に project name が付く?) erlang-users.jp を使う場合 mx を mail.sourceforge.net に向ける、あるい は ML システムを用意する事も出来ますのでこのドメインを使用について遠慮 なくご意見お待ちしております。 以上、よろしくお願い致します。 At Wed, 2 Jul 2008 21:24:26 +0900, Takeru INOUE wrote: > > 日本語の erlang ML 的なものがほとんどないみたいなので,erlang-ja でも作ってみようかと思うのですけどどうでしょう? > ほとんど使われないとは思いますが,Erlang-users.jp とセットであってもいいかなという気もします. > > -- > Takeru INOUE <tak...@gm...> > > ------------------------------------------------------------------------- > Sponsored by: SourceForge.net Community Choice Awards: VOTE NOW! > Studies have shown that voting for your favorite open source project, > along with a healthy diet, reduces your potential for chronic lameness > and boredom. Vote Now at http://www.sourceforge.net/community/cca08 > _______________________________________________ > Kai-devel-ja mailing list > Kai...@li... > https://lists.sourceforge.net/lists/listinfo/kai-devel-ja -- Tsukasa Hamano <ha...@cu...> |
From: masahito i. <coo...@gm...> - 2008-07-03 10:17:29
|
erlang-users.jp とセットと言う事は、初心者〜上級者まで幅広くカバーするイメージですよね? そこでよく話題にあがる内容は、erlang-users.jp に還元すると。 一票入れておきます。 2008/7/2 Takeru INOUE <tak...@gm...>: > 日本語の erlang ML 的なものがほとんどないみたいなので,erlang-ja でも作ってみようかと思うのですけどどうでしょう? > ほとんど使われないとは思いますが,Erlang-users.jp とセットであってもいいかなという気もします. > > -- > Takeru INOUE <tak...@gm...> > > ------------------------------------------------------------------------- > Sponsored by: SourceForge.net Community Choice Awards: VOTE NOW! > Studies have shown that voting for your favorite open source project, > along with a healthy diet, reduces your potential for chronic lameness > and boredom. Vote Now at http://www.sourceforge.net/community/cca08 > _______________________________________________ > Kai-devel-ja mailing list > Kai...@li... > https://lists.sourceforge.net/lists/listinfo/kai-devel-ja > -- cooldaemon |
From: Takeru I. <tak...@gm...> - 2008-07-02 12:24:18
|
日本語の erlang ML 的なものがほとんどないみたいなので,erlang-ja でも作ってみようかと思うのですけどどうでしょう? ほとんど使われないとは思いますが,Erlang-users.jp とセットであってもいいかなという気もします. -- Takeru INOUE <tak...@gm...> |
From: Takeru I. <tak...@gm...> - 2008-07-02 12:05:41
|
>> 次の勉強会の1コマが早くも決まりました (^-^) > > ど・・・努力はしてみます。 がんばってください :-) >> 160bit の代わりに,64 とか 32 にすると,どういう影響があるとか書いてありました? > > K = 64 or 32 ですよね? > P2P 本には書いていなかったと思います。 > > 憶測で申し訳ございませんが・・・多分・・・ > ▼ノードが持つ k-bucket の数が減る > どの k-bucket を使うかは 160 個であっても一瞬で決まるので > 差は出ないと思います。 > > ▼publish の対象ノード数が減る > K 個のノードに publish するので > 処理完了までの時間が短縮されると思います。 > > んー・・・publish を非同期にしてしまえば > 処理が戻ってくるまでの時間に差は無いような気がします。 > > ▼find_node の対象ノード数が減る > K 個のノードに対して行い > 非同期で同時に α 個(例えば 3個)にクエリを送る事になっているので > こちらも時簡短縮されると思います。 > > ただ、個人的には、α の数が少ない気がするんですよねー。 なるほどー. 論文などを読んだわけではないので,誤解してるかもしれないけど何となく思ったことを書いておきます. Dynamo に比べると,Kademlia はゆっくりした用途を想定しているので (BitTorrent みたいに),デフォルトの α を少なめにしてあるのかも. Kademlia は数百万ノードでも動くように作られてるので,ハッシュ空間が 160bit と大きくなっているけど,Kai ではもっと少なくてもいいのかなぁと思っています. 現在は CPU の 1 word に合わせて 32bit (約4億) にしてますが,データ数が 1000万くらいになると衝突が発生すると思うので,64bit くらいが妥当かなぁ. ハッシュ空間を小さくしたときの利点と欠点をまとめなきゃいけないなぁと思っていたので,ちょいと聞いてみました. 利点は検索時間などの短縮で,欠点はあまり気にしなくてよさそうかな. > 2008/6/30 Takeru INOUE <tak...@gm...>: >> 次の勉強会の1コマが早くも決まりました (^-^) >> >> 160bit の代わりに,64 とか 32 にすると,どういう影響があるとか書いてありました? >> Kai には,もうちょっとコンパクトな空間でも良さそうな気がしているのですが. >> >> 2008/6/30 masahito ikuta <coo...@gm...>: >>> P2P 本を斜め読みですが読破しました。 >>> その他、いろいろ google 先生にお尋ねして、下記のように適当にまとめました。 >>> http://cooldaemon.tumblr.com/post/40027784/kademlia >>> (自分メモなので、人様には読み難いですが・・・) >>> 突っ込み大歓迎です。 >>> >>> ermdia は、これから追い始めるので >>> 実際にコードを書いて検証し始めるのは 7月末くらいでしょうかねぇ・・・。 >>> 早く勉強会で発表できるくらいになりたいものです。 >>> >>> 2008/6/23 Takeru INOUE <tak...@gm...>: >>>>> ありがとうございます! >>>>> kai_membership.erl の実装に関わる自信はありませんが・・・ >>>>> 今のところ、一番興味のある箇所なので >>>>> ご指導の程、宜しくお願い致します。 >>>>> (私のような初心者が、学んだ事をアウトプットする事で >>>>> Kai プロジェクト参加の敷居を下げる効果が >>>>> あるのではないかなぁと・・・) >>>>> >>>>> ところで、興味本位の質問ではあるのですが >>>>> 幾つかある DHT のアルゴリズムの中から >>>>> Kai では Chord を採用した理由を >>>>> 差し支えなければ、お教え頂けないでしょうか? >>>> >>>> Kai としては DHT のアルゴリズムを決めてはないのですが, >>>> Dynamo が Chord を選択した理由は次のようなものだと思います. >>>> >>>> - DHT アルゴリズムの中では簡単だった (Pastry とかより簡単) >>>> - Dynamo 開発当初は Kademlia がまだなかったか,一定の評価が与えられてなかった >>>> >>>> 最近だと BitTorrent に採用されていることもあって,Kademlia の評価が高いのかなぁ. >>>> >>>> 僕としては,Kai に実装するなら Chord か Kademlia のどちらかだろうと思ってます. >>>> 先のメールに書いたように,すでに Kademlia の Erlang 実装があるので,やや Kademlia に傾いてるかな. >>>> >>>> ただ,Dynamo に Kademlia が合うかどうかは真面目に検討してないので,実際に実装する前には厳密に評価したほうがいいでしょうね. >>>> >>>> このへんの技術を勉強するのであれば,P2P教科書 がそれなりにまとまっています (技術分類などに問題のある本ですが). >>>> >>>> >>>>> 2008/6/22 Takeru INOUE <tak...@gm...>: >>>>>> 井上 (たけまる) です. >>>>>> >>>>>>> ▼要望 >>>>>>> たけまるさんのプレゼンで、DHT に興味を持ちました。 >>>>>>> >>>>>>> 現在は、Chord について、いろいろ調べたり >>>>>>> 少しだけ試しに実装してみて試行錯誤している段階です。 >>>>>>> >>>>>>> そこで、どこかの段階で、Chord について理解している事をまとめたり >>>>>>> Erlang で書いたコードを晒したりするので >>>>>>> たけまるさん初め有識者の方々のご指導を頂きたいのですが >>>>>>> 如何なものでしょうか? >>>>>> >>>>>> はい,よろこんで. >>>>>> >>>>>> DHT は Erlang に適していると思うのですが,実装はそれほど多くないかもしれません. >>>>>> 少し調べてみたところ,id:ytakano さん (ご存じの方います?) の Kademlia と, >>>>>> >>>>>> Erlangで分散ハッシュテーブルを実装してみた - NO!と言えるようになりたい >>>>>> http://d.hatena.ne.jp/ytakano/20080507/1210136628 >>>>>> >>>>>> 先週の Conference on Scalability というところで発表のあった Chord with transaction がヒットしました. >>>>>> >>>>>> YouTube - Seattle Conference on Scalability: Scalable Wikipedia with E >>>>>> http://jp.youtube.com/watch?v=pW339qR7DvU&feature=user >>>>>> >>>>>> -- >>>>>> Takeru INOUE <tak...@gm...> >>>>>> >>>>> >>>>> -- >>>>> cooldaemon >>>>> >>>> >>>> >>>> >>>> -- >>>> Takeru INOUE <tak...@gm...> >>>> >>> >>> >>> >>> -- >>> cooldaemon >>> >> >> >> >> -- >> Takeru INOUE <tak...@gm...> >> > > > > -- > cooldaemon > -- Takeru INOUE <tak...@gm...> |
From: masahito i. <coo...@gm...> - 2008-06-30 15:25:46
|
> 次の勉強会の1コマが早くも決まりました (^-^) ど・・・努力はしてみます。 > 160bit の代わりに,64 とか 32 にすると,どういう影響があるとか書いてありました? K = 64 or 32 ですよね? P2P 本には書いていなかったと思います。 憶測で申し訳ございませんが・・・多分・・・ ▼ノードが持つ k-bucket の数が減る どの k-bucket を使うかは 160 個であっても一瞬で決まるので 差は出ないと思います。 ▼publish の対象ノード数が減る K 個のノードに publish するので 処理完了までの時間が短縮されると思います。 んー・・・publish を非同期にしてしまえば 処理が戻ってくるまでの時間に差は無いような気がします。 ▼find_node の対象ノード数が減る K 個のノードに対して行い 非同期で同時に α 個(例えば 3個)にクエリを送る事になっているので こちらも時簡短縮されると思います。 ただ、個人的には、α の数が少ない気がするんですよねー。 2008/6/30 Takeru INOUE <tak...@gm...>: > 次の勉強会の1コマが早くも決まりました (^-^) > > 160bit の代わりに,64 とか 32 にすると,どういう影響があるとか書いてありました? > Kai には,もうちょっとコンパクトな空間でも良さそうな気がしているのですが. > > 2008/6/30 masahito ikuta <coo...@gm...>: >> P2P 本を斜め読みですが読破しました。 >> その他、いろいろ google 先生にお尋ねして、下記のように適当にまとめました。 >> http://cooldaemon.tumblr.com/post/40027784/kademlia >> (自分メモなので、人様には読み難いですが・・・) >> 突っ込み大歓迎です。 >> >> ermdia は、これから追い始めるので >> 実際にコードを書いて検証し始めるのは 7月末くらいでしょうかねぇ・・・。 >> 早く勉強会で発表できるくらいになりたいものです。 >> >> 2008/6/23 Takeru INOUE <tak...@gm...>: >>>> ありがとうございます! >>>> kai_membership.erl の実装に関わる自信はありませんが・・・ >>>> 今のところ、一番興味のある箇所なので >>>> ご指導の程、宜しくお願い致します。 >>>> (私のような初心者が、学んだ事をアウトプットする事で >>>> Kai プロジェクト参加の敷居を下げる効果が >>>> あるのではないかなぁと・・・) >>>> >>>> ところで、興味本位の質問ではあるのですが >>>> 幾つかある DHT のアルゴリズムの中から >>>> Kai では Chord を採用した理由を >>>> 差し支えなければ、お教え頂けないでしょうか? >>> >>> Kai としては DHT のアルゴリズムを決めてはないのですが, >>> Dynamo が Chord を選択した理由は次のようなものだと思います. >>> >>> - DHT アルゴリズムの中では簡単だった (Pastry とかより簡単) >>> - Dynamo 開発当初は Kademlia がまだなかったか,一定の評価が与えられてなかった >>> >>> 最近だと BitTorrent に採用されていることもあって,Kademlia の評価が高いのかなぁ. >>> >>> 僕としては,Kai に実装するなら Chord か Kademlia のどちらかだろうと思ってます. >>> 先のメールに書いたように,すでに Kademlia の Erlang 実装があるので,やや Kademlia に傾いてるかな. >>> >>> ただ,Dynamo に Kademlia が合うかどうかは真面目に検討してないので,実際に実装する前には厳密に評価したほうがいいでしょうね. >>> >>> このへんの技術を勉強するのであれば,P2P教科書 がそれなりにまとまっています (技術分類などに問題のある本ですが). >>> >>> >>>> 2008/6/22 Takeru INOUE <tak...@gm...>: >>>>> 井上 (たけまる) です. >>>>> >>>>>> ▼要望 >>>>>> たけまるさんのプレゼンで、DHT に興味を持ちました。 >>>>>> >>>>>> 現在は、Chord について、いろいろ調べたり >>>>>> 少しだけ試しに実装してみて試行錯誤している段階です。 >>>>>> >>>>>> そこで、どこかの段階で、Chord について理解している事をまとめたり >>>>>> Erlang で書いたコードを晒したりするので >>>>>> たけまるさん初め有識者の方々のご指導を頂きたいのですが >>>>>> 如何なものでしょうか? >>>>> >>>>> はい,よろこんで. >>>>> >>>>> DHT は Erlang に適していると思うのですが,実装はそれほど多くないかもしれません. >>>>> 少し調べてみたところ,id:ytakano さん (ご存じの方います?) の Kademlia と, >>>>> >>>>> Erlangで分散ハッシュテーブルを実装してみた - NO!と言えるようになりたい >>>>> http://d.hatena.ne.jp/ytakano/20080507/1210136628 >>>>> >>>>> 先週の Conference on Scalability というところで発表のあった Chord with transaction がヒットしました. >>>>> >>>>> YouTube - Seattle Conference on Scalability: Scalable Wikipedia with E >>>>> http://jp.youtube.com/watch?v=pW339qR7DvU&feature=user >>>>> >>>>> -- >>>>> Takeru INOUE <tak...@gm...> >>>>> >>>> >>>> -- >>>> cooldaemon >>>> >>> >>> >>> >>> -- >>> Takeru INOUE <tak...@gm...> >>> >> >> >> >> -- >> cooldaemon >> > > > > -- > Takeru INOUE <tak...@gm...> > -- cooldaemon |
From: Takeru I. <tak...@gm...> - 2008-06-30 15:22:10
|
僕も,(1) と (2) の差はコードの簡潔さだと思います. 一般的なプログラミング言語では (1) で書くのが定石でしょうか. 一方 Erlang はプロセス間の相互作用の少ない (2) で書けるので,「せっかくだからそうしよう」というのが Kai の流れでしょうか. パフォーマンスは調べてみないとわかりませんが,accept 後の spawn/dispatch 的な処理を (1) 自分で書くのか (2) OTP にやらせるのかの違いかなと思ってます. まぁ,OTP はそんなに遅くないと都合良く信じることにして,(2) でいいかなと ^^; ってな風に考えてます. 2008/6/30 Tsukasa Hamano <ml...@cu...>: > こんにちは、濱野です。 > > すっかり出遅れてしまいましたが、 > > 1) accept した直後にプロセスを生成してコネクションを受け持つモデルと > 2) 予め複数のプロセスを生成しておいて全て accept 待ちにしておく > > という2種類のモデルについて、思うところを書かせて頂きます。 > > まず、apache の挙動ですが、prefork にしろ worker モデルにしろ > 一つのlisten ソケットに対し複数プロセスが 同時に accept(2) を呼び出さな > いように何らかの方法で直列化を行っていたと思います。 > http://httpd.apache.org/docs/2.0/ja/mod/mpm_common.html#acceptmutex > > Erlang の場合、R11B-3 からは SMP な Erlang VM でも場合同時に accept(2) > を呼び出さないように何らかの方法でロックを行い直列してくれるようになっ > たということだと思っているのですが、未確認ですので後で詳しく追ってみた > いと思います。 > > また、apache が 予め複数のプロセスを立ち上げている理由というのは、プロ > セスの起動が重いからという理由だったと思います。 > そこでプロセス生成コストは軽いと言われている Erlang の場合で考えると、 > 両者のモデルにそう大きなパフォーマンスの違いは無いのではないかと考えて > います。 > むしろ、プロセスの起動コストを考えずに、必要な時に必要なだけのプロセス > を spawn するのが erlang らしいプログラムなのではないかと思ってたりしま > すが、(2) の方がコードが簡潔という点でのアドバンテージはあるかもしれま > せん。 > > 結局、何が言いたかったのかというと (1)のモデルでもそれほど悪くないんじゃ > ないかなということでした。 > # 最大接続数の制限でしたら、cooldaemon さんも仰るように(1) の方法でも行え > ますよね。 > > パフォーマンスが気になるんだったら、さっさとベンチマーク取ればいいじゃ > んと思われるかもしれませんが、最近やっと OTP 作法を覚えようとしてたり、 > ぜんぜん手が追いついていない状況です、ごめんなさいごめんなさい。 > > At Wed, 25 Jun 2008 01:59:49 +0900, > Takeru INOUE wrote: >> >> > http://d.hatena.ne.jp/cooldaemon/20071024/1193193093 >> > ここの Server Design のアスキーアートをベースに話をします。 >> > >> > tcp_server_sup は、tcp_acceptor と tcp_client_sup を起動し監視下に置きます。 >> > その際、tcp_acceptor を、最大接続数分 起動します。 >> >> これを読んで合点がいきました. >> >> > http://d.hatena.ne.jp/cooldaemon/20080624 >> > こんな感じで、どうでしょうか? >> >> 素晴らしいです. >> >> せっかくなので,完全に OTP にしてみました. >> 使いやすくなってるかは微妙.. >> >> たけまる / 続・Erlang で Apache worker MPM っぽいこと >> http://teahut.sakura.ne.jp/b/2008-06-25-1.html >> >> > Mochiweb 方式より、accept 待ちプロセスを複数持つ方式の方が >> > シンプルでコード量が少ないですねぇ >> >> そういう気がします. >> 同時に accept できるというのは比較的新しい機能のようですね. >> >> > 2008/6/24 masahito ikuta <coo...@gm...>: >> >>> 僕がイメージしていたのは,つねに一定数のプロセスを起動しておいて,暇なやつにリクエストを処理させる >> >>> (暇やつがいなければリクエストを待たせておく) という振る舞いでした. >> >> >> >> メール&ブログのエントリを拝見致しましたが >> >> たけまるさんと私の考え方は >> >> 一致しているかなーと思います。 >> >> ※私が勘違いしているかも? >> >> >> >>> cooldaemon さんの方法だと,プロセスの死活監視はできるのですが,プロセス数が一定ではないので,同時接続数を制限することはできません. >> >> >> >> Mochiweb もそうなのですが >> >> accept した時点で、現在のプロセス数をインクリメントし >> >> 最大接続数に達した時点で、accept を止めます。 >> >> >> >> プロセスが終了する度、EXIT メッセージが親に通達されるので >> >> プロセス数をデクリメントします。 >> >> (accept ループを抜けていた場合は、再開) >> >> >> >> なんとなくですが >> >> 私は、accept するプロセスをプーリングする方式の方が >> >> 速度が出そうな気がしますけれど。 >> >> >> >>> cooldaemon さんの方法は,プロセスを増やしながら生死を管理するための高度な方法です. >> >> >> >> ついでに、kai_api, kai_memcache のコードの共通化も可能です。 >> >> >> >> で、両者の良いとこ取りを出来ないかと思い >> >> >> >>>> spawn のコストが高くなった時点で >> >>>> acceptor をプーリングしておく方式に切り替える事も >> >>>> 検討材料として残しつつ、作業を進めます。 >> >>>> >> >>>> その場合は、tcp_client_sup がプロセスの死活監視を行う事になります。 >> >>>> (名前は、kai_tcp_client_sup とかが良いでしょうか?) >> >> >> >> と書いたのですが、これの説明が悪いので、もう少しだけ補足を書かせて下さい。 >> >> >> >> http://d.hatena.ne.jp/cooldaemon/20071024/1193193093 >> >> ここの Server Design のアスキーアートをベースに話をします。 >> >> >> >> tcp_server_sup は、tcp_acceptor と tcp_client_sup を起動し監視下に置きます。 >> >> その際、tcp_acceptor を、最大接続数分 起動します。 >> >> >> >> 接続があると、tcp_acceptor は >> >> tcp_client_sup に tcp_echo(kai_memcache) を起動しなさい!と >> >> メッセージを送ります。 >> >> >> >> 接続時に spawn しているので tcp_acceptor を複数起動するメリットが >> >> accept ループを出たり入ったりする処理を >> >> 書かなくて良い点だけになってしまいますが・・・。 >> >> (単一プロセスのループ処理を、複数プロセスに置き換えているところが >> >> Erlang っぽくて萌えるのですがw;) >> >> >> >> 死活監視と接続最大数は別の話だとは思いつつも >> >> proc_lib の下に proc_lib や普通のプロセス(?) を配置すると >> >> OTP の恩恵を受けられないので、何とかならないかなぁと思ってます。 >> >> >> >>> これに懲りずにおつきあいくださいませ. >> >> >> >> いやー、こういう話がないと、開発してる気分になれない気が(w; >> >> お気になさらずにー。 >> >> >> >> 2008/6/23 Takeru INOUE <tak...@gm...>: >> >>> 井上 (たけまる) です. >> >>> >> >>> すいません,少し勘違いしていました. >> >>> >> >>> 今回やろうとしていたことは,同時接続数の制限です (という言い方をすれば誤解がなかったのか). >> >>> よく考えれば, >> >>> >> >>> - プロセスの生死を管理すること >> >>> - 同時接続数を制限すること >> >>> >> >>> これらは別の話ですね. >> >>> >> >>> 僕がイメージしていたのは,つねに一定数のプロセスを起動しておいて,暇なやつにリクエストを処理させる >> >>> (暇やつがいなければリクエストを待たせておく) という振る舞いでした. >> >>> cooldaemon さんの方法だと,プロセスの死活監視はできるのですが,プロセス数が一定ではないので,同時接続数を制限することはできません. >> >>> >> >>> cooldaemon さんの方法は,プロセスを増やしながら生死を管理するための高度な方法です. >> >>> 今回の局面で使うには少し違うかも,という気がしています. >> >>> 僕のイメージとは少し違ったのですが,有用な方法であることは間違いないので,どこかで役に立つと思います >> >>> (まだ勘違いしてるかもしれないので,気づいた点がありましたら指摘してください><). >> >>> >> >>> 詳しくはブログに書きました. >> >>> >> >>> たけまる / Erlang で Apache worker MPM っぽいこと >> >>> http://teahut.sakura.ne.jp/b/2008-06-23-1.html >> >>> >> >>> というわけで,混乱させてしまってすみません m(_ _)m >> >>> これに懲りずにおつきあいくださいませ. >> >>> >> >>> >> >>> 2008/6/23 masahito ikuta <coo...@gm...>: >> >>>>> ただこの方法だと worker の生死管理を自分で書かないといけないので,cooldaemon さんの方法のがよさそうです. >> >>>> >> >>>> spawn のコストが高くなった時点で >> >>>> acceptor をプーリングしておく方式に切り替える事も >> >>>> 検討材料として残しつつ、作業を進めます。 >> >>>> >> >>>> その場合は、tcp_client_sup がプロセスの死活監視を行う事になります。 >> >>>> (名前は、kai_tcp_client_sup とかが良いでしょうか?) >> >>>> >> >>>> 2008/6/23 Takeru INOUE <tak...@gm...>: >> >>>>>>>>- kai_api, kai_memcache のプロセスプール >> >>>>>>> >> >>>>>>> こちらの作業内容を >> >>>>>>> もう少し詳しく教えて頂いて宜しいでしょうか? >> >>>>>>> (何となく、参加できそうな気がしたので・・・) >> >>>>>> >> >>>>>> http://d.hatena.ne.jp/cooldaemon/20071024/1193193093 >> >>>>>> ↑この仕組みで汎用化してしまい >> >>>>>> tcp_acceptor の箇所で接続数の制限を行うのは >> >>>>>> 如何でしょうか? >> >>>>> >> >>>>> はい,そんな感じです. >> >>>>> >> >>>>> やろうとしていることは,『プログラミングErlang』14.1 の最後に書いてあることそのままです. >> >>>>> >> >>>>> | Erlang バージョン R11B-3 では,1つの待ち受け用ソケットに >> >>>>> | 対して複数の Erlang プロセスが gen_tcp:accept/1 を呼び出すことが >> >>>>> | できる.この機能を利用すれば,前もって生成しておいたプロセスのプー >> >>>>> | ルを用意しておいて,その各プロセスを gen_tcp:accept/1 で接続待ち >> >>>>> | 状態にしておくことができるので,並列サーバを作るのが簡単になる.(p.207) >> >>>>> >> >>>>> 僕がどうするつもりだったかというと,わりと適当にしか考えてなくて,『プログラミングErlang』付録D に出てくる lib_chan_cs >> >>>>> のように,accept 待ちのプロセスを指定した数だけ spawn しておけばいいかなくらいに思ってました. >> >>>>> >> >>>>> possibly_start_another(false, Listen, Active, Fun, max) -> >> >>>>> case length(Active) of >> >>>>> N when N < Max -> % worker 数が Max 未満なら >> >>>>> New = start_accept(Listen, Fun), % accept 待ちプロセスを起動 >> >>>>> >> >>>>> ただこの方法だと worker の生死管理を自分で書かないといけないので,cooldaemon さんの方法のがよさそうです. >> >>>>> というわけで,いけそうなら sourceforge の tracker で自分にアサインしちゃってください. >> >>>>> kai_api と kai_memcache がありますが,kai_memcache のほうがデバッグしやすい気がします. >> >>>>> >> >>>>> ちなみに,プロセスプールを TODO に入れた理由は次のとおりです. >> >>>>> いまの Kai は,毎秒数百リクエストを送りつけると負荷が高くなって,メンバシップの管理ができなくなり,クラスタが分解してしまいます. >> >>>>> これを回避できるとしたら,API の受け付け数を制限するしかないかなと. >> >>>>> 『プログラミングErlang』でも,この機能をトラフィックシェーピング (流量制御) と読んでますね. >> >>>>> >> >>>>> >> >>>>>> 2008/6/23 masahito ikuta <coo...@gm...>: >> >>>>>>> cooldaemon です。 >> >>>>>>> >> >>>>>>>>- kai_api, kai_memcache のプロセスプール >> >>>>>>> >> >>>>>>> こちらの作業内容を >> >>>>>>> もう少し詳しく教えて頂いて宜しいでしょうか? >> >>>>>>> (何となく、参加できそうな気がしたので・・・) >> >>>>>>> >> >>>>>>>>チューニングの類 (特にトリッキーなコードを伴うもの) は後回しにしたいと思います. >> >>>>>>> >> >>>>>>> とても細かい話で申し訳ないのですが・・・ >> >>>>>>> 現在、make すると src ディレクトリ配下に beam ファイルが出来てしまうので >> >>>>>>> OTP っぽく ebin ディレクトリ配下に配置したいと思いますが、如何でしょうか? >> >>>>>>> (autotools に対応する気力は無いのですが orz) >> >>>>>>> >> >>>>>>> >> >>>>>>> 2008/6/22 Takeru INOUE <tak...@gm...>: >> >>>>>>>> 井上 (たけまる) です. >> >>>>>>>> >> >>>>>>>> 6/19 にこのメールを送ったのですが,sourceforge の作業中だったから送られてないようなので (archive に表示されない),再送します. >> >>>>>>>> >> >>>>>>>> >> >>>>>>>> ---------- Forwarded message ---------- >> >>>>>>>> From: Takeru INOUE <tak...@gm...> >> >>>>>>>> Date: 2008/6/19 >> >>>>>>>> Subject: 開発の進め方 >> >>>>>>>> To: kai...@li... >> >>>>>>>> >> >>>>>>>> >> >>>>>>>> 井上 (たけまる) です. >> >>>>>>>> >> >>>>>>>> きのうは勉強会に参加いただきありがとうございました. >> >>>>>>>> お陰様で,面白い会になったと思います. >> >>>>>>>> >> >>>>>>>> さて,開発の進め方についてです. >> >>>>>>>> >> >>>>>>>> まず,発表で言ったように,kai_memcache から coordinator の機能を分離しておきます. >> >>>>>>>> また,kai_version という空のモジュールを作っておきます. >> >>>>>>>> これで,基本的なモジュール構成が固まるので,開発しやすくなると思います. >> >>>>>>>> >> >>>>>>>> 次に,実装の順序についてです. >> >>>>>>>> >> >>>>>>>> 基本的には好きなところから実装してもらって構わないと思うのですが,次のようなのが他の部分への影響が少なく取りかかりやすいでしょうか (面白みも少ないけど). >> >>>>>>>> >> >>>>>>>> - ./configure >> >>>>>>>> - test_server >> >>>>>>>> - kai_store の永続化 >> >>>>>>>> - kai_api, kai_memcache のプロセスプール >> >>>>>>>> >> >>>>>>>> チューニングの類 (特にトリッキーなコードを伴うもの) は後回しにしたいと思います. >> >>>>>>>> >> >>>>>>>> コミッタは 5-10名と多くないので,管理はゆるめで進めたいです. >> >>>>>>>> 早い者勝ちで手を挙げた人が実装してみて,行き詰まったら ML などでヘルプを求めるというのでいいかなぁ. >> >>>>>>>> 誰が取り組んでいるかを知るために,sourceforge の Tracker を使うべきかなぁ. >> >>>>>>>> 適当にブランチを切って自由に進めてもらって,落ち着いたところで merge するというので大丈夫だろうか. >> >>>>>>>> モジュールのインタフェースが変更されるときは気をつけないといけないけど (merge は僕がやったほうがいいのかも). >> >>>>>>>> >> >>>>>>>> といったあたりについて意見を聞かせてください. >> >>>>>>>> >> >>>>>>>> # こういった開発者のための意識合わせ的なことは,Wiki にまとめて後で周知します. >> >>>>>>>> >> >>>>>>>> # うまく回り始めたら,僕は全体のコーディネートにまわるつもりです. >> >>>>>>>> >> >>>>>>>> -- >> >>>>>>>> Takeru INOUE <tak...@gm...> >> >>>>>>>> >> >>>>>>>> ------------------------------------------------------------------------- >> >>>>>>>> Check out the new SourceForge.net Marketplace. >> >>>>>>>> It's the best place to buy or sell services for >> >>>>>>>> just about anything Open Source. >> >>>>>>>> http://sourceforge.net/services/buy/index.php >> >>>>>>>> _______________________________________________ >> >>>>>>>> Kai-devel-ja mailing list >> >>>>>>>> Kai...@li... >> >>>>>>>> https://lists.sourceforge.net/lists/listinfo/kai-devel-ja >> >>>>>>>> >> >>>>>>> >> >>>>>>> >> >>>>>>> >> >>>>>>> -- >> >>>>>>> cooldaemon >> >>>>>>> >> >>>>>> >> >>>>>> >> >>>>>> >> >>>>>> -- >> >>>>>> cooldaemon >> >>>>>> >> >>>>> >> >>>>> >> >>>>> >> >>>>> -- >> >>>>> Takeru INOUE <tak...@gm...> >> >>>>> >> >>>> >> >>>> >> >>>> >> >>>> -- >> >>>> cooldaemon >> >>>> >> >>> >> >>> >> >>> >> >>> -- >> >>> Takeru INOUE <tak...@gm...> >> >>> >> >> >> >> >> >> >> >> -- >> >> cooldaemon >> >> >> >> ------------------------------------------------------------------------- >> >> Check out the new SourceForge.net Marketplace. >> >> It's the best place to buy or sell services for >> >> just about anything Open Source. >> >> http://sourceforge.net/services/buy/index.php >> >> _______________________________________________ >> >> Kai-devel-ja mailing list >> >> Kai...@li... >> >> https://lists.sourceforge.net/lists/listinfo/kai-devel-ja >> >> >> > >> > >> > >> > -- >> > cooldaemon >> > >> >> >> >> -- >> Takeru INOUE <tak...@gm...> >> >> ------------------------------------------------------------------------- >> Check out the new SourceForge.net Marketplace. >> It's the best place to buy or sell services for >> just about anything Open Source. >> http://sourceforge.net/services/buy/index.php >> _______________________________________________ >> Kai-devel-ja mailing list >> Kai...@li... >> https://lists.sourceforge.net/lists/listinfo/kai-devel-ja > -- > Tsukasa Hamano <ha...@cu...> > -- Takeru INOUE <tak...@gm...> |
From: Takeru I. <tak...@gm...> - 2008-06-30 15:15:48
|
{packet, line} とかのことはまったく気にしてませんでした.. > 2.Mod:handle_call に Socket を渡してしまう。 > {packet, line} だけ、kai_tcp_server に任せ、複雑な事は Mod で行ってしまおうかと。 > 個人的には、これが一番良いかな?と思っています。 僕も 2 が良いように思いました. {packet, line} に戻すことを指示するキレイな方法があるかなぁ. > 3.Mod に gen_tcp:recv や gen_tcp:send を完全に任せる。 > http://d.hatena.ne.jp/cooldaemon/20080624/1214315157 > これに近い感じです。(そのままは使いません) あんまり複雑になるようなら 3 にしてしまったほうがいいのかもしれないですね. 2008/7/1 masahito ikuta <coo...@gm...>: > 自分の才能の無さに絶望したので、お知恵を拝借させて下さい orz > > 下記、kai_tcp_server のコード片です。 > --- > acceptor_loop(Socket, State, Mod, Option) -> > case gen_tcp:recv( > Socket, Option:get(recv_length), Option:get(recv_timeout) > ) of > {ok, Data} -> > case Mod:handle_call(Data, State) of > {reply, DataToSend, State} -> > gen_tcp:send(Socket, DataToSend), > acceptor_loop(Socket, State, Mod, Option); > {noreply, State} -> > acceptor_loop(Socket, State, Mod, Option); > {setopts, SocketOptions, RecvLength, State} -> > inet:setopts(Socket, SocketOptions), > NewOption = kai_option:new( > [ > {recv_length, RecvLength}, > {recv_timeout, Option:get(recv_timeout)} > ], > ?DEFAULT_OPT_PROP > ), > acceptor_loop(Socket, State, Mod, NewOption); > {close, DataToSend, State} -> > gen_tcp:send(Socket, DataToSend), > gen_tcp:close(Socket); > _Error -> > gen_tcp:close(Socket) > end; > {error, Reason} -> > exit({error, Reason}) > end. > --- > たけまるさん版に改良を加え > Mod:handle_call/2 に {setopts, SocketOptions, RecvLength, State} という戻り値を加えてみました。 > こうする事で、{packet, line} <-> {packet, raw} のオプション変更に対応しています。 > > ※RecvLength あたりが美しくないですよね・・・ > ※まだ、kai_option を使っているのですが、これは後で別途相談を・・・ > > この状態で、kai_memcache を途中まで修正してみたのですが > put クエリ対応がカオスになってしまいました。 > --- > handle_call(Data, [{packet, line}] = State) -> > dispatch(string:tokens(binary_to_list(Data), " \r\n"), State). > > dispatch(["set", Key, Flags, "0", Bytes], [{packet, line}] = State) -> > { > setopts, > [{packet, raw}], > Bytes, > [{packet, raw}, {state, Key, Flags}] > }; > dispatch(["set", Key, Flags, Exptime, Bytes], [{packet, line}] = State) -> > {reply, "CLIENT_ERROR Exptime must be zero.\r\n", State}. > > handle_call(Value, [{packet, raw}, {state, Key, Flags}] = State) -> > Data = #data{key=Key, flags=Flags, value=Value}, > case kai_coordinator:route({put, Data}) of > ok -> > {reply, <<"STORED\r\n">>, State}; > _Other -> > send_error_and_close("Failed to read.", State) > end. > --- > 作りかけなので、上記は、下記のようなバグを持っています。 > ・<<"STORED\r\n">> した後に {packet, line} に戻していない > ・Value の後に続く、<<"\r\n">> を受信しきっていない > > で、今後の対応として、下記の三つを考えております。 > 1.このまま続ける。 > Mod:handle_call/2 に gen_tcp:send しつつ inet:setopts するモードを追加すれば > このままいけそうな気がしています。カオスですが・・・。 > > 2.Mod:handle_call に Socket を渡してしまう。 > {packet, line} だけ、kai_tcp_server に任せ、複雑な事は Mod で行ってしまおうかと。 > 個人的には、これが一番良いかな?と思っています。 > > 3.Mod に gen_tcp:recv や gen_tcp:send を完全に任せる。 > http://d.hatena.ne.jp/cooldaemon/20080624/1214315157 > これに近い感じです。(そのままは使いません) > > と言う事で、意見募集中です。 > > 2008/6/25 Takeru INOUE <tak...@gm...>: >>> では、諸々考慮しつつ、kai へ組み込んでみますね。 >> >> はい,ガンガン進めちゃってください. >> >>> 念のため、branch を作ります。 >>> >>> embed_tcp_server >>> >>> と言う branch で、如何でしょうか? >> >> それでもいいですし,kai/branches/cooldaemon/hoge/ >> のようにアカウント名でディレクトリを掘ったほうが気楽であれば,こっちでもいいです. >> >> >>> 2008/6/25 Takeru INOUE <tak...@gm...>: >>>>> おー、この方が素敵ですね! >>>>> tcp_server.erl 用に behaviour を作っても良いかもしれませんね。 >>>> >>>> Kai に限定されない,汎用モジュールっぽくていい感じです :-) >>>> >>>>> あと、kai の場合は、tcp_server.erl 二つ(api と memcache)起動する必要があるので >>>>> supervisor 二重起動を許可しないといけませんね。 >>>>> (確認とってませんが、確か、同名の supervisor は起動できないハズ) >>>> >>>> そんな制約があるかもなのですね. >>>> >>>>> そう言えば、TrapExit かどこかで >>>>> application、supervisor、gen_server を >>>>> 一ファイルに記述する方法が掲載されていました。 >>>> >>>> いろんな技があるのですねぇ. >>>> 僕はそういうサイトを読み込めてないので,車輪の再発明をしてそうです.. >>>> >>>>> 今回の、tcp_server.erl は、supervisor と proc_lib が同居しているので >>>>> module として持ち運びが簡単かなぁと思うのですが >>>>> コード量によっては、分割した方が良い気もします。 >>>>> (今回のファイルサイズであれば、分割は不要だと思います) >>>> >>>> 今回も迷ったのですが,何となく一つのファイルにまとめてみて,そのままにしてあります. >>>> 書きやすさ・読みやすさに合わせて分割してしまってください. >>>> >>>>> 2008/6/25 Takeru INOUE <tak...@gm...>: >>>>>>> http://d.hatena.ne.jp/cooldaemon/20071024/1193193093 >>>>>>> ここの Server Design のアスキーアートをベースに話をします。 >>>>>>> >>>>>>> tcp_server_sup は、tcp_acceptor と tcp_client_sup を起動し監視下に置きます。 >>>>>>> その際、tcp_acceptor を、最大接続数分 起動します。 >>>>>> >>>>>> これを読んで合点がいきました. >>>>>> >>>>>>> http://d.hatena.ne.jp/cooldaemon/20080624 >>>>>>> こんな感じで、どうでしょうか? >>>>>> >>>>>> 素晴らしいです. >>>>>> >>>>>> せっかくなので,完全に OTP にしてみました. >>>>>> 使いやすくなってるかは微妙.. >>>>>> >>>>>> たけまる / 続・Erlang で Apache worker MPM っぽいこと >>>>>> http://teahut.sakura.ne.jp/b/2008-06-25-1.html >>>>>> >>>>>>> Mochiweb 方式より、accept 待ちプロセスを複数持つ方式の方が >>>>>>> シンプルでコード量が少ないですねぇ >>>>>> >>>>>> そういう気がします. >>>>>> 同時に accept できるというのは比較的新しい機能のようですね. >>>>>> >>>>>>> 2008/6/24 masahito ikuta <coo...@gm...>: >>>>>>>>> 僕がイメージしていたのは,つねに一定数のプロセスを起動しておいて,暇なやつにリクエストを処理させる >>>>>>>>> (暇やつがいなければリクエストを待たせておく) という振る舞いでした. >>>>>>>> >>>>>>>> メール&ブログのエントリを拝見致しましたが >>>>>>>> たけまるさんと私の考え方は >>>>>>>> 一致しているかなーと思います。 >>>>>>>> ※私が勘違いしているかも? >>>>>>>> >>>>>>>>> cooldaemon さんの方法だと,プロセスの死活監視はできるのですが,プロセス数が一定ではないので,同時接続数を制限することはできません. >>>>>>>> >>>>>>>> Mochiweb もそうなのですが >>>>>>>> accept した時点で、現在のプロセス数をインクリメントし >>>>>>>> 最大接続数に達した時点で、accept を止めます。 >>>>>>>> >>>>>>>> プロセスが終了する度、EXIT メッセージが親に通達されるので >>>>>>>> プロセス数をデクリメントします。 >>>>>>>> (accept ループを抜けていた場合は、再開) >>>>>>>> >>>>>>>> なんとなくですが >>>>>>>> 私は、accept するプロセスをプーリングする方式の方が >>>>>>>> 速度が出そうな気がしますけれど。 >>>>>>>> >>>>>>>>> cooldaemon さんの方法は,プロセスを増やしながら生死を管理するための高度な方法です. >>>>>>>> >>>>>>>> ついでに、kai_api, kai_memcache のコードの共通化も可能です。 >>>>>>>> >>>>>>>> で、両者の良いとこ取りを出来ないかと思い >>>>>>>> >>>>>>>>>> spawn のコストが高くなった時点で >>>>>>>>>> acceptor をプーリングしておく方式に切り替える事も >>>>>>>>>> 検討材料として残しつつ、作業を進めます。 >>>>>>>>>> >>>>>>>>>> その場合は、tcp_client_sup がプロセスの死活監視を行う事になります。 >>>>>>>>>> (名前は、kai_tcp_client_sup とかが良いでしょうか?) >>>>>>>> >>>>>>>> と書いたのですが、これの説明が悪いので、もう少しだけ補足を書かせて下さい。 >>>>>>>> >>>>>>>> http://d.hatena.ne.jp/cooldaemon/20071024/1193193093 >>>>>>>> ここの Server Design のアスキーアートをベースに話をします。 >>>>>>>> >>>>>>>> tcp_server_sup は、tcp_acceptor と tcp_client_sup を起動し監視下に置きます。 >>>>>>>> その際、tcp_acceptor を、最大接続数分 起動します。 >>>>>>>> >>>>>>>> 接続があると、tcp_acceptor は >>>>>>>> tcp_client_sup に tcp_echo(kai_memcache) を起動しなさい!と >>>>>>>> メッセージを送ります。 >>>>>>>> >>>>>>>> 接続時に spawn しているので tcp_acceptor を複数起動するメリットが >>>>>>>> accept ループを出たり入ったりする処理を >>>>>>>> 書かなくて良い点だけになってしまいますが・・・。 >>>>>>>> (単一プロセスのループ処理を、複数プロセスに置き換えているところが >>>>>>>> Erlang っぽくて萌えるのですがw;) >>>>>>>> >>>>>>>> 死活監視と接続最大数は別の話だとは思いつつも >>>>>>>> proc_lib の下に proc_lib や普通のプロセス(?) を配置すると >>>>>>>> OTP の恩恵を受けられないので、何とかならないかなぁと思ってます。 >>>>>>>> >>>>>>>>> これに懲りずにおつきあいくださいませ. >>>>>>>> >>>>>>>> いやー、こういう話がないと、開発してる気分になれない気が(w; >>>>>>>> お気になさらずにー。 >>>>>>>> >>>>>>>> 2008/6/23 Takeru INOUE <tak...@gm...>: >>>>>>>>> 井上 (たけまる) です. >>>>>>>>> >>>>>>>>> すいません,少し勘違いしていました. >>>>>>>>> >>>>>>>>> 今回やろうとしていたことは,同時接続数の制限です (という言い方をすれば誤解がなかったのか). >>>>>>>>> よく考えれば, >>>>>>>>> >>>>>>>>> - プロセスの生死を管理すること >>>>>>>>> - 同時接続数を制限すること >>>>>>>>> >>>>>>>>> これらは別の話ですね. >>>>>>>>> >>>>>>>>> 僕がイメージしていたのは,つねに一定数のプロセスを起動しておいて,暇なやつにリクエストを処理させる >>>>>>>>> (暇やつがいなければリクエストを待たせておく) という振る舞いでした. >>>>>>>>> cooldaemon さんの方法だと,プロセスの死活監視はできるのですが,プロセス数が一定ではないので,同時接続数を制限することはできません. >>>>>>>>> >>>>>>>>> cooldaemon さんの方法は,プロセスを増やしながら生死を管理するための高度な方法です. >>>>>>>>> 今回の局面で使うには少し違うかも,という気がしています. >>>>>>>>> 僕のイメージとは少し違ったのですが,有用な方法であることは間違いないので,どこかで役に立つと思います >>>>>>>>> (まだ勘違いしてるかもしれないので,気づいた点がありましたら指摘してください><). >>>>>>>>> >>>>>>>>> 詳しくはブログに書きました. >>>>>>>>> >>>>>>>>> たけまる / Erlang で Apache worker MPM っぽいこと >>>>>>>>> http://teahut.sakura.ne.jp/b/2008-06-23-1.html >>>>>>>>> >>>>>>>>> というわけで,混乱させてしまってすみません m(_ _)m >>>>>>>>> これに懲りずにおつきあいくださいませ. >>>>>>>>> >>>>>>>>> >>>>>>>>> 2008/6/23 masahito ikuta <coo...@gm...>: >>>>>>>>>>> ただこの方法だと worker の生死管理を自分で書かないといけないので,cooldaemon さんの方法のがよさそうです. >>>>>>>>>> >>>>>>>>>> spawn のコストが高くなった時点で >>>>>>>>>> acceptor をプーリングしておく方式に切り替える事も >>>>>>>>>> 検討材料として残しつつ、作業を進めます。 >>>>>>>>>> >>>>>>>>>> その場合は、tcp_client_sup がプロセスの死活監視を行う事になります。 >>>>>>>>>> (名前は、kai_tcp_client_sup とかが良いでしょうか?) >>>>>>>>>> >>>>>>>>>> 2008/6/23 Takeru INOUE <tak...@gm...>: >>>>>>>>>>>>>>- kai_api, kai_memcache のプロセスプール >>>>>>>>>>>>> >>>>>>>>>>>>> こちらの作業内容を >>>>>>>>>>>>> もう少し詳しく教えて頂いて宜しいでしょうか? >>>>>>>>>>>>> (何となく、参加できそうな気がしたので・・・) >>>>>>>>>>>> >>>>>>>>>>>> http://d.hatena.ne.jp/cooldaemon/20071024/1193193093 >>>>>>>>>>>> ↑この仕組みで汎用化してしまい >>>>>>>>>>>> tcp_acceptor の箇所で接続数の制限を行うのは >>>>>>>>>>>> 如何でしょうか? >>>>>>>>>>> >>>>>>>>>>> はい,そんな感じです. >>>>>>>>>>> >>>>>>>>>>> やろうとしていることは,『プログラミングErlang』14.1 の最後に書いてあることそのままです. >>>>>>>>>>> >>>>>>>>>>> | Erlang バージョン R11B-3 では,1つの待ち受け用ソケットに >>>>>>>>>>> | 対して複数の Erlang プロセスが gen_tcp:accept/1 を呼び出すことが >>>>>>>>>>> | できる.この機能を利用すれば,前もって生成しておいたプロセスのプー >>>>>>>>>>> | ルを用意しておいて,その各プロセスを gen_tcp:accept/1 で接続待ち >>>>>>>>>>> | 状態にしておくことができるので,並列サーバを作るのが簡単になる.(p.207) >>>>>>>>>>> >>>>>>>>>>> 僕がどうするつもりだったかというと,わりと適当にしか考えてなくて,『プログラミングErlang』付録D に出てくる lib_chan_cs >>>>>>>>>>> のように,accept 待ちのプロセスを指定した数だけ spawn しておけばいいかなくらいに思ってました. >>>>>>>>>>> >>>>>>>>>>> possibly_start_another(false, Listen, Active, Fun, max) -> >>>>>>>>>>> case length(Active) of >>>>>>>>>>> N when N < Max -> % worker 数が Max 未満なら >>>>>>>>>>> New = start_accept(Listen, Fun), % accept 待ちプロセスを起動 >>>>>>>>>>> >>>>>>>>>>> ただこの方法だと worker の生死管理を自分で書かないといけないので,cooldaemon さんの方法のがよさそうです. >>>>>>>>>>> というわけで,いけそうなら sourceforge の tracker で自分にアサインしちゃってください. >>>>>>>>>>> kai_api と kai_memcache がありますが,kai_memcache のほうがデバッグしやすい気がします. >>>>>>>>>>> >>>>>>>>>>> ちなみに,プロセスプールを TODO に入れた理由は次のとおりです. >>>>>>>>>>> いまの Kai は,毎秒数百リクエストを送りつけると負荷が高くなって,メンバシップの管理ができなくなり,クラスタが分解してしまいます. >>>>>>>>>>> これを回避できるとしたら,API の受け付け数を制限するしかないかなと. >>>>>>>>>>> 『プログラミングErlang』でも,この機能をトラフィックシェーピング (流量制御) と読んでますね. >>>>>>>>>>> >>>>>>>>>>> >>>>>>>>>>>> 2008/6/23 masahito ikuta <coo...@gm...>: >>>>>>>>>>>>> cooldaemon です。 >>>>>>>>>>>>> >>>>>>>>>>>>>>- kai_api, kai_memcache のプロセスプール >>>>>>>>>>>>> >>>>>>>>>>>>> こちらの作業内容を >>>>>>>>>>>>> もう少し詳しく教えて頂いて宜しいでしょうか? >>>>>>>>>>>>> (何となく、参加できそうな気がしたので・・・) >>>>>>>>>>>>> >>>>>>>>>>>>>>チューニングの類 (特にトリッキーなコードを伴うもの) は後回しにしたいと思います. >>>>>>>>>>>>> >>>>>>>>>>>>> とても細かい話で申し訳ないのですが・・・ >>>>>>>>>>>>> 現在、make すると src ディレクトリ配下に beam ファイルが出来てしまうので >>>>>>>>>>>>> OTP っぽく ebin ディレクトリ配下に配置したいと思いますが、如何でしょうか? >>>>>>>>>>>>> (autotools に対応する気力は無いのですが orz) >>>>>>>>>>>>> >>>>>>>>>>>>> >>>>>>>>>>>>> 2008/6/22 Takeru INOUE <tak...@gm...>: >>>>>>>>>>>>>> 井上 (たけまる) です. >>>>>>>>>>>>>> >>>>>>>>>>>>>> 6/19 にこのメールを送ったのですが,sourceforge の作業中だったから送られてないようなので (archive に表示されない),再送します. >>>>>>>>>>>>>> >>>>>>>>>>>>>> >>>>>>>>>>>>>> ---------- Forwarded message ---------- >>>>>>>>>>>>>> From: Takeru INOUE <tak...@gm...> >>>>>>>>>>>>>> Date: 2008/6/19 >>>>>>>>>>>>>> Subject: 開発の進め方 >>>>>>>>>>>>>> To: kai...@li... >>>>>>>>>>>>>> >>>>>>>>>>>>>> >>>>>>>>>>>>>> 井上 (たけまる) です. >>>>>>>>>>>>>> >>>>>>>>>>>>>> きのうは勉強会に参加いただきありがとうございました. >>>>>>>>>>>>>> お陰様で,面白い会になったと思います. >>>>>>>>>>>>>> >>>>>>>>>>>>>> さて,開発の進め方についてです. >>>>>>>>>>>>>> >>>>>>>>>>>>>> まず,発表で言ったように,kai_memcache から coordinator の機能を分離しておきます. >>>>>>>>>>>>>> また,kai_version という空のモジュールを作っておきます. >>>>>>>>>>>>>> これで,基本的なモジュール構成が固まるので,開発しやすくなると思います. >>>>>>>>>>>>>> >>>>>>>>>>>>>> 次に,実装の順序についてです. >>>>>>>>>>>>>> >>>>>>>>>>>>>> 基本的には好きなところから実装してもらって構わないと思うのですが,次のようなのが他の部分への影響が少なく取りかかりやすいでしょうか (面白みも少ないけど). >>>>>>>>>>>>>> >>>>>>>>>>>>>> - ./configure >>>>>>>>>>>>>> - test_server >>>>>>>>>>>>>> - kai_store の永続化 >>>>>>>>>>>>>> - kai_api, kai_memcache のプロセスプール >>>>>>>>>>>>>> >>>>>>>>>>>>>> チューニングの類 (特にトリッキーなコードを伴うもの) は後回しにしたいと思います. >>>>>>>>>>>>>> >>>>>>>>>>>>>> コミッタは 5-10名と多くないので,管理はゆるめで進めたいです. >>>>>>>>>>>>>> 早い者勝ちで手を挙げた人が実装してみて,行き詰まったら ML などでヘルプを求めるというのでいいかなぁ. >>>>>>>>>>>>>> 誰が取り組んでいるかを知るために,sourceforge の Tracker を使うべきかなぁ. >>>>>>>>>>>>>> 適当にブランチを切って自由に進めてもらって,落ち着いたところで merge するというので大丈夫だろうか. >>>>>>>>>>>>>> モジュールのインタフェースが変更されるときは気をつけないといけないけど (merge は僕がやったほうがいいのかも). >>>>>>>>>>>>>> >>>>>>>>>>>>>> といったあたりについて意見を聞かせてください. >>>>>>>>>>>>>> >>>>>>>>>>>>>> # こういった開発者のための意識合わせ的なことは,Wiki にまとめて後で周知します. >>>>>>>>>>>>>> >>>>>>>>>>>>>> # うまく回り始めたら,僕は全体のコーディネートにまわるつもりです. >>>>>>>>>>>>>> >>>>>>>>>>>>>> -- >>>>>>>>>>>>>> Takeru INOUE <tak...@gm...> >>>>>>>>>>>>>> >>>>>>>>>>>>>> ------------------------------------------------------------------------- >>>>>>>>>>>>>> Check out the new SourceForge.net Marketplace. >>>>>>>>>>>>>> It's the best place to buy or sell services for >>>>>>>>>>>>>> just about anything Open Source. >>>>>>>>>>>>>> http://sourceforge.net/services/buy/index.php >>>>>>>>>>>>>> _______________________________________________ >>>>>>>>>>>>>> Kai-devel-ja mailing list >>>>>>>>>>>>>> Kai...@li... >>>>>>>>>>>>>> https://lists.sourceforge.net/lists/listinfo/kai-devel-ja >>>>>>>>>>>>>> >>>>>>>>>>>>> >>>>>>>>>>>>> >>>>>>>>>>>>> >>>>>>>>>>>>> -- >>>>>>>>>>>>> cooldaemon >>>>>>>>>>>>> >>>>>>>>>>>> >>>>>>>>>>>> >>>>>>>>>>>> >>>>>>>>>>>> -- >>>>>>>>>>>> cooldaemon >>>>>>>>>>>> >>>>>>>>>>> >>>>>>>>>>> >>>>>>>>>>> >>>>>>>>>>> -- >>>>>>>>>>> Takeru INOUE <tak...@gm...> >>>>>>>>>>> >>>>>>>>>> >>>>>>>>>> >>>>>>>>>> >>>>>>>>>> -- >>>>>>>>>> cooldaemon >>>>>>>>>> >>>>>>>>> >>>>>>>>> >>>>>>>>> >>>>>>>>> -- >>>>>>>>> Takeru INOUE <tak...@gm...> >>>>>>>>> >>>>>>>> >>>>>>>> >>>>>>>> >>>>>>>> -- >>>>>>>> cooldaemon >>>>>>>> >>>>>>>> ------------------------------------------------------------------------- >>>>>>>> Check out the new SourceForge.net Marketplace. >>>>>>>> It's the best place to buy or sell services for >>>>>>>> just about anything Open Source. >>>>>>>> http://sourceforge.net/services/buy/index.php >>>>>>>> _______________________________________________ >>>>>>>> Kai-devel-ja mailing list >>>>>>>> Kai...@li... >>>>>>>> https://lists.sourceforge.net/lists/listinfo/kai-devel-ja >>>>>>>> >>>>>>> >>>>>>> >>>>>>> >>>>>>> -- >>>>>>> cooldaemon >>>>>>> >>>>>> >>>>>> >>>>>> >>>>>> -- >>>>>> Takeru INOUE <tak...@gm...> >>>>>> >>>>> >>>>> >>>>> >>>>> -- >>>>> cooldaemon >>>>> >>>> >>>> >>>> >>>> -- >>>> Takeru INOUE <tak...@gm...> >>>> >>> >>> >>> >>> -- >>> cooldaemon >>> >> >> >> >> -- >> Takeru INOUE <tak...@gm...> >> > > > > -- > cooldaemon > -- Takeru INOUE <tak...@gm...> |
From: masahito i. <coo...@gm...> - 2008-06-30 15:04:11
|
自分の才能の無さに絶望したので、お知恵を拝借させて下さい orz 下記、kai_tcp_server のコード片です。 --- acceptor_loop(Socket, State, Mod, Option) -> case gen_tcp:recv( Socket, Option:get(recv_length), Option:get(recv_timeout) ) of {ok, Data} -> case Mod:handle_call(Data, State) of {reply, DataToSend, State} -> gen_tcp:send(Socket, DataToSend), acceptor_loop(Socket, State, Mod, Option); {noreply, State} -> acceptor_loop(Socket, State, Mod, Option); {setopts, SocketOptions, RecvLength, State} -> inet:setopts(Socket, SocketOptions), NewOption = kai_option:new( [ {recv_length, RecvLength}, {recv_timeout, Option:get(recv_timeout)} ], ?DEFAULT_OPT_PROP ), acceptor_loop(Socket, State, Mod, NewOption); {close, DataToSend, State} -> gen_tcp:send(Socket, DataToSend), gen_tcp:close(Socket); _Error -> gen_tcp:close(Socket) end; {error, Reason} -> exit({error, Reason}) end. --- たけまるさん版に改良を加え Mod:handle_call/2 に {setopts, SocketOptions, RecvLength, State} という戻り値を加えてみました。 こうする事で、{packet, line} <-> {packet, raw} のオプション変更に対応しています。 ※RecvLength あたりが美しくないですよね・・・ ※まだ、kai_option を使っているのですが、これは後で別途相談を・・・ この状態で、kai_memcache を途中まで修正してみたのですが put クエリ対応がカオスになってしまいました。 --- handle_call(Data, [{packet, line}] = State) -> dispatch(string:tokens(binary_to_list(Data), " \r\n"), State). dispatch(["set", Key, Flags, "0", Bytes], [{packet, line}] = State) -> { setopts, [{packet, raw}], Bytes, [{packet, raw}, {state, Key, Flags}] }; dispatch(["set", Key, Flags, Exptime, Bytes], [{packet, line}] = State) -> {reply, "CLIENT_ERROR Exptime must be zero.\r\n", State}. handle_call(Value, [{packet, raw}, {state, Key, Flags}] = State) -> Data = #data{key=Key, flags=Flags, value=Value}, case kai_coordinator:route({put, Data}) of ok -> {reply, <<"STORED\r\n">>, State}; _Other -> send_error_and_close("Failed to read.", State) end. --- 作りかけなので、上記は、下記のようなバグを持っています。 ・<<"STORED\r\n">> した後に {packet, line} に戻していない ・Value の後に続く、<<"\r\n">> を受信しきっていない で、今後の対応として、下記の三つを考えております。 1.このまま続ける。 Mod:handle_call/2 に gen_tcp:send しつつ inet:setopts するモードを追加すれば このままいけそうな気がしています。カオスですが・・・。 2.Mod:handle_call に Socket を渡してしまう。 {packet, line} だけ、kai_tcp_server に任せ、複雑な事は Mod で行ってしまおうかと。 個人的には、これが一番良いかな?と思っています。 3.Mod に gen_tcp:recv や gen_tcp:send を完全に任せる。 http://d.hatena.ne.jp/cooldaemon/20080624/1214315157 これに近い感じです。(そのままは使いません) と言う事で、意見募集中です。 2008/6/25 Takeru INOUE <tak...@gm...>: >> では、諸々考慮しつつ、kai へ組み込んでみますね。 > > はい,ガンガン進めちゃってください. > >> 念のため、branch を作ります。 >> >> embed_tcp_server >> >> と言う branch で、如何でしょうか? > > それでもいいですし,kai/branches/cooldaemon/hoge/ > のようにアカウント名でディレクトリを掘ったほうが気楽であれば,こっちでもいいです. > > >> 2008/6/25 Takeru INOUE <tak...@gm...>: >>>> おー、この方が素敵ですね! >>>> tcp_server.erl 用に behaviour を作っても良いかもしれませんね。 >>> >>> Kai に限定されない,汎用モジュールっぽくていい感じです :-) >>> >>>> あと、kai の場合は、tcp_server.erl 二つ(api と memcache)起動する必要があるので >>>> supervisor 二重起動を許可しないといけませんね。 >>>> (確認とってませんが、確か、同名の supervisor は起動できないハズ) >>> >>> そんな制約があるかもなのですね. >>> >>>> そう言えば、TrapExit かどこかで >>>> application、supervisor、gen_server を >>>> 一ファイルに記述する方法が掲載されていました。 >>> >>> いろんな技があるのですねぇ. >>> 僕はそういうサイトを読み込めてないので,車輪の再発明をしてそうです.. >>> >>>> 今回の、tcp_server.erl は、supervisor と proc_lib が同居しているので >>>> module として持ち運びが簡単かなぁと思うのですが >>>> コード量によっては、分割した方が良い気もします。 >>>> (今回のファイルサイズであれば、分割は不要だと思います) >>> >>> 今回も迷ったのですが,何となく一つのファイルにまとめてみて,そのままにしてあります. >>> 書きやすさ・読みやすさに合わせて分割してしまってください. >>> >>>> 2008/6/25 Takeru INOUE <tak...@gm...>: >>>>>> http://d.hatena.ne.jp/cooldaemon/20071024/1193193093 >>>>>> ここの Server Design のアスキーアートをベースに話をします。 >>>>>> >>>>>> tcp_server_sup は、tcp_acceptor と tcp_client_sup を起動し監視下に置きます。 >>>>>> その際、tcp_acceptor を、最大接続数分 起動します。 >>>>> >>>>> これを読んで合点がいきました. >>>>> >>>>>> http://d.hatena.ne.jp/cooldaemon/20080624 >>>>>> こんな感じで、どうでしょうか? >>>>> >>>>> 素晴らしいです. >>>>> >>>>> せっかくなので,完全に OTP にしてみました. >>>>> 使いやすくなってるかは微妙.. >>>>> >>>>> たけまる / 続・Erlang で Apache worker MPM っぽいこと >>>>> http://teahut.sakura.ne.jp/b/2008-06-25-1.html >>>>> >>>>>> Mochiweb 方式より、accept 待ちプロセスを複数持つ方式の方が >>>>>> シンプルでコード量が少ないですねぇ >>>>> >>>>> そういう気がします. >>>>> 同時に accept できるというのは比較的新しい機能のようですね. >>>>> >>>>>> 2008/6/24 masahito ikuta <coo...@gm...>: >>>>>>>> 僕がイメージしていたのは,つねに一定数のプロセスを起動しておいて,暇なやつにリクエストを処理させる >>>>>>>> (暇やつがいなければリクエストを待たせておく) という振る舞いでした. >>>>>>> >>>>>>> メール&ブログのエントリを拝見致しましたが >>>>>>> たけまるさんと私の考え方は >>>>>>> 一致しているかなーと思います。 >>>>>>> ※私が勘違いしているかも? >>>>>>> >>>>>>>> cooldaemon さんの方法だと,プロセスの死活監視はできるのですが,プロセス数が一定ではないので,同時接続数を制限することはできません. >>>>>>> >>>>>>> Mochiweb もそうなのですが >>>>>>> accept した時点で、現在のプロセス数をインクリメントし >>>>>>> 最大接続数に達した時点で、accept を止めます。 >>>>>>> >>>>>>> プロセスが終了する度、EXIT メッセージが親に通達されるので >>>>>>> プロセス数をデクリメントします。 >>>>>>> (accept ループを抜けていた場合は、再開) >>>>>>> >>>>>>> なんとなくですが >>>>>>> 私は、accept するプロセスをプーリングする方式の方が >>>>>>> 速度が出そうな気がしますけれど。 >>>>>>> >>>>>>>> cooldaemon さんの方法は,プロセスを増やしながら生死を管理するための高度な方法です. >>>>>>> >>>>>>> ついでに、kai_api, kai_memcache のコードの共通化も可能です。 >>>>>>> >>>>>>> で、両者の良いとこ取りを出来ないかと思い >>>>>>> >>>>>>>>> spawn のコストが高くなった時点で >>>>>>>>> acceptor をプーリングしておく方式に切り替える事も >>>>>>>>> 検討材料として残しつつ、作業を進めます。 >>>>>>>>> >>>>>>>>> その場合は、tcp_client_sup がプロセスの死活監視を行う事になります。 >>>>>>>>> (名前は、kai_tcp_client_sup とかが良いでしょうか?) >>>>>>> >>>>>>> と書いたのですが、これの説明が悪いので、もう少しだけ補足を書かせて下さい。 >>>>>>> >>>>>>> http://d.hatena.ne.jp/cooldaemon/20071024/1193193093 >>>>>>> ここの Server Design のアスキーアートをベースに話をします。 >>>>>>> >>>>>>> tcp_server_sup は、tcp_acceptor と tcp_client_sup を起動し監視下に置きます。 >>>>>>> その際、tcp_acceptor を、最大接続数分 起動します。 >>>>>>> >>>>>>> 接続があると、tcp_acceptor は >>>>>>> tcp_client_sup に tcp_echo(kai_memcache) を起動しなさい!と >>>>>>> メッセージを送ります。 >>>>>>> >>>>>>> 接続時に spawn しているので tcp_acceptor を複数起動するメリットが >>>>>>> accept ループを出たり入ったりする処理を >>>>>>> 書かなくて良い点だけになってしまいますが・・・。 >>>>>>> (単一プロセスのループ処理を、複数プロセスに置き換えているところが >>>>>>> Erlang っぽくて萌えるのですがw;) >>>>>>> >>>>>>> 死活監視と接続最大数は別の話だとは思いつつも >>>>>>> proc_lib の下に proc_lib や普通のプロセス(?) を配置すると >>>>>>> OTP の恩恵を受けられないので、何とかならないかなぁと思ってます。 >>>>>>> >>>>>>>> これに懲りずにおつきあいくださいませ. >>>>>>> >>>>>>> いやー、こういう話がないと、開発してる気分になれない気が(w; >>>>>>> お気になさらずにー。 >>>>>>> >>>>>>> 2008/6/23 Takeru INOUE <tak...@gm...>: >>>>>>>> 井上 (たけまる) です. >>>>>>>> >>>>>>>> すいません,少し勘違いしていました. >>>>>>>> >>>>>>>> 今回やろうとしていたことは,同時接続数の制限です (という言い方をすれば誤解がなかったのか). >>>>>>>> よく考えれば, >>>>>>>> >>>>>>>> - プロセスの生死を管理すること >>>>>>>> - 同時接続数を制限すること >>>>>>>> >>>>>>>> これらは別の話ですね. >>>>>>>> >>>>>>>> 僕がイメージしていたのは,つねに一定数のプロセスを起動しておいて,暇なやつにリクエストを処理させる >>>>>>>> (暇やつがいなければリクエストを待たせておく) という振る舞いでした. >>>>>>>> cooldaemon さんの方法だと,プロセスの死活監視はできるのですが,プロセス数が一定ではないので,同時接続数を制限することはできません. >>>>>>>> >>>>>>>> cooldaemon さんの方法は,プロセスを増やしながら生死を管理するための高度な方法です. >>>>>>>> 今回の局面で使うには少し違うかも,という気がしています. >>>>>>>> 僕のイメージとは少し違ったのですが,有用な方法であることは間違いないので,どこかで役に立つと思います >>>>>>>> (まだ勘違いしてるかもしれないので,気づいた点がありましたら指摘してください><). >>>>>>>> >>>>>>>> 詳しくはブログに書きました. >>>>>>>> >>>>>>>> たけまる / Erlang で Apache worker MPM っぽいこと >>>>>>>> http://teahut.sakura.ne.jp/b/2008-06-23-1.html >>>>>>>> >>>>>>>> というわけで,混乱させてしまってすみません m(_ _)m >>>>>>>> これに懲りずにおつきあいくださいませ. >>>>>>>> >>>>>>>> >>>>>>>> 2008/6/23 masahito ikuta <coo...@gm...>: >>>>>>>>>> ただこの方法だと worker の生死管理を自分で書かないといけないので,cooldaemon さんの方法のがよさそうです. >>>>>>>>> >>>>>>>>> spawn のコストが高くなった時点で >>>>>>>>> acceptor をプーリングしておく方式に切り替える事も >>>>>>>>> 検討材料として残しつつ、作業を進めます。 >>>>>>>>> >>>>>>>>> その場合は、tcp_client_sup がプロセスの死活監視を行う事になります。 >>>>>>>>> (名前は、kai_tcp_client_sup とかが良いでしょうか?) >>>>>>>>> >>>>>>>>> 2008/6/23 Takeru INOUE <tak...@gm...>: >>>>>>>>>>>>>- kai_api, kai_memcache のプロセスプール >>>>>>>>>>>> >>>>>>>>>>>> こちらの作業内容を >>>>>>>>>>>> もう少し詳しく教えて頂いて宜しいでしょうか? >>>>>>>>>>>> (何となく、参加できそうな気がしたので・・・) >>>>>>>>>>> >>>>>>>>>>> http://d.hatena.ne.jp/cooldaemon/20071024/1193193093 >>>>>>>>>>> ↑この仕組みで汎用化してしまい >>>>>>>>>>> tcp_acceptor の箇所で接続数の制限を行うのは >>>>>>>>>>> 如何でしょうか? >>>>>>>>>> >>>>>>>>>> はい,そんな感じです. >>>>>>>>>> >>>>>>>>>> やろうとしていることは,『プログラミングErlang』14.1 の最後に書いてあることそのままです. >>>>>>>>>> >>>>>>>>>> | Erlang バージョン R11B-3 では,1つの待ち受け用ソケットに >>>>>>>>>> | 対して複数の Erlang プロセスが gen_tcp:accept/1 を呼び出すことが >>>>>>>>>> | できる.この機能を利用すれば,前もって生成しておいたプロセスのプー >>>>>>>>>> | ルを用意しておいて,その各プロセスを gen_tcp:accept/1 で接続待ち >>>>>>>>>> | 状態にしておくことができるので,並列サーバを作るのが簡単になる.(p.207) >>>>>>>>>> >>>>>>>>>> 僕がどうするつもりだったかというと,わりと適当にしか考えてなくて,『プログラミングErlang』付録D に出てくる lib_chan_cs >>>>>>>>>> のように,accept 待ちのプロセスを指定した数だけ spawn しておけばいいかなくらいに思ってました. >>>>>>>>>> >>>>>>>>>> possibly_start_another(false, Listen, Active, Fun, max) -> >>>>>>>>>> case length(Active) of >>>>>>>>>> N when N < Max -> % worker 数が Max 未満なら >>>>>>>>>> New = start_accept(Listen, Fun), % accept 待ちプロセスを起動 >>>>>>>>>> >>>>>>>>>> ただこの方法だと worker の生死管理を自分で書かないといけないので,cooldaemon さんの方法のがよさそうです. >>>>>>>>>> というわけで,いけそうなら sourceforge の tracker で自分にアサインしちゃってください. >>>>>>>>>> kai_api と kai_memcache がありますが,kai_memcache のほうがデバッグしやすい気がします. >>>>>>>>>> >>>>>>>>>> ちなみに,プロセスプールを TODO に入れた理由は次のとおりです. >>>>>>>>>> いまの Kai は,毎秒数百リクエストを送りつけると負荷が高くなって,メンバシップの管理ができなくなり,クラスタが分解してしまいます. >>>>>>>>>> これを回避できるとしたら,API の受け付け数を制限するしかないかなと. >>>>>>>>>> 『プログラミングErlang』でも,この機能をトラフィックシェーピング (流量制御) と読んでますね. >>>>>>>>>> >>>>>>>>>> >>>>>>>>>>> 2008/6/23 masahito ikuta <coo...@gm...>: >>>>>>>>>>>> cooldaemon です。 >>>>>>>>>>>> >>>>>>>>>>>>>- kai_api, kai_memcache のプロセスプール >>>>>>>>>>>> >>>>>>>>>>>> こちらの作業内容を >>>>>>>>>>>> もう少し詳しく教えて頂いて宜しいでしょうか? >>>>>>>>>>>> (何となく、参加できそうな気がしたので・・・) >>>>>>>>>>>> >>>>>>>>>>>>>チューニングの類 (特にトリッキーなコードを伴うもの) は後回しにしたいと思います. >>>>>>>>>>>> >>>>>>>>>>>> とても細かい話で申し訳ないのですが・・・ >>>>>>>>>>>> 現在、make すると src ディレクトリ配下に beam ファイルが出来てしまうので >>>>>>>>>>>> OTP っぽく ebin ディレクトリ配下に配置したいと思いますが、如何でしょうか? >>>>>>>>>>>> (autotools に対応する気力は無いのですが orz) >>>>>>>>>>>> >>>>>>>>>>>> >>>>>>>>>>>> 2008/6/22 Takeru INOUE <tak...@gm...>: >>>>>>>>>>>>> 井上 (たけまる) です. >>>>>>>>>>>>> >>>>>>>>>>>>> 6/19 にこのメールを送ったのですが,sourceforge の作業中だったから送られてないようなので (archive に表示されない),再送します. >>>>>>>>>>>>> >>>>>>>>>>>>> >>>>>>>>>>>>> ---------- Forwarded message ---------- >>>>>>>>>>>>> From: Takeru INOUE <tak...@gm...> >>>>>>>>>>>>> Date: 2008/6/19 >>>>>>>>>>>>> Subject: 開発の進め方 >>>>>>>>>>>>> To: kai...@li... >>>>>>>>>>>>> >>>>>>>>>>>>> >>>>>>>>>>>>> 井上 (たけまる) です. >>>>>>>>>>>>> >>>>>>>>>>>>> きのうは勉強会に参加いただきありがとうございました. >>>>>>>>>>>>> お陰様で,面白い会になったと思います. >>>>>>>>>>>>> >>>>>>>>>>>>> さて,開発の進め方についてです. >>>>>>>>>>>>> >>>>>>>>>>>>> まず,発表で言ったように,kai_memcache から coordinator の機能を分離しておきます. >>>>>>>>>>>>> また,kai_version という空のモジュールを作っておきます. >>>>>>>>>>>>> これで,基本的なモジュール構成が固まるので,開発しやすくなると思います. >>>>>>>>>>>>> >>>>>>>>>>>>> 次に,実装の順序についてです. >>>>>>>>>>>>> >>>>>>>>>>>>> 基本的には好きなところから実装してもらって構わないと思うのですが,次のようなのが他の部分への影響が少なく取りかかりやすいでしょうか (面白みも少ないけど). >>>>>>>>>>>>> >>>>>>>>>>>>> - ./configure >>>>>>>>>>>>> - test_server >>>>>>>>>>>>> - kai_store の永続化 >>>>>>>>>>>>> - kai_api, kai_memcache のプロセスプール >>>>>>>>>>>>> >>>>>>>>>>>>> チューニングの類 (特にトリッキーなコードを伴うもの) は後回しにしたいと思います. >>>>>>>>>>>>> >>>>>>>>>>>>> コミッタは 5-10名と多くないので,管理はゆるめで進めたいです. >>>>>>>>>>>>> 早い者勝ちで手を挙げた人が実装してみて,行き詰まったら ML などでヘルプを求めるというのでいいかなぁ. >>>>>>>>>>>>> 誰が取り組んでいるかを知るために,sourceforge の Tracker を使うべきかなぁ. >>>>>>>>>>>>> 適当にブランチを切って自由に進めてもらって,落ち着いたところで merge するというので大丈夫だろうか. >>>>>>>>>>>>> モジュールのインタフェースが変更されるときは気をつけないといけないけど (merge は僕がやったほうがいいのかも). >>>>>>>>>>>>> >>>>>>>>>>>>> といったあたりについて意見を聞かせてください. >>>>>>>>>>>>> >>>>>>>>>>>>> # こういった開発者のための意識合わせ的なことは,Wiki にまとめて後で周知します. >>>>>>>>>>>>> >>>>>>>>>>>>> # うまく回り始めたら,僕は全体のコーディネートにまわるつもりです. >>>>>>>>>>>>> >>>>>>>>>>>>> -- >>>>>>>>>>>>> Takeru INOUE <tak...@gm...> >>>>>>>>>>>>> >>>>>>>>>>>>> ------------------------------------------------------------------------- >>>>>>>>>>>>> Check out the new SourceForge.net Marketplace. >>>>>>>>>>>>> It's the best place to buy or sell services for >>>>>>>>>>>>> just about anything Open Source. >>>>>>>>>>>>> http://sourceforge.net/services/buy/index.php >>>>>>>>>>>>> _______________________________________________ >>>>>>>>>>>>> Kai-devel-ja mailing list >>>>>>>>>>>>> Kai...@li... >>>>>>>>>>>>> https://lists.sourceforge.net/lists/listinfo/kai-devel-ja >>>>>>>>>>>>> >>>>>>>>>>>> >>>>>>>>>>>> >>>>>>>>>>>> >>>>>>>>>>>> -- >>>>>>>>>>>> cooldaemon >>>>>>>>>>>> >>>>>>>>>>> >>>>>>>>>>> >>>>>>>>>>> >>>>>>>>>>> -- >>>>>>>>>>> cooldaemon >>>>>>>>>>> >>>>>>>>>> >>>>>>>>>> >>>>>>>>>> >>>>>>>>>> -- >>>>>>>>>> Takeru INOUE <tak...@gm...> >>>>>>>>>> >>>>>>>>> >>>>>>>>> >>>>>>>>> >>>>>>>>> -- >>>>>>>>> cooldaemon >>>>>>>>> >>>>>>>> >>>>>>>> >>>>>>>> >>>>>>>> -- >>>>>>>> Takeru INOUE <tak...@gm...> >>>>>>>> >>>>>>> >>>>>>> >>>>>>> >>>>>>> -- >>>>>>> cooldaemon >>>>>>> >>>>>>> ------------------------------------------------------------------------- >>>>>>> Check out the new SourceForge.net Marketplace. >>>>>>> It's the best place to buy or sell services for >>>>>>> just about anything Open Source. >>>>>>> http://sourceforge.net/services/buy/index.php >>>>>>> _______________________________________________ >>>>>>> Kai-devel-ja mailing list >>>>>>> Kai...@li... >>>>>>> https://lists.sourceforge.net/lists/listinfo/kai-devel-ja >>>>>>> >>>>>> >>>>>> >>>>>> >>>>>> -- >>>>>> cooldaemon >>>>>> >>>>> >>>>> >>>>> >>>>> -- >>>>> Takeru INOUE <tak...@gm...> >>>>> >>>> >>>> >>>> >>>> -- >>>> cooldaemon >>>> >>> >>> >>> >>> -- >>> Takeru INOUE <tak...@gm...> >>> >> >> >> >> -- >> cooldaemon >> > > > > -- > Takeru INOUE <tak...@gm...> > -- cooldaemon |
From: Takeru I. <tak...@gm...> - 2008-06-30 14:44:57
|
では,kai_config:get の引数に List を許可するようにしましょう. kai_config:get(ListOfKeys) -> ListOfValues わずかな変更なのでやってしまいました. branches/takemaru_config_get_list_of_keys にあります. ブランチを作った直後に ci するのを忘れたので diff がわかりにくくなっていますが,kai_config とそのテストしか修正していません. よいタイミングがあれば,そちらのブランチに merge してください > cooldaemon さん なさそうなら,tcp_server が一段落ついたところで merge します. 2008/6/30 masahito ikuta <coo...@gm...>: > 下記のような使い方を想定してます。 > > http://kai.svn.sourceforge.net/viewvc/kai/branches/cooldaemon_embed_tcp_server/src/kai_tcp_server.erl?view=markup > この source の 79 - 80 行目に下記のようなコードがあります。 > --- > [MaxConn, MaxRestarts, Time, Shutdown] > = Option:get([max_connections, max_restarts, time, shutdown]), > --- > これは、kai_config:get/1 で記述しなおすと > --- > [MaxConn, MaxRestarts, Time, Shutdown] > = lists:map(fun kai_config:get/1, [max_connections, max_restarts, > time, shutdown]). > --- > となります。(※今、即興で書いたので動作検証してません) > > これを > --- > [MaxConn, MaxRestarts, Time, Shutdown] > = kai_config:get([max_connections, max_restarts, time, shutdown]), > --- > と書けたら良いかな?と思いました。 > > 利点としては、メッセージ送信の回数を減らせるのと > 記述が少し短くなるという二点です。 > > kai_config の handle_call({get, Key}, _From, State) に > ガード条件を加えて、Key が is_list だったら > lists:map で、kai_config:get/2 を実行するイメージです。 > > > 2008/6/29 Takeru INOUE <tak...@gm...>: >>>> 圧力っぽくなってたらごめんなさい>< >>> >>> いや、全く、そんな感じはしませんでしたよ?(w; >> >> (^^;ゞ >> >>> ▼一点だけ、お願い >>> 現在、get という I/F があり、これは下記のように使うのですが >>> --- >>> Value = kai_config:get(key). >>> --- >>> こんな I/F も、欲しいなぁと・・・ >>> --- >>> [Value1, Value2] = kai_config:get([key1, key2]). >>> --- >>> 細かい話で、申し訳ないのですが、ご検討をお願い致します。 >> >> 戻り値は tuple のほうが使いやすかったりします? >> >> 引数はどうかなぁ. >> get 関数の作りとしては List のがラクだけど,呼び出し側は tuple のがいいのかなぁ. >> >> >>> 2008/6/29 Takeru INOUE <tak...@gm...>: >>>>> ▼修正順について >>>>> ・現在、 config はボトルネックとなっていない >>>>> ・アプリケーション全体で、設定値を保持する箇所は一カ所にする >>>>> ・同時に複数の機能を追加・変更するのはなるべく避けたほうがいい >>>>> >>>>> という事に関して、全くその通りだと思うので、kai_config をそのまま使います。 >>>> >>>> 圧力っぽくなってたらごめんなさい>< >>>> 僕もあんまり正しい自信もないので,特に,後続の篠原のメールをみると別の観点からいまの kai_config はよろしくない点があるなぁと思いました. >>>> >>>>> ▼イメージについて >>>>> まー、必要ないのですが、一応、補足です。 >>>>> >>>>> ・現状 >>>>> %..snip.. >>>>> test1(_Conf) -> >>>>> kai_config:start_link([{hostname, "localhost"}, {port, 11011}, {n, 3}, >>>>> {number_of_buckets, 8}, >>>>> {number_of_virtual_nodes, 2}]), >>>>> kai_hash:start_link(), >>>>> %..snip.. >>>>> >>>>> ・案 >>>>> %..snip.. >>>>> test1(_Conf) -> >>>>> kai_hash:start_link([{hostname, "localhost"}, {port, 11011}, {n, 3}, >>>>> {number_of_buckets, 8}, >>>>> {number_of_virtual_nodes, 2}]), >>>>> %..snip.. >>>>> >>>>> と考えてました。 >>>> >>>> 複製が発生するパターンですね. >>>> >>>> >>>>> で、init 時に >>>>> --- >>>>> Config = kai_config:new(Args, DefaultArgs) >>>>> --- >>>>> として、 Config を引き回し、実際に使う際に >>>>> --- >>>>> Hostname = Config:get(hostname). >>>>> --- >>>>> とするイメージでした。 >>>>> >>>>> >>>>> 2008/6/29 Takeru INOUE <tak...@gm...>: >>>>>>>>>案としては、kai_config が Option オブジェクト(Config オブジェクト)を返すのも >>>>>>>>>ありかな?と思うのですが、如何でしょうか? >>>>>>>> >>>>>>>> 上記、テストを書いていて、少し考え直しました。 >>>>>>>> >>>>>>>> ある一つのプロセスをテストする際 >>>>>>>> 毎回、kai_config プロセスを起動する事になるので >>>>>>>> それよりは、各プロセスの init 時に >>>>>>>> Args を元に Config オブジェクトを new するか >>>>>>>> start_link 時に Config オブジェクト を Args として渡した方が >>>>>>>> 良い気がするのですが、如何でしょうか? >>>>>>> >>>>>>> 賛成です。理由は、 >>>>>>> >>>>>>>> 疎結合にした方が、テストしやすいなーと) >>>>>>> >>>>>>> まさにこれにつきるとおもいます。 >>>>>> >>>>>> 性能面からは,kai_config のチューニングはまだ不要かなと思ってます. >>>>>> kai_store も同じく. >>>>>> 一方で,kai_hash は一つの処理が 300ms を超え得ることがわかってるので,対策が必要です (これはすでに Tracker にある). >>>>>> >>>>>> ちなみに,kai_config で ets を使っている理由は,protected にすれば他のモジュールから読み取りできるようになるから. >>>>>> この方法でも,特定のプロセスによる占有を回避できます. >>>>>> ただし,そもそも ets 重いからやめようということがあるならダメですが. >>>>>> >>>>>> 次に,インターフェースの改良案についてです. >>>>>> これは, >>>>>> >>>>>> 【現状】 >>>>>> test1(_Conf) -> >>>>>> kai_config:start_link([{hostname, ....}]), >>>>>> kai_hash:start_link(), >>>>>> kai_store:start_link(), >>>>>> >>>>>> のように書いているのを, >>>>>> >>>>>> 【案1】 >>>>>> test1(_Conf) -> >>>>>> Conf = kai_config:start_link([{hostname, ...}]), >>>>>> kai_hash:start_link(Conf), >>>>>> kai_store:start_link(Conf), >>>>>> >>>>>> のようにして kai_config オブジェクトを共有するというイメージでしょうか. >>>>>> あるいは, >>>>>> >>>>>> 【案2】 >>>>>> -module(kai_hash). >>>>>> init(Args) -> >>>>>> % ... >>>>>> {ok, [{config, kai_config:start_link(Args)}]}. >>>>>> >>>>>> のようにして kai_config オブジェクトの複製を持つイメージでしょうか. >>>>>> >>>>>> 設定を動的に変更する予定はないですが,設定値というのはノード全体で共有されるのが素直な解釈なので,性能上の制約が明らかになるまでは【案2】のような複製は避けたほうが無難かなぁ. >>>>>> そうしないと,忘れた頃に誰かがデバッグで苦労しそうな気がしました. >>>>>> >>>>>> あとは,kai_config は実質的に singleton なので,【現状】と【案1】に違いはほとんどないような? >>>>>> >>>>>> というわけで,kai_config のインターフェースを変更するメリットが分かってないわけですが,何か勘違いしてるかなぁ. >>>>>> >>>>>>> 考慮すべき点としては、いまのところ、ひとつしか思いつかないのですが、 >>>>>>> >>>>>>> - 設定情報が動的に変更されるかどうか? >>>>>>> >>>>>>> これは今の kai.config にある設定であれば、静的なものが >>>>>>> ほとんどかなぁ、と思ってますがどうでしょう? >>>>>>> # これからの発展によって変わるのかもしれんが >>>>>> >>>>>> リファクタリングの定石からいくと,同時に複数の機能を追加・変更するのはなるべく避けたほうがいいでしょうか (というか,僕はそうするのが好みなだけかも). >>>>>> そうであれば,TCP server を書いて,すべてのテストが通るのをコミットしてから,kai_config を修正したほうがいいかも. >>>>>> あるいは kai_config から先に修正するか. >>>>>> >>>>>> -- >>>>>> Takeru INOUE <tak...@gm...> >>>>>> >>>>>> ------------------------------------------------------------------------- >>>>>> Check out the new SourceForge.net Marketplace. >>>>>> It's the best place to buy or sell services for >>>>>> just about anything Open Source. >>>>>> http://sourceforge.net/services/buy/index.php >>>>>> _______________________________________________ >>>>>> Kai-devel-ja mailing list >>>>>> Kai...@li... >>>>>> https://lists.sourceforge.net/lists/listinfo/kai-devel-ja >>>>>> >>>>> >>>>> >>>>> >>>>> -- >>>>> cooldaemon >>>>> >>>> >>>> >>>> >>>> -- >>>> Takeru INOUE <tak...@gm...> >>>> >>> >>> >>> >>> -- >>> cooldaemon >>> >> >> >> >> -- >> Takeru INOUE <tak...@gm...> >> > > > > -- > cooldaemon > -- Takeru INOUE <tak...@gm...> |
From: Takeru I. <tak...@gm...> - 2008-06-30 13:47:55
|
次の勉強会の1コマが早くも決まりました (^-^) 160bit の代わりに,64 とか 32 にすると,どういう影響があるとか書いてありました? Kai には,もうちょっとコンパクトな空間でも良さそうな気がしているのですが. 2008/6/30 masahito ikuta <coo...@gm...>: > P2P 本を斜め読みですが読破しました。 > その他、いろいろ google 先生にお尋ねして、下記のように適当にまとめました。 > http://cooldaemon.tumblr.com/post/40027784/kademlia > (自分メモなので、人様には読み難いですが・・・) > 突っ込み大歓迎です。 > > ermdia は、これから追い始めるので > 実際にコードを書いて検証し始めるのは 7月末くらいでしょうかねぇ・・・。 > 早く勉強会で発表できるくらいになりたいものです。 > > 2008/6/23 Takeru INOUE <tak...@gm...>: >>> ありがとうございます! >>> kai_membership.erl の実装に関わる自信はありませんが・・・ >>> 今のところ、一番興味のある箇所なので >>> ご指導の程、宜しくお願い致します。 >>> (私のような初心者が、学んだ事をアウトプットする事で >>> Kai プロジェクト参加の敷居を下げる効果が >>> あるのではないかなぁと・・・) >>> >>> ところで、興味本位の質問ではあるのですが >>> 幾つかある DHT のアルゴリズムの中から >>> Kai では Chord を採用した理由を >>> 差し支えなければ、お教え頂けないでしょうか? >> >> Kai としては DHT のアルゴリズムを決めてはないのですが, >> Dynamo が Chord を選択した理由は次のようなものだと思います. >> >> - DHT アルゴリズムの中では簡単だった (Pastry とかより簡単) >> - Dynamo 開発当初は Kademlia がまだなかったか,一定の評価が与えられてなかった >> >> 最近だと BitTorrent に採用されていることもあって,Kademlia の評価が高いのかなぁ. >> >> 僕としては,Kai に実装するなら Chord か Kademlia のどちらかだろうと思ってます. >> 先のメールに書いたように,すでに Kademlia の Erlang 実装があるので,やや Kademlia に傾いてるかな. >> >> ただ,Dynamo に Kademlia が合うかどうかは真面目に検討してないので,実際に実装する前には厳密に評価したほうがいいでしょうね. >> >> このへんの技術を勉強するのであれば,P2P教科書 がそれなりにまとまっています (技術分類などに問題のある本ですが). >> >> >>> 2008/6/22 Takeru INOUE <tak...@gm...>: >>>> 井上 (たけまる) です. >>>> >>>>> ▼要望 >>>>> たけまるさんのプレゼンで、DHT に興味を持ちました。 >>>>> >>>>> 現在は、Chord について、いろいろ調べたり >>>>> 少しだけ試しに実装してみて試行錯誤している段階です。 >>>>> >>>>> そこで、どこかの段階で、Chord について理解している事をまとめたり >>>>> Erlang で書いたコードを晒したりするので >>>>> たけまるさん初め有識者の方々のご指導を頂きたいのですが >>>>> 如何なものでしょうか? >>>> >>>> はい,よろこんで. >>>> >>>> DHT は Erlang に適していると思うのですが,実装はそれほど多くないかもしれません. >>>> 少し調べてみたところ,id:ytakano さん (ご存じの方います?) の Kademlia と, >>>> >>>> Erlangで分散ハッシュテーブルを実装してみた - NO!と言えるようになりたい >>>> http://d.hatena.ne.jp/ytakano/20080507/1210136628 >>>> >>>> 先週の Conference on Scalability というところで発表のあった Chord with transaction がヒットしました. >>>> >>>> YouTube - Seattle Conference on Scalability: Scalable Wikipedia with E >>>> http://jp.youtube.com/watch?v=pW339qR7DvU&feature=user >>>> >>>> -- >>>> Takeru INOUE <tak...@gm...> >>>> >>> >>> -- >>> cooldaemon >>> >> >> >> >> -- >> Takeru INOUE <tak...@gm...> >> > > > > -- > cooldaemon > -- Takeru INOUE <tak...@gm...> |
From: Tsukasa H. <ml...@cu...> - 2008-06-30 11:19:52
|
こんにちは、濱野です。 すっかり出遅れてしまいましたが、 1) accept した直後にプロセスを生成してコネクションを受け持つモデルと 2) 予め複数のプロセスを生成しておいて全て accept 待ちにしておく という2種類のモデルについて、思うところを書かせて頂きます。 まず、apache の挙動ですが、prefork にしろ worker モデルにしろ 一つのlisten ソケットに対し複数プロセスが 同時に accept(2) を呼び出さな いように何らかの方法で直列化を行っていたと思います。 http://httpd.apache.org/docs/2.0/ja/mod/mpm_common.html#acceptmutex Erlang の場合、R11B-3 からは SMP な Erlang VM でも場合同時に accept(2) を呼び出さないように何らかの方法でロックを行い直列してくれるようになっ たということだと思っているのですが、未確認ですので後で詳しく追ってみた いと思います。 また、apache が 予め複数のプロセスを立ち上げている理由というのは、プロ セスの起動が重いからという理由だったと思います。 そこでプロセス生成コストは軽いと言われている Erlang の場合で考えると、 両者のモデルにそう大きなパフォーマンスの違いは無いのではないかと考えて います。 むしろ、プロセスの起動コストを考えずに、必要な時に必要なだけのプロセス を spawn するのが erlang らしいプログラムなのではないかと思ってたりしま すが、(2) の方がコードが簡潔という点でのアドバンテージはあるかもしれま せん。 結局、何が言いたかったのかというと (1)のモデルでもそれほど悪くないんじゃ ないかなということでした。 # 最大接続数の制限でしたら、cooldaemon さんも仰るように(1) の方法でも行え ますよね。 パフォーマンスが気になるんだったら、さっさとベンチマーク取ればいいじゃ んと思われるかもしれませんが、最近やっと OTP 作法を覚えようとしてたり、 ぜんぜん手が追いついていない状況です、ごめんなさいごめんなさい。 At Wed, 25 Jun 2008 01:59:49 +0900, Takeru INOUE wrote: > > > http://d.hatena.ne.jp/cooldaemon/20071024/1193193093 > > ここの Server Design のアスキーアートをベースに話をします。 > > > > tcp_server_sup は、tcp_acceptor と tcp_client_sup を起動し監視下に置きます。 > > その際、tcp_acceptor を、最大接続数分 起動します。 > > これを読んで合点がいきました. > > > http://d.hatena.ne.jp/cooldaemon/20080624 > > こんな感じで、どうでしょうか? > > 素晴らしいです. > > せっかくなので,完全に OTP にしてみました. > 使いやすくなってるかは微妙.. > > たけまる / 続・Erlang で Apache worker MPM っぽいこと > http://teahut.sakura.ne.jp/b/2008-06-25-1.html > > > Mochiweb 方式より、accept 待ちプロセスを複数持つ方式の方が > > シンプルでコード量が少ないですねぇ > > そういう気がします. > 同時に accept できるというのは比較的新しい機能のようですね. > > > 2008/6/24 masahito ikuta <coo...@gm...>: > >>> 僕がイメージしていたのは,つねに一定数のプロセスを起動しておいて,暇なやつにリクエストを処理させる > >>> (暇やつがいなければリクエストを待たせておく) という振る舞いでした. > >> > >> メール&ブログのエントリを拝見致しましたが > >> たけまるさんと私の考え方は > >> 一致しているかなーと思います。 > >> ※私が勘違いしているかも? > >> > >>> cooldaemon さんの方法だと,プロセスの死活監視はできるのですが,プロセス数が一定ではないので,同時接続数を制限することはできません. > >> > >> Mochiweb もそうなのですが > >> accept した時点で、現在のプロセス数をインクリメントし > >> 最大接続数に達した時点で、accept を止めます。 > >> > >> プロセスが終了する度、EXIT メッセージが親に通達されるので > >> プロセス数をデクリメントします。 > >> (accept ループを抜けていた場合は、再開) > >> > >> なんとなくですが > >> 私は、accept するプロセスをプーリングする方式の方が > >> 速度が出そうな気がしますけれど。 > >> > >>> cooldaemon さんの方法は,プロセスを増やしながら生死を管理するための高度な方法です. > >> > >> ついでに、kai_api, kai_memcache のコードの共通化も可能です。 > >> > >> で、両者の良いとこ取りを出来ないかと思い > >> > >>>> spawn のコストが高くなった時点で > >>>> acceptor をプーリングしておく方式に切り替える事も > >>>> 検討材料として残しつつ、作業を進めます。 > >>>> > >>>> その場合は、tcp_client_sup がプロセスの死活監視を行う事になります。 > >>>> (名前は、kai_tcp_client_sup とかが良いでしょうか?) > >> > >> と書いたのですが、これの説明が悪いので、もう少しだけ補足を書かせて下さい。 > >> > >> http://d.hatena.ne.jp/cooldaemon/20071024/1193193093 > >> ここの Server Design のアスキーアートをベースに話をします。 > >> > >> tcp_server_sup は、tcp_acceptor と tcp_client_sup を起動し監視下に置きます。 > >> その際、tcp_acceptor を、最大接続数分 起動します。 > >> > >> 接続があると、tcp_acceptor は > >> tcp_client_sup に tcp_echo(kai_memcache) を起動しなさい!と > >> メッセージを送ります。 > >> > >> 接続時に spawn しているので tcp_acceptor を複数起動するメリットが > >> accept ループを出たり入ったりする処理を > >> 書かなくて良い点だけになってしまいますが・・・。 > >> (単一プロセスのループ処理を、複数プロセスに置き換えているところが > >> Erlang っぽくて萌えるのですがw;) > >> > >> 死活監視と接続最大数は別の話だとは思いつつも > >> proc_lib の下に proc_lib や普通のプロセス(?) を配置すると > >> OTP の恩恵を受けられないので、何とかならないかなぁと思ってます。 > >> > >>> これに懲りずにおつきあいくださいませ. > >> > >> いやー、こういう話がないと、開発してる気分になれない気が(w; > >> お気になさらずにー。 > >> > >> 2008/6/23 Takeru INOUE <tak...@gm...>: > >>> 井上 (たけまる) です. > >>> > >>> すいません,少し勘違いしていました. > >>> > >>> 今回やろうとしていたことは,同時接続数の制限です (という言い方をすれば誤解がなかったのか). > >>> よく考えれば, > >>> > >>> - プロセスの生死を管理すること > >>> - 同時接続数を制限すること > >>> > >>> これらは別の話ですね. > >>> > >>> 僕がイメージしていたのは,つねに一定数のプロセスを起動しておいて,暇なやつにリクエストを処理させる > >>> (暇やつがいなければリクエストを待たせておく) という振る舞いでした. > >>> cooldaemon さんの方法だと,プロセスの死活監視はできるのですが,プロセス数が一定ではないので,同時接続数を制限することはできません. > >>> > >>> cooldaemon さんの方法は,プロセスを増やしながら生死を管理するための高度な方法です. > >>> 今回の局面で使うには少し違うかも,という気がしています. > >>> 僕のイメージとは少し違ったのですが,有用な方法であることは間違いないので,どこかで役に立つと思います > >>> (まだ勘違いしてるかもしれないので,気づいた点がありましたら指摘してください><). > >>> > >>> 詳しくはブログに書きました. > >>> > >>> たけまる / Erlang で Apache worker MPM っぽいこと > >>> http://teahut.sakura.ne.jp/b/2008-06-23-1.html > >>> > >>> というわけで,混乱させてしまってすみません m(_ _)m > >>> これに懲りずにおつきあいくださいませ. > >>> > >>> > >>> 2008/6/23 masahito ikuta <coo...@gm...>: > >>>>> ただこの方法だと worker の生死管理を自分で書かないといけないので,cooldaemon さんの方法のがよさそうです. > >>>> > >>>> spawn のコストが高くなった時点で > >>>> acceptor をプーリングしておく方式に切り替える事も > >>>> 検討材料として残しつつ、作業を進めます。 > >>>> > >>>> その場合は、tcp_client_sup がプロセスの死活監視を行う事になります。 > >>>> (名前は、kai_tcp_client_sup とかが良いでしょうか?) > >>>> > >>>> 2008/6/23 Takeru INOUE <tak...@gm...>: > >>>>>>>>- kai_api, kai_memcache のプロセスプール > >>>>>>> > >>>>>>> こちらの作業内容を > >>>>>>> もう少し詳しく教えて頂いて宜しいでしょうか? > >>>>>>> (何となく、参加できそうな気がしたので・・・) > >>>>>> > >>>>>> http://d.hatena.ne.jp/cooldaemon/20071024/1193193093 > >>>>>> ↑この仕組みで汎用化してしまい > >>>>>> tcp_acceptor の箇所で接続数の制限を行うのは > >>>>>> 如何でしょうか? > >>>>> > >>>>> はい,そんな感じです. > >>>>> > >>>>> やろうとしていることは,『プログラミングErlang』14.1 の最後に書いてあることそのままです. > >>>>> > >>>>> | Erlang バージョン R11B-3 では,1つの待ち受け用ソケットに > >>>>> | 対して複数の Erlang プロセスが gen_tcp:accept/1 を呼び出すことが > >>>>> | できる.この機能を利用すれば,前もって生成しておいたプロセスのプー > >>>>> | ルを用意しておいて,その各プロセスを gen_tcp:accept/1 で接続待ち > >>>>> | 状態にしておくことができるので,並列サーバを作るのが簡単になる.(p.207) > >>>>> > >>>>> 僕がどうするつもりだったかというと,わりと適当にしか考えてなくて,『プログラミングErlang』付録D に出てくる lib_chan_cs > >>>>> のように,accept 待ちのプロセスを指定した数だけ spawn しておけばいいかなくらいに思ってました. > >>>>> > >>>>> possibly_start_another(false, Listen, Active, Fun, max) -> > >>>>> case length(Active) of > >>>>> N when N < Max -> % worker 数が Max 未満なら > >>>>> New = start_accept(Listen, Fun), % accept 待ちプロセスを起動 > >>>>> > >>>>> ただこの方法だと worker の生死管理を自分で書かないといけないので,cooldaemon さんの方法のがよさそうです. > >>>>> というわけで,いけそうなら sourceforge の tracker で自分にアサインしちゃってください. > >>>>> kai_api と kai_memcache がありますが,kai_memcache のほうがデバッグしやすい気がします. > >>>>> > >>>>> ちなみに,プロセスプールを TODO に入れた理由は次のとおりです. > >>>>> いまの Kai は,毎秒数百リクエストを送りつけると負荷が高くなって,メンバシップの管理ができなくなり,クラスタが分解してしまいます. > >>>>> これを回避できるとしたら,API の受け付け数を制限するしかないかなと. > >>>>> 『プログラミングErlang』でも,この機能をトラフィックシェーピング (流量制御) と読んでますね. > >>>>> > >>>>> > >>>>>> 2008/6/23 masahito ikuta <coo...@gm...>: > >>>>>>> cooldaemon です。 > >>>>>>> > >>>>>>>>- kai_api, kai_memcache のプロセスプール > >>>>>>> > >>>>>>> こちらの作業内容を > >>>>>>> もう少し詳しく教えて頂いて宜しいでしょうか? > >>>>>>> (何となく、参加できそうな気がしたので・・・) > >>>>>>> > >>>>>>>>チューニングの類 (特にトリッキーなコードを伴うもの) は後回しにしたいと思います. > >>>>>>> > >>>>>>> とても細かい話で申し訳ないのですが・・・ > >>>>>>> 現在、make すると src ディレクトリ配下に beam ファイルが出来てしまうので > >>>>>>> OTP っぽく ebin ディレクトリ配下に配置したいと思いますが、如何でしょうか? > >>>>>>> (autotools に対応する気力は無いのですが orz) > >>>>>>> > >>>>>>> > >>>>>>> 2008/6/22 Takeru INOUE <tak...@gm...>: > >>>>>>>> 井上 (たけまる) です. > >>>>>>>> > >>>>>>>> 6/19 にこのメールを送ったのですが,sourceforge の作業中だったから送られてないようなので (archive に表示されない),再送します. > >>>>>>>> > >>>>>>>> > >>>>>>>> ---------- Forwarded message ---------- > >>>>>>>> From: Takeru INOUE <tak...@gm...> > >>>>>>>> Date: 2008/6/19 > >>>>>>>> Subject: 開発の進め方 > >>>>>>>> To: kai...@li... > >>>>>>>> > >>>>>>>> > >>>>>>>> 井上 (たけまる) です. > >>>>>>>> > >>>>>>>> きのうは勉強会に参加いただきありがとうございました. > >>>>>>>> お陰様で,面白い会になったと思います. > >>>>>>>> > >>>>>>>> さて,開発の進め方についてです. > >>>>>>>> > >>>>>>>> まず,発表で言ったように,kai_memcache から coordinator の機能を分離しておきます. > >>>>>>>> また,kai_version という空のモジュールを作っておきます. > >>>>>>>> これで,基本的なモジュール構成が固まるので,開発しやすくなると思います. > >>>>>>>> > >>>>>>>> 次に,実装の順序についてです. > >>>>>>>> > >>>>>>>> 基本的には好きなところから実装してもらって構わないと思うのですが,次のようなのが他の部分への影響が少なく取りかかりやすいでしょうか (面白みも少ないけど). > >>>>>>>> > >>>>>>>> - ./configure > >>>>>>>> - test_server > >>>>>>>> - kai_store の永続化 > >>>>>>>> - kai_api, kai_memcache のプロセスプール > >>>>>>>> > >>>>>>>> チューニングの類 (特にトリッキーなコードを伴うもの) は後回しにしたいと思います. > >>>>>>>> > >>>>>>>> コミッタは 5-10名と多くないので,管理はゆるめで進めたいです. > >>>>>>>> 早い者勝ちで手を挙げた人が実装してみて,行き詰まったら ML などでヘルプを求めるというのでいいかなぁ. > >>>>>>>> 誰が取り組んでいるかを知るために,sourceforge の Tracker を使うべきかなぁ. > >>>>>>>> 適当にブランチを切って自由に進めてもらって,落ち着いたところで merge するというので大丈夫だろうか. > >>>>>>>> モジュールのインタフェースが変更されるときは気をつけないといけないけど (merge は僕がやったほうがいいのかも). > >>>>>>>> > >>>>>>>> といったあたりについて意見を聞かせてください. > >>>>>>>> > >>>>>>>> # こういった開発者のための意識合わせ的なことは,Wiki にまとめて後で周知します. > >>>>>>>> > >>>>>>>> # うまく回り始めたら,僕は全体のコーディネートにまわるつもりです. > >>>>>>>> > >>>>>>>> -- > >>>>>>>> Takeru INOUE <tak...@gm...> > >>>>>>>> > >>>>>>>> ------------------------------------------------------------------------- > >>>>>>>> Check out the new SourceForge.net Marketplace. > >>>>>>>> It's the best place to buy or sell services for > >>>>>>>> just about anything Open Source. > >>>>>>>> http://sourceforge.net/services/buy/index.php > >>>>>>>> _______________________________________________ > >>>>>>>> Kai-devel-ja mailing list > >>>>>>>> Kai...@li... > >>>>>>>> https://lists.sourceforge.net/lists/listinfo/kai-devel-ja > >>>>>>>> > >>>>>>> > >>>>>>> > >>>>>>> > >>>>>>> -- > >>>>>>> cooldaemon > >>>>>>> > >>>>>> > >>>>>> > >>>>>> > >>>>>> -- > >>>>>> cooldaemon > >>>>>> > >>>>> > >>>>> > >>>>> > >>>>> -- > >>>>> Takeru INOUE <tak...@gm...> > >>>>> > >>>> > >>>> > >>>> > >>>> -- > >>>> cooldaemon > >>>> > >>> > >>> > >>> > >>> -- > >>> Takeru INOUE <tak...@gm...> > >>> > >> > >> > >> > >> -- > >> cooldaemon > >> > >> ------------------------------------------------------------------------- > >> Check out the new SourceForge.net Marketplace. > >> It's the best place to buy or sell services for > >> just about anything Open Source. > >> http://sourceforge.net/services/buy/index.php > >> _______________________________________________ > >> Kai-devel-ja mailing list > >> Kai...@li... > >> https://lists.sourceforge.net/lists/listinfo/kai-devel-ja > >> > > > > > > > > -- > > cooldaemon > > > > > > -- > Takeru INOUE <tak...@gm...> > > ------------------------------------------------------------------------- > Check out the new SourceForge.net Marketplace. > It's the best place to buy or sell services for > just about anything Open Source. > http://sourceforge.net/services/buy/index.php > _______________________________________________ > Kai-devel-ja mailing list > Kai...@li... > https://lists.sourceforge.net/lists/listinfo/kai-devel-ja -- Tsukasa Hamano <ha...@cu...> |
From: masahito i. <coo...@gm...> - 2008-06-30 08:37:34
|
下記のような使い方を想定してます。 http://kai.svn.sourceforge.net/viewvc/kai/branches/cooldaemon_embed_tcp_server/src/kai_tcp_server.erl?view=markup この source の 79 - 80 行目に下記のようなコードがあります。 --- [MaxConn, MaxRestarts, Time, Shutdown] = Option:get([max_connections, max_restarts, time, shutdown]), --- これは、kai_config:get/1 で記述しなおすと --- [MaxConn, MaxRestarts, Time, Shutdown] = lists:map(fun kai_config:get/1, [max_connections, max_restarts, time, shutdown]). --- となります。(※今、即興で書いたので動作検証してません) これを --- [MaxConn, MaxRestarts, Time, Shutdown] = kai_config:get([max_connections, max_restarts, time, shutdown]), --- と書けたら良いかな?と思いました。 利点としては、メッセージ送信の回数を減らせるのと 記述が少し短くなるという二点です。 kai_config の handle_call({get, Key}, _From, State) に ガード条件を加えて、Key が is_list だったら lists:map で、kai_config:get/2 を実行するイメージです。 2008/6/29 Takeru INOUE <tak...@gm...>: >>> 圧力っぽくなってたらごめんなさい>< >> >> いや、全く、そんな感じはしませんでしたよ?(w; > > (^^;ゞ > >> ▼一点だけ、お願い >> 現在、get という I/F があり、これは下記のように使うのですが >> --- >> Value = kai_config:get(key). >> --- >> こんな I/F も、欲しいなぁと・・・ >> --- >> [Value1, Value2] = kai_config:get([key1, key2]). >> --- >> 細かい話で、申し訳ないのですが、ご検討をお願い致します。 > > 戻り値は tuple のほうが使いやすかったりします? > > 引数はどうかなぁ. > get 関数の作りとしては List のがラクだけど,呼び出し側は tuple のがいいのかなぁ. > > >> 2008/6/29 Takeru INOUE <tak...@gm...>: >>>> ▼修正順について >>>> ・現在、 config はボトルネックとなっていない >>>> ・アプリケーション全体で、設定値を保持する箇所は一カ所にする >>>> ・同時に複数の機能を追加・変更するのはなるべく避けたほうがいい >>>> >>>> という事に関して、全くその通りだと思うので、kai_config をそのまま使います。 >>> >>> 圧力っぽくなってたらごめんなさい>< >>> 僕もあんまり正しい自信もないので,特に,後続の篠原のメールをみると別の観点からいまの kai_config はよろしくない点があるなぁと思いました. >>> >>>> ▼イメージについて >>>> まー、必要ないのですが、一応、補足です。 >>>> >>>> ・現状 >>>> %..snip.. >>>> test1(_Conf) -> >>>> kai_config:start_link([{hostname, "localhost"}, {port, 11011}, {n, 3}, >>>> {number_of_buckets, 8}, >>>> {number_of_virtual_nodes, 2}]), >>>> kai_hash:start_link(), >>>> %..snip.. >>>> >>>> ・案 >>>> %..snip.. >>>> test1(_Conf) -> >>>> kai_hash:start_link([{hostname, "localhost"}, {port, 11011}, {n, 3}, >>>> {number_of_buckets, 8}, >>>> {number_of_virtual_nodes, 2}]), >>>> %..snip.. >>>> >>>> と考えてました。 >>> >>> 複製が発生するパターンですね. >>> >>> >>>> で、init 時に >>>> --- >>>> Config = kai_config:new(Args, DefaultArgs) >>>> --- >>>> として、 Config を引き回し、実際に使う際に >>>> --- >>>> Hostname = Config:get(hostname). >>>> --- >>>> とするイメージでした。 >>>> >>>> >>>> 2008/6/29 Takeru INOUE <tak...@gm...>: >>>>>>>>案としては、kai_config が Option オブジェクト(Config オブジェクト)を返すのも >>>>>>>>ありかな?と思うのですが、如何でしょうか? >>>>>>> >>>>>>> 上記、テストを書いていて、少し考え直しました。 >>>>>>> >>>>>>> ある一つのプロセスをテストする際 >>>>>>> 毎回、kai_config プロセスを起動する事になるので >>>>>>> それよりは、各プロセスの init 時に >>>>>>> Args を元に Config オブジェクトを new するか >>>>>>> start_link 時に Config オブジェクト を Args として渡した方が >>>>>>> 良い気がするのですが、如何でしょうか? >>>>>> >>>>>> 賛成です。理由は、 >>>>>> >>>>>>> 疎結合にした方が、テストしやすいなーと) >>>>>> >>>>>> まさにこれにつきるとおもいます。 >>>>> >>>>> 性能面からは,kai_config のチューニングはまだ不要かなと思ってます. >>>>> kai_store も同じく. >>>>> 一方で,kai_hash は一つの処理が 300ms を超え得ることがわかってるので,対策が必要です (これはすでに Tracker にある). >>>>> >>>>> ちなみに,kai_config で ets を使っている理由は,protected にすれば他のモジュールから読み取りできるようになるから. >>>>> この方法でも,特定のプロセスによる占有を回避できます. >>>>> ただし,そもそも ets 重いからやめようということがあるならダメですが. >>>>> >>>>> 次に,インターフェースの改良案についてです. >>>>> これは, >>>>> >>>>> 【現状】 >>>>> test1(_Conf) -> >>>>> kai_config:start_link([{hostname, ....}]), >>>>> kai_hash:start_link(), >>>>> kai_store:start_link(), >>>>> >>>>> のように書いているのを, >>>>> >>>>> 【案1】 >>>>> test1(_Conf) -> >>>>> Conf = kai_config:start_link([{hostname, ...}]), >>>>> kai_hash:start_link(Conf), >>>>> kai_store:start_link(Conf), >>>>> >>>>> のようにして kai_config オブジェクトを共有するというイメージでしょうか. >>>>> あるいは, >>>>> >>>>> 【案2】 >>>>> -module(kai_hash). >>>>> init(Args) -> >>>>> % ... >>>>> {ok, [{config, kai_config:start_link(Args)}]}. >>>>> >>>>> のようにして kai_config オブジェクトの複製を持つイメージでしょうか. >>>>> >>>>> 設定を動的に変更する予定はないですが,設定値というのはノード全体で共有されるのが素直な解釈なので,性能上の制約が明らかになるまでは【案2】のような複製は避けたほうが無難かなぁ. >>>>> そうしないと,忘れた頃に誰かがデバッグで苦労しそうな気がしました. >>>>> >>>>> あとは,kai_config は実質的に singleton なので,【現状】と【案1】に違いはほとんどないような? >>>>> >>>>> というわけで,kai_config のインターフェースを変更するメリットが分かってないわけですが,何か勘違いしてるかなぁ. >>>>> >>>>>> 考慮すべき点としては、いまのところ、ひとつしか思いつかないのですが、 >>>>>> >>>>>> - 設定情報が動的に変更されるかどうか? >>>>>> >>>>>> これは今の kai.config にある設定であれば、静的なものが >>>>>> ほとんどかなぁ、と思ってますがどうでしょう? >>>>>> # これからの発展によって変わるのかもしれんが >>>>> >>>>> リファクタリングの定石からいくと,同時に複数の機能を追加・変更するのはなるべく避けたほうがいいでしょうか (というか,僕はそうするのが好みなだけかも). >>>>> そうであれば,TCP server を書いて,すべてのテストが通るのをコミットしてから,kai_config を修正したほうがいいかも. >>>>> あるいは kai_config から先に修正するか. >>>>> >>>>> -- >>>>> Takeru INOUE <tak...@gm...> >>>>> >>>>> ------------------------------------------------------------------------- >>>>> Check out the new SourceForge.net Marketplace. >>>>> It's the best place to buy or sell services for >>>>> just about anything Open Source. >>>>> http://sourceforge.net/services/buy/index.php >>>>> _______________________________________________ >>>>> Kai-devel-ja mailing list >>>>> Kai...@li... >>>>> https://lists.sourceforge.net/lists/listinfo/kai-devel-ja >>>>> >>>> >>>> >>>> >>>> -- >>>> cooldaemon >>>> >>> >>> >>> >>> -- >>> Takeru INOUE <tak...@gm...> >>> >> >> >> >> -- >> cooldaemon >> > > > > -- > Takeru INOUE <tak...@gm...> > -- cooldaemon |
From: masahito i. <coo...@gm...> - 2008-06-30 01:41:20
|
P2P 本を斜め読みですが読破しました。 その他、いろいろ google 先生にお尋ねして、下記のように適当にまとめました。 http://cooldaemon.tumblr.com/post/40027784/kademlia (自分メモなので、人様には読み難いですが・・・) 突っ込み大歓迎です。 ermdia は、これから追い始めるので 実際にコードを書いて検証し始めるのは 7月末くらいでしょうかねぇ・・・。 早く勉強会で発表できるくらいになりたいものです。 2008/6/23 Takeru INOUE <tak...@gm...>: >> ありがとうございます! >> kai_membership.erl の実装に関わる自信はありませんが・・・ >> 今のところ、一番興味のある箇所なので >> ご指導の程、宜しくお願い致します。 >> (私のような初心者が、学んだ事をアウトプットする事で >> Kai プロジェクト参加の敷居を下げる効果が >> あるのではないかなぁと・・・) >> >> ところで、興味本位の質問ではあるのですが >> 幾つかある DHT のアルゴリズムの中から >> Kai では Chord を採用した理由を >> 差し支えなければ、お教え頂けないでしょうか? > > Kai としては DHT のアルゴリズムを決めてはないのですが, > Dynamo が Chord を選択した理由は次のようなものだと思います. > > - DHT アルゴリズムの中では簡単だった (Pastry とかより簡単) > - Dynamo 開発当初は Kademlia がまだなかったか,一定の評価が与えられてなかった > > 最近だと BitTorrent に採用されていることもあって,Kademlia の評価が高いのかなぁ. > > 僕としては,Kai に実装するなら Chord か Kademlia のどちらかだろうと思ってます. > 先のメールに書いたように,すでに Kademlia の Erlang 実装があるので,やや Kademlia に傾いてるかな. > > ただ,Dynamo に Kademlia が合うかどうかは真面目に検討してないので,実際に実装する前には厳密に評価したほうがいいでしょうね. > > このへんの技術を勉強するのであれば,P2P教科書 がそれなりにまとまっています (技術分類などに問題のある本ですが). > > >> 2008/6/22 Takeru INOUE <tak...@gm...>: >>> 井上 (たけまる) です. >>> >>>> ▼要望 >>>> たけまるさんのプレゼンで、DHT に興味を持ちました。 >>>> >>>> 現在は、Chord について、いろいろ調べたり >>>> 少しだけ試しに実装してみて試行錯誤している段階です。 >>>> >>>> そこで、どこかの段階で、Chord について理解している事をまとめたり >>>> Erlang で書いたコードを晒したりするので >>>> たけまるさん初め有識者の方々のご指導を頂きたいのですが >>>> 如何なものでしょうか? >>> >>> はい,よろこんで. >>> >>> DHT は Erlang に適していると思うのですが,実装はそれほど多くないかもしれません. >>> 少し調べてみたところ,id:ytakano さん (ご存じの方います?) の Kademlia と, >>> >>> Erlangで分散ハッシュテーブルを実装してみた - NO!と言えるようになりたい >>> http://d.hatena.ne.jp/ytakano/20080507/1210136628 >>> >>> 先週の Conference on Scalability というところで発表のあった Chord with transaction がヒットしました. >>> >>> YouTube - Seattle Conference on Scalability: Scalable Wikipedia with E >>> http://jp.youtube.com/watch?v=pW339qR7DvU&feature=user >>> >>> -- >>> Takeru INOUE <tak...@gm...> >>> >> >> -- >> cooldaemon >> > > > > -- > Takeru INOUE <tak...@gm...> > -- cooldaemon |
From: shun s. <shi...@gm...> - 2008-06-29 14:51:39
|
2008/06/29 23:31 Takeru INOUE <tak...@gm...>: >>> 圧力っぽくなってたらごめんなさい>< >> >> いや、全く、そんな感じはしませんでしたよ?(w; > > (^^;ゞ なんか、中途半端に返信してひっかきまわした気がするです。m(_ _)m まぁ、「kai_config を使う」という方向で決まったみたいで。 > とはいえ final 的なことはできなそうだから,ドキュメントに "configuration values are never > modified while running" とでも書いておくしかないかな. # そうだよねぇ、破壊的操作のない言語で final ってないよなぁ。。。 shino |
From: Takeru I. <tak...@gm...> - 2008-06-29 14:31:37
|
>> 圧力っぽくなってたらごめんなさい>< > > いや、全く、そんな感じはしませんでしたよ?(w; (^^;ゞ > ▼一点だけ、お願い > 現在、get という I/F があり、これは下記のように使うのですが > --- > Value = kai_config:get(key). > --- > こんな I/F も、欲しいなぁと・・・ > --- > [Value1, Value2] = kai_config:get([key1, key2]). > --- > 細かい話で、申し訳ないのですが、ご検討をお願い致します。 戻り値は tuple のほうが使いやすかったりします? 引数はどうかなぁ. get 関数の作りとしては List のがラクだけど,呼び出し側は tuple のがいいのかなぁ. > 2008/6/29 Takeru INOUE <tak...@gm...>: >>> ▼修正順について >>> ・現在、 config はボトルネックとなっていない >>> ・アプリケーション全体で、設定値を保持する箇所は一カ所にする >>> ・同時に複数の機能を追加・変更するのはなるべく避けたほうがいい >>> >>> という事に関して、全くその通りだと思うので、kai_config をそのまま使います。 >> >> 圧力っぽくなってたらごめんなさい>< >> 僕もあんまり正しい自信もないので,特に,後続の篠原のメールをみると別の観点からいまの kai_config はよろしくない点があるなぁと思いました. >> >>> ▼イメージについて >>> まー、必要ないのですが、一応、補足です。 >>> >>> ・現状 >>> %..snip.. >>> test1(_Conf) -> >>> kai_config:start_link([{hostname, "localhost"}, {port, 11011}, {n, 3}, >>> {number_of_buckets, 8}, >>> {number_of_virtual_nodes, 2}]), >>> kai_hash:start_link(), >>> %..snip.. >>> >>> ・案 >>> %..snip.. >>> test1(_Conf) -> >>> kai_hash:start_link([{hostname, "localhost"}, {port, 11011}, {n, 3}, >>> {number_of_buckets, 8}, >>> {number_of_virtual_nodes, 2}]), >>> %..snip.. >>> >>> と考えてました。 >> >> 複製が発生するパターンですね. >> >> >>> で、init 時に >>> --- >>> Config = kai_config:new(Args, DefaultArgs) >>> --- >>> として、 Config を引き回し、実際に使う際に >>> --- >>> Hostname = Config:get(hostname). >>> --- >>> とするイメージでした。 >>> >>> >>> 2008/6/29 Takeru INOUE <tak...@gm...>: >>>>>>>案としては、kai_config が Option オブジェクト(Config オブジェクト)を返すのも >>>>>>>ありかな?と思うのですが、如何でしょうか? >>>>>> >>>>>> 上記、テストを書いていて、少し考え直しました。 >>>>>> >>>>>> ある一つのプロセスをテストする際 >>>>>> 毎回、kai_config プロセスを起動する事になるので >>>>>> それよりは、各プロセスの init 時に >>>>>> Args を元に Config オブジェクトを new するか >>>>>> start_link 時に Config オブジェクト を Args として渡した方が >>>>>> 良い気がするのですが、如何でしょうか? >>>>> >>>>> 賛成です。理由は、 >>>>> >>>>>> 疎結合にした方が、テストしやすいなーと) >>>>> >>>>> まさにこれにつきるとおもいます。 >>>> >>>> 性能面からは,kai_config のチューニングはまだ不要かなと思ってます. >>>> kai_store も同じく. >>>> 一方で,kai_hash は一つの処理が 300ms を超え得ることがわかってるので,対策が必要です (これはすでに Tracker にある). >>>> >>>> ちなみに,kai_config で ets を使っている理由は,protected にすれば他のモジュールから読み取りできるようになるから. >>>> この方法でも,特定のプロセスによる占有を回避できます. >>>> ただし,そもそも ets 重いからやめようということがあるならダメですが. >>>> >>>> 次に,インターフェースの改良案についてです. >>>> これは, >>>> >>>> 【現状】 >>>> test1(_Conf) -> >>>> kai_config:start_link([{hostname, ....}]), >>>> kai_hash:start_link(), >>>> kai_store:start_link(), >>>> >>>> のように書いているのを, >>>> >>>> 【案1】 >>>> test1(_Conf) -> >>>> Conf = kai_config:start_link([{hostname, ...}]), >>>> kai_hash:start_link(Conf), >>>> kai_store:start_link(Conf), >>>> >>>> のようにして kai_config オブジェクトを共有するというイメージでしょうか. >>>> あるいは, >>>> >>>> 【案2】 >>>> -module(kai_hash). >>>> init(Args) -> >>>> % ... >>>> {ok, [{config, kai_config:start_link(Args)}]}. >>>> >>>> のようにして kai_config オブジェクトの複製を持つイメージでしょうか. >>>> >>>> 設定を動的に変更する予定はないですが,設定値というのはノード全体で共有されるのが素直な解釈なので,性能上の制約が明らかになるまでは【案2】のような複製は避けたほうが無難かなぁ. >>>> そうしないと,忘れた頃に誰かがデバッグで苦労しそうな気がしました. >>>> >>>> あとは,kai_config は実質的に singleton なので,【現状】と【案1】に違いはほとんどないような? >>>> >>>> というわけで,kai_config のインターフェースを変更するメリットが分かってないわけですが,何か勘違いしてるかなぁ. >>>> >>>>> 考慮すべき点としては、いまのところ、ひとつしか思いつかないのですが、 >>>>> >>>>> - 設定情報が動的に変更されるかどうか? >>>>> >>>>> これは今の kai.config にある設定であれば、静的なものが >>>>> ほとんどかなぁ、と思ってますがどうでしょう? >>>>> # これからの発展によって変わるのかもしれんが >>>> >>>> リファクタリングの定石からいくと,同時に複数の機能を追加・変更するのはなるべく避けたほうがいいでしょうか (というか,僕はそうするのが好みなだけかも). >>>> そうであれば,TCP server を書いて,すべてのテストが通るのをコミットしてから,kai_config を修正したほうがいいかも. >>>> あるいは kai_config から先に修正するか. >>>> >>>> -- >>>> Takeru INOUE <tak...@gm...> >>>> >>>> ------------------------------------------------------------------------- >>>> Check out the new SourceForge.net Marketplace. >>>> It's the best place to buy or sell services for >>>> just about anything Open Source. >>>> http://sourceforge.net/services/buy/index.php >>>> _______________________________________________ >>>> Kai-devel-ja mailing list >>>> Kai...@li... >>>> https://lists.sourceforge.net/lists/listinfo/kai-devel-ja >>>> >>> >>> >>> >>> -- >>> cooldaemon >>> >> >> >> >> -- >> Takeru INOUE <tak...@gm...> >> > > > > -- > cooldaemon > -- Takeru INOUE <tak...@gm...> |
From: masahito i. <coo...@gm...> - 2008-06-29 14:22:18
|
> 圧力っぽくなってたらごめんなさい>< いや、全く、そんな感じはしませんでしたよ?(w; ▼一点だけ、お願い 現在、get という I/F があり、これは下記のように使うのですが --- Value = kai_config:get(key). --- こんな I/F も、欲しいなぁと・・・ --- [Value1, Value2] = kai_config:get([key1, key2]). --- 細かい話で、申し訳ないのですが、ご検討をお願い致します。 2008/6/29 Takeru INOUE <tak...@gm...>: >> ▼修正順について >> ・現在、 config はボトルネックとなっていない >> ・アプリケーション全体で、設定値を保持する箇所は一カ所にする >> ・同時に複数の機能を追加・変更するのはなるべく避けたほうがいい >> >> という事に関して、全くその通りだと思うので、kai_config をそのまま使います。 > > 圧力っぽくなってたらごめんなさい>< > 僕もあんまり正しい自信もないので,特に,後続の篠原のメールをみると別の観点からいまの kai_config はよろしくない点があるなぁと思いました. > >> ▼イメージについて >> まー、必要ないのですが、一応、補足です。 >> >> ・現状 >> %..snip.. >> test1(_Conf) -> >> kai_config:start_link([{hostname, "localhost"}, {port, 11011}, {n, 3}, >> {number_of_buckets, 8}, >> {number_of_virtual_nodes, 2}]), >> kai_hash:start_link(), >> %..snip.. >> >> ・案 >> %..snip.. >> test1(_Conf) -> >> kai_hash:start_link([{hostname, "localhost"}, {port, 11011}, {n, 3}, >> {number_of_buckets, 8}, >> {number_of_virtual_nodes, 2}]), >> %..snip.. >> >> と考えてました。 > > 複製が発生するパターンですね. > > >> で、init 時に >> --- >> Config = kai_config:new(Args, DefaultArgs) >> --- >> として、 Config を引き回し、実際に使う際に >> --- >> Hostname = Config:get(hostname). >> --- >> とするイメージでした。 >> >> >> 2008/6/29 Takeru INOUE <tak...@gm...>: >>>>>>案としては、kai_config が Option オブジェクト(Config オブジェクト)を返すのも >>>>>>ありかな?と思うのですが、如何でしょうか? >>>>> >>>>> 上記、テストを書いていて、少し考え直しました。 >>>>> >>>>> ある一つのプロセスをテストする際 >>>>> 毎回、kai_config プロセスを起動する事になるので >>>>> それよりは、各プロセスの init 時に >>>>> Args を元に Config オブジェクトを new するか >>>>> start_link 時に Config オブジェクト を Args として渡した方が >>>>> 良い気がするのですが、如何でしょうか? >>>> >>>> 賛成です。理由は、 >>>> >>>>> 疎結合にした方が、テストしやすいなーと) >>>> >>>> まさにこれにつきるとおもいます。 >>> >>> 性能面からは,kai_config のチューニングはまだ不要かなと思ってます. >>> kai_store も同じく. >>> 一方で,kai_hash は一つの処理が 300ms を超え得ることがわかってるので,対策が必要です (これはすでに Tracker にある). >>> >>> ちなみに,kai_config で ets を使っている理由は,protected にすれば他のモジュールから読み取りできるようになるから. >>> この方法でも,特定のプロセスによる占有を回避できます. >>> ただし,そもそも ets 重いからやめようということがあるならダメですが. >>> >>> 次に,インターフェースの改良案についてです. >>> これは, >>> >>> 【現状】 >>> test1(_Conf) -> >>> kai_config:start_link([{hostname, ....}]), >>> kai_hash:start_link(), >>> kai_store:start_link(), >>> >>> のように書いているのを, >>> >>> 【案1】 >>> test1(_Conf) -> >>> Conf = kai_config:start_link([{hostname, ...}]), >>> kai_hash:start_link(Conf), >>> kai_store:start_link(Conf), >>> >>> のようにして kai_config オブジェクトを共有するというイメージでしょうか. >>> あるいは, >>> >>> 【案2】 >>> -module(kai_hash). >>> init(Args) -> >>> % ... >>> {ok, [{config, kai_config:start_link(Args)}]}. >>> >>> のようにして kai_config オブジェクトの複製を持つイメージでしょうか. >>> >>> 設定を動的に変更する予定はないですが,設定値というのはノード全体で共有されるのが素直な解釈なので,性能上の制約が明らかになるまでは【案2】のような複製は避けたほうが無難かなぁ. >>> そうしないと,忘れた頃に誰かがデバッグで苦労しそうな気がしました. >>> >>> あとは,kai_config は実質的に singleton なので,【現状】と【案1】に違いはほとんどないような? >>> >>> というわけで,kai_config のインターフェースを変更するメリットが分かってないわけですが,何か勘違いしてるかなぁ. >>> >>>> 考慮すべき点としては、いまのところ、ひとつしか思いつかないのですが、 >>>> >>>> - 設定情報が動的に変更されるかどうか? >>>> >>>> これは今の kai.config にある設定であれば、静的なものが >>>> ほとんどかなぁ、と思ってますがどうでしょう? >>>> # これからの発展によって変わるのかもしれんが >>> >>> リファクタリングの定石からいくと,同時に複数の機能を追加・変更するのはなるべく避けたほうがいいでしょうか (というか,僕はそうするのが好みなだけかも). >>> そうであれば,TCP server を書いて,すべてのテストが通るのをコミットしてから,kai_config を修正したほうがいいかも. >>> あるいは kai_config から先に修正するか. >>> >>> -- >>> Takeru INOUE <tak...@gm...> >>> >>> ------------------------------------------------------------------------- >>> Check out the new SourceForge.net Marketplace. >>> It's the best place to buy or sell services for >>> just about anything Open Source. >>> http://sourceforge.net/services/buy/index.php >>> _______________________________________________ >>> Kai-devel-ja mailing list >>> Kai...@li... >>> https://lists.sourceforge.net/lists/listinfo/kai-devel-ja >>> >> >> >> >> -- >> cooldaemon >> > > > > -- > Takeru INOUE <tak...@gm...> > -- cooldaemon |
From: Takeru I. <tak...@gm...> - 2008-06-29 14:20:41
|
>> 設定を動的に変更する予定はないですが,設定値というのはノード全体で共有されるのが素直な解釈なので,性能上の制約が明らかになるまでは【案2】のような複製は避けたほうが無難かなぁ. >> そうしないと,忘れた頃に誰かがデバッグで苦労しそうな気がしました. > > 今、コード読みはじめたばっかりなので、あまり大きなことは言えないですが、 > 常に設定サービスに問い合わせる場合、毎回同じあたいが返ってくるのか? ということを > 考えながらコードを追いかけることになるので、不変なのであれば、それが > コード上で明確になればいいなぁ、とおもっていました。 > # java なら final (ポインタの不変性) , Ruby なら定数(実は上書きできる) みたいなの それはそうだね. 僕は kai_config を書いた本人だから気にならないけど,他の人なら気になるかも. 実際,いくつかのモジュールでは設定値を変数に持ち直してループで繰り返し使っているところがある. これは,設定値が変更されないという前提があるからできてることだし. とはいえ final 的なことはできなそうだから,ドキュメントに "configuration values are never modified while running" とでも書いておくしかないかな. そして,「各プロセスでキャッシュしてよい」というルールにしたほうがいいのかなぁ. まぁ,細かいことだから神経質にならずにほっとくかぁ. >> リファクタリングの定石からいくと,同時に複数の機能を追加・変更するのはなるべく避けたほうがいいでしょうか (というか,僕はそうするのが好みなだけかも). >> そうであれば,TCP server を書いて,すべてのテストが通るのをコミットしてから,kai_config を修正したほうがいいかも. >> あるいは kai_config から先に修正するか. > > リファクタリングには機能の追加は含まれない、とか思想的なことはどうでもいいですが、 > たしかに、構造の変更と、機能の追加は分離すべきだとおもいます。 > ちょっとコード上の話にはまだきっちりついていてなくてすんません。 > > # 書いてる間にスレッドが更新されていく... > > shino > -- Takeru INOUE <tak...@gm...> |
From: Takeru I. <tak...@gm...> - 2008-06-29 14:16:41
|
> ▼修正順について > ・現在、 config はボトルネックとなっていない > ・アプリケーション全体で、設定値を保持する箇所は一カ所にする > ・同時に複数の機能を追加・変更するのはなるべく避けたほうがいい > > という事に関して、全くその通りだと思うので、kai_config をそのまま使います。 圧力っぽくなってたらごめんなさい>< 僕もあんまり正しい自信もないので,特に,後続の篠原のメールをみると別の観点からいまの kai_config はよろしくない点があるなぁと思いました. > ▼イメージについて > まー、必要ないのですが、一応、補足です。 > > ・現状 > %..snip.. > test1(_Conf) -> > kai_config:start_link([{hostname, "localhost"}, {port, 11011}, {n, 3}, > {number_of_buckets, 8}, > {number_of_virtual_nodes, 2}]), > kai_hash:start_link(), > %..snip.. > > ・案 > %..snip.. > test1(_Conf) -> > kai_hash:start_link([{hostname, "localhost"}, {port, 11011}, {n, 3}, > {number_of_buckets, 8}, > {number_of_virtual_nodes, 2}]), > %..snip.. > > と考えてました。 複製が発生するパターンですね. > で、init 時に > --- > Config = kai_config:new(Args, DefaultArgs) > --- > として、 Config を引き回し、実際に使う際に > --- > Hostname = Config:get(hostname). > --- > とするイメージでした。 > > > 2008/6/29 Takeru INOUE <tak...@gm...>: >>>>>案としては、kai_config が Option オブジェクト(Config オブジェクト)を返すのも >>>>>ありかな?と思うのですが、如何でしょうか? >>>> >>>> 上記、テストを書いていて、少し考え直しました。 >>>> >>>> ある一つのプロセスをテストする際 >>>> 毎回、kai_config プロセスを起動する事になるので >>>> それよりは、各プロセスの init 時に >>>> Args を元に Config オブジェクトを new するか >>>> start_link 時に Config オブジェクト を Args として渡した方が >>>> 良い気がするのですが、如何でしょうか? >>> >>> 賛成です。理由は、 >>> >>>> 疎結合にした方が、テストしやすいなーと) >>> >>> まさにこれにつきるとおもいます。 >> >> 性能面からは,kai_config のチューニングはまだ不要かなと思ってます. >> kai_store も同じく. >> 一方で,kai_hash は一つの処理が 300ms を超え得ることがわかってるので,対策が必要です (これはすでに Tracker にある). >> >> ちなみに,kai_config で ets を使っている理由は,protected にすれば他のモジュールから読み取りできるようになるから. >> この方法でも,特定のプロセスによる占有を回避できます. >> ただし,そもそも ets 重いからやめようということがあるならダメですが. >> >> 次に,インターフェースの改良案についてです. >> これは, >> >> 【現状】 >> test1(_Conf) -> >> kai_config:start_link([{hostname, ....}]), >> kai_hash:start_link(), >> kai_store:start_link(), >> >> のように書いているのを, >> >> 【案1】 >> test1(_Conf) -> >> Conf = kai_config:start_link([{hostname, ...}]), >> kai_hash:start_link(Conf), >> kai_store:start_link(Conf), >> >> のようにして kai_config オブジェクトを共有するというイメージでしょうか. >> あるいは, >> >> 【案2】 >> -module(kai_hash). >> init(Args) -> >> % ... >> {ok, [{config, kai_config:start_link(Args)}]}. >> >> のようにして kai_config オブジェクトの複製を持つイメージでしょうか. >> >> 設定を動的に変更する予定はないですが,設定値というのはノード全体で共有されるのが素直な解釈なので,性能上の制約が明らかになるまでは【案2】のような複製は避けたほうが無難かなぁ. >> そうしないと,忘れた頃に誰かがデバッグで苦労しそうな気がしました. >> >> あとは,kai_config は実質的に singleton なので,【現状】と【案1】に違いはほとんどないような? >> >> というわけで,kai_config のインターフェースを変更するメリットが分かってないわけですが,何か勘違いしてるかなぁ. >> >>> 考慮すべき点としては、いまのところ、ひとつしか思いつかないのですが、 >>> >>> - 設定情報が動的に変更されるかどうか? >>> >>> これは今の kai.config にある設定であれば、静的なものが >>> ほとんどかなぁ、と思ってますがどうでしょう? >>> # これからの発展によって変わるのかもしれんが >> >> リファクタリングの定石からいくと,同時に複数の機能を追加・変更するのはなるべく避けたほうがいいでしょうか (というか,僕はそうするのが好みなだけかも). >> そうであれば,TCP server を書いて,すべてのテストが通るのをコミットしてから,kai_config を修正したほうがいいかも. >> あるいは kai_config から先に修正するか. >> >> -- >> Takeru INOUE <tak...@gm...> >> >> ------------------------------------------------------------------------- >> Check out the new SourceForge.net Marketplace. >> It's the best place to buy or sell services for >> just about anything Open Source. >> http://sourceforge.net/services/buy/index.php >> _______________________________________________ >> Kai-devel-ja mailing list >> Kai...@li... >> https://lists.sourceforge.net/lists/listinfo/kai-devel-ja >> > > > > -- > cooldaemon > -- Takeru INOUE <tak...@gm...> |
From: shun s. <shi...@gm...> - 2008-06-29 14:10:41
|
2008/06/29 22:16 Takeru INOUE <tak...@gm...>: >>> 疎結合にした方が、テストしやすいなーと) >> >> まさにこれにつきるとおもいます。 > > 性能面からは,kai_config のチューニングはまだ不要かなと思ってます. 「疎結合」が論点なんで、これは同意します。 > 一方で,kai_hash は一つの処理が 300ms を超え得ることがわかってるので,対策が必要です (これはすでに Tracker にある). それは大変だ :-< > 【案1】 > test1(_Conf) -> > Conf = kai_config:start_link([{hostname, ...}]), > kai_hash:start_link(Conf), > kai_store:start_link(Conf), > 【案2】 > -module(kai_hash). > init(Args) -> > % ... > {ok, [{config, kai_config:start_link(Args)}]}. たしかにコードを出したほうがクッキリしますね。ありがとさん。 ぼくは、案2 です。 > 設定を動的に変更する予定はないですが,設定値というのはノード全体で共有されるのが素直な解釈なので,性能上の制約が明らかになるまでは【案2】のような複製は避けたほうが無難かなぁ. > そうしないと,忘れた頃に誰かがデバッグで苦労しそうな気がしました. 今、コード読みはじめたばっかりなので、あまり大きなことは言えないですが、 常に設定サービスに問い合わせる場合、毎回同じあたいが返ってくるのか? ということを 考えながらコードを追いかけることになるので、不変なのであれば、それが コード上で明確になればいいなぁ、とおもっていました。 # java なら final (ポインタの不変性) , Ruby なら定数(実は上書きできる) みたいなの > リファクタリングの定石からいくと,同時に複数の機能を追加・変更するのはなるべく避けたほうがいいでしょうか (というか,僕はそうするのが好みなだけかも). > そうであれば,TCP server を書いて,すべてのテストが通るのをコミットしてから,kai_config を修正したほうがいいかも. > あるいは kai_config から先に修正するか. リファクタリングには機能の追加は含まれない、とか思想的なことはどうでもいいですが、 たしかに、構造の変更と、機能の追加は分離すべきだとおもいます。 ちょっとコード上の話にはまだきっちりついていてなくてすんません。 # 書いてる間にスレッドが更新されていく... shino |