kai-devel-ja Mailing List for kai (Page 5)
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: Takeru I. <tak...@gm...> - 2008-08-28 13:39:53
|
> とりあえず、trunk に kai_tcp_server の修正だけ入れてしまい > 二回目のリリース後に検討するという事で如何でしょう? この線で 0.2.0 をリリースしました. SASL は 0.3 に向けて考えていきましょう. 0.3 の目標は - SASL - Vector Clocks - dets といったところでしょうか. 2008/8/24 Takeru INOUE <tak...@gm...>: > 0.1 のリリースから一ヶ月半が経つので,そろそろ Kai 0.2 をリリースしたいなと考えてます. > > cooldaemon さんが取り組んでくれている SASL が落ち着いたら,connection pool をマージして,それを 0.2 > にしようと思ってますが,いかがでしょうか. > > 0.1 からの差分は,次のようになる予定です. > > - Better stability under high load > - Introducing connection pooling > - Avoidance of deadlock > - Fixing a bug of node list in the consistent hash > - Preparation for vector clocks > - Routing requests to the coordinator > - Operability issues > - SASL > - EDoc and dialyzer > > > 2008/8/21 <tak...@gm...>: >> はい、詳しい人にやってもらったほうがよさそうなので、お願いしますm(__)m >> >> On 8/21/08, masahito ikuta <coo...@gm...> wrote: >>>> みんな,show のような関数を定義して使ってるんですかねぇ. >>> >>> ELOG は、yaws の source を見て盗んだような記憶があります。 >>> show は、何となく私が適当に作ったものです。 >>> 試しに、私のほうで branch を作って SASL を組み込んでみましょうか? > > -- > Takeru INOUE <tak...@gm...> > -- Takeru INOUE <tak...@gm...> |
From: masahito i. <coo...@gm...> - 2008-08-27 22:55:45
|
kai-devel-ja に送り忘れたので再送します。 ごめんなさい。 > ちょっと力不足かなぁ.. とりあえず、trunk に kai_tcp_server の修正だけ入れてしまい 二回目のリリース後に検討するという事で如何でしょう? で、その際は、kai_tcp_server は、kai_log に依存させるつもりです。 2008/8/26 Takeru INOUE <tak...@gm...>: >>>ところが,SASL の出力ではこれができないので,段落単位で動作する "専用 grep" を作るか,ファイルに落としてから適当な処理をすることになります. >> >> まだ試してませんが、rb:grep/1 というのがあります。 >> 引数は、正規表現(文字列型)です。 > > rb で出来ることと出来ないことをまとめてみました. > ↓で正しいでしょうか? > > ・"INFO REPORT" の先頭 10件を出力. > > > rb:rescan([{type, info_msg}]). > > rb:show(). > > ・"INFO REPORT" の先頭 10件から,"abc" を含むものを出力. > > > rb:rescan([{type, info_msg}, {max, 10}]). > > rb:grep("abc"). > > ・"INFO REPORT" の "abc" を含むものから,先頭 10件を出力. > > Not available? > > ・"INFO REPORT" から,"abc" と "def" を含むものを出力. > > Not available? > > ちょっと力不足かなぁ.. > > >>> kai_tcp_server でのエラー出力に ?error マクロを使ってしまうと,kai.hrl への依存が残ってしまうように思いました. >> >> kai_tcp_server は、kai.hrl で定義されているレコード tcp_server_option にも依存しています。 > > あ,そうですね. > >> もし、kai.hrl と切り離すのであれば、tcp_server_option を kai_tcp_server.hrl へ移動し >> ?error などは、kai_error.hrl へ移動するのが良いかもしれません。 >> (kai_error.hrl も他のプロジェクトで汎用的に使えそう。少なくとも私は使うw;) > > では,そのへんの依存は残しても良しとしましょう. > >>> ちょっと神経質かなぁ.. >> >> 普通の感覚だと思います。 >> 言い訳ですが、tcp_server_option の件もあったので、あとで解決しようかなーと(。。;; >> >>>> 一旦、rb を再起動して rb:show/[0,1] や rb:list/[0,1] を評価して下さい。 >> >> これは、誤情報かも・・・。rb:rescan/[0,1] ってのが使えそう。 >> rb:grep/1 と共に検証してみます。 >> >> 2008/8/25 Takeru INOUE <tak...@gm...>: >>> 2008/8/25 masahito ikuta <coo...@gm...>: >>>> sasl 組み込みに関しての報告です。 >>>> >>>> https://kai.svn.sourceforge.net/svnroot/kai/branches/cooldaemon_embed_sasl/ >>>> >>>> 修正点は下記の通りです。 >>>> ・kai_log を error_logger に置き換え(kai_log は、一応削除しましたが、復活は可能です) >>>> ・kai.config を make で生成するように修正 (log ディレクトリの指定の為です) >>>> ・kai_tcp_server で accept に失敗した際は、sleep して再度 accept を実行するよう修正 >>> >>> kai_tcp_server でのエラー出力に ?error マクロを使ってしまうと,kai.hrl への依存が残ってしまうように思いました. >>> 独立したモジュールとして使えるようにするためには,kai_tcp_server については error_logger >>> を直接呼び出したほうがいいかもと思いました. >>> ちょっと神経質かなぁ.. >>> >>> もし,?error のまま残すのであれば,先のメールに書いた「SASL の段落出力が気にくわない」という問題に対して妥協案を出せるかもしれません. >>> エラー出力には ?error などのマクロなどを使うようにしておき,マクロ定義で error_logger と kai_log >>> を選択するようにする,という手もありますね. >>> とはいえ,SASL は長い年月を経て今の仕様になっているわけだから,段落出力を嫌う僕が少数派なのかなぁ. >>> >>>> error_logger でログをファイルに残す為 >>>> Getting Started を下記の通り修正する必要があります。 >>>> >>>>>% erl -pa ebin -config kai -kai n 1 -kai r 1 -kai w 1 >>>> ↓ >>>>>% erl -boot start_sasl +W w -pa ebin -config ebin/kai -kai n 1 -kai r 1 -kai w 1 >>>> >>>>>% erl -pa ebin -config kai -kai port 11011 -kai memcache_port 11211 >>>> ↓ >>>>>% erl -boot start_sasl +W w -pa ebin -config ebin/kai -kai port 11011 -kai memcache_port 11211 >>>> >>>> ちなみに、rb は、rb:start/0 を評価された時点でログファイルを読み込むので >>>> rb:start/0 評価後に、error_logger で info_msg 等をログファイルに書き込んだ場合は >>>> 一旦、rb を再起動して rb:show/[0,1] や rb:list/[0,1] を評価して下さい。 >>>> >>>> 最後に、少し気になる点ですが・・・ >>>> timer:tc(kai_hash, choose_bucket_randomly, []) が重い為 >>>> 私の環境では、テストに失敗してしまいます。 >>>> これは、今回の修正とは関係ないハズなのですが、念のため挙げておきます。 >>> >>> そうでしたか.. >>> ちょっと余裕のある値にしたつもりでしたが,もう少しゆとりを持たせておきます. >>> >>> -- >>> Takeru INOUE <tak...@gm...> >>> >> >> >> >> -- >> cooldaemon >> > > > > -- > Takeru INOUE <tak...@gm...> > -- cooldaemon |
From: Takeru I. <tak...@gm...> - 2008-08-26 11:59:35
|
>>ところが,SASL の出力ではこれができないので,段落単位で動作する "専用 grep" を作るか,ファイルに落としてから適当な処理をすることになります. > > まだ試してませんが、rb:grep/1 というのがあります。 > 引数は、正規表現(文字列型)です。 rb で出来ることと出来ないことをまとめてみました. ↓で正しいでしょうか? ・"INFO REPORT" の先頭 10件を出力. > rb:rescan([{type, info_msg}]). > rb:show(). ・"INFO REPORT" の先頭 10件から,"abc" を含むものを出力. > rb:rescan([{type, info_msg}, {max, 10}]). > rb:grep("abc"). ・"INFO REPORT" の "abc" を含むものから,先頭 10件を出力. Not available? ・"INFO REPORT" から,"abc" と "def" を含むものを出力. Not available? ちょっと力不足かなぁ.. >> kai_tcp_server でのエラー出力に ?error マクロを使ってしまうと,kai.hrl への依存が残ってしまうように思いました. > > kai_tcp_server は、kai.hrl で定義されているレコード tcp_server_option にも依存しています。 あ,そうですね. > もし、kai.hrl と切り離すのであれば、tcp_server_option を kai_tcp_server.hrl へ移動し > ?error などは、kai_error.hrl へ移動するのが良いかもしれません。 > (kai_error.hrl も他のプロジェクトで汎用的に使えそう。少なくとも私は使うw;) では,そのへんの依存は残しても良しとしましょう. >> ちょっと神経質かなぁ.. > > 普通の感覚だと思います。 > 言い訳ですが、tcp_server_option の件もあったので、あとで解決しようかなーと(。。;; > >>> 一旦、rb を再起動して rb:show/[0,1] や rb:list/[0,1] を評価して下さい。 > > これは、誤情報かも・・・。rb:rescan/[0,1] ってのが使えそう。 > rb:grep/1 と共に検証してみます。 > > 2008/8/25 Takeru INOUE <tak...@gm...>: >> 2008/8/25 masahito ikuta <coo...@gm...>: >>> sasl 組み込みに関しての報告です。 >>> >>> https://kai.svn.sourceforge.net/svnroot/kai/branches/cooldaemon_embed_sasl/ >>> >>> 修正点は下記の通りです。 >>> ・kai_log を error_logger に置き換え(kai_log は、一応削除しましたが、復活は可能です) >>> ・kai.config を make で生成するように修正 (log ディレクトリの指定の為です) >>> ・kai_tcp_server で accept に失敗した際は、sleep して再度 accept を実行するよう修正 >> >> kai_tcp_server でのエラー出力に ?error マクロを使ってしまうと,kai.hrl への依存が残ってしまうように思いました. >> 独立したモジュールとして使えるようにするためには,kai_tcp_server については error_logger >> を直接呼び出したほうがいいかもと思いました. >> ちょっと神経質かなぁ.. >> >> もし,?error のまま残すのであれば,先のメールに書いた「SASL の段落出力が気にくわない」という問題に対して妥協案を出せるかもしれません. >> エラー出力には ?error などのマクロなどを使うようにしておき,マクロ定義で error_logger と kai_log >> を選択するようにする,という手もありますね. >> とはいえ,SASL は長い年月を経て今の仕様になっているわけだから,段落出力を嫌う僕が少数派なのかなぁ. >> >>> error_logger でログをファイルに残す為 >>> Getting Started を下記の通り修正する必要があります。 >>> >>>>% erl -pa ebin -config kai -kai n 1 -kai r 1 -kai w 1 >>> ↓ >>>>% erl -boot start_sasl +W w -pa ebin -config ebin/kai -kai n 1 -kai r 1 -kai w 1 >>> >>>>% erl -pa ebin -config kai -kai port 11011 -kai memcache_port 11211 >>> ↓ >>>>% erl -boot start_sasl +W w -pa ebin -config ebin/kai -kai port 11011 -kai memcache_port 11211 >>> >>> ちなみに、rb は、rb:start/0 を評価された時点でログファイルを読み込むので >>> rb:start/0 評価後に、error_logger で info_msg 等をログファイルに書き込んだ場合は >>> 一旦、rb を再起動して rb:show/[0,1] や rb:list/[0,1] を評価して下さい。 >>> >>> 最後に、少し気になる点ですが・・・ >>> timer:tc(kai_hash, choose_bucket_randomly, []) が重い為 >>> 私の環境では、テストに失敗してしまいます。 >>> これは、今回の修正とは関係ないハズなのですが、念のため挙げておきます。 >> >> そうでしたか.. >> ちょっと余裕のある値にしたつもりでしたが,もう少しゆとりを持たせておきます. >> >> -- >> Takeru INOUE <tak...@gm...> >> > > > > -- > cooldaemon > -- Takeru INOUE <tak...@gm...> |
From: masahito i. <coo...@gm...> - 2008-08-26 03:33:46
|
>ところが,SASL の出力ではこれができないので,段落単位で動作する "専用 grep" を作るか,ファイルに落としてから適当な処理をすることになります. まだ試してませんが、rb:grep/1 というのがあります。 引数は、正規表現(文字列型)です。 > kai_tcp_server でのエラー出力に ?error マクロを使ってしまうと,kai.hrl への依存が残ってしまうように思いました. kai_tcp_server は、kai.hrl で定義されているレコード tcp_server_option にも依存しています。 もし、kai.hrl と切り離すのであれば、tcp_server_option を kai_tcp_server.hrl へ移動し ?error などは、kai_error.hrl へ移動するのが良いかもしれません。 (kai_error.hrl も他のプロジェクトで汎用的に使えそう。少なくとも私は使うw;) > ちょっと神経質かなぁ.. 普通の感覚だと思います。 言い訳ですが、tcp_server_option の件もあったので、あとで解決しようかなーと(。。;; >> 一旦、rb を再起動して rb:show/[0,1] や rb:list/[0,1] を評価して下さい。 これは、誤情報かも・・・。rb:rescan/[0,1] ってのが使えそう。 rb:grep/1 と共に検証してみます。 2008/8/25 Takeru INOUE <tak...@gm...>: > 2008/8/25 masahito ikuta <coo...@gm...>: >> sasl 組み込みに関しての報告です。 >> >> https://kai.svn.sourceforge.net/svnroot/kai/branches/cooldaemon_embed_sasl/ >> >> 修正点は下記の通りです。 >> ・kai_log を error_logger に置き換え(kai_log は、一応削除しましたが、復活は可能です) >> ・kai.config を make で生成するように修正 (log ディレクトリの指定の為です) >> ・kai_tcp_server で accept に失敗した際は、sleep して再度 accept を実行するよう修正 > > kai_tcp_server でのエラー出力に ?error マクロを使ってしまうと,kai.hrl への依存が残ってしまうように思いました. > 独立したモジュールとして使えるようにするためには,kai_tcp_server については error_logger > を直接呼び出したほうがいいかもと思いました. > ちょっと神経質かなぁ.. > > もし,?error のまま残すのであれば,先のメールに書いた「SASL の段落出力が気にくわない」という問題に対して妥協案を出せるかもしれません. > エラー出力には ?error などのマクロなどを使うようにしておき,マクロ定義で error_logger と kai_log > を選択するようにする,という手もありますね. > とはいえ,SASL は長い年月を経て今の仕様になっているわけだから,段落出力を嫌う僕が少数派なのかなぁ. > >> error_logger でログをファイルに残す為 >> Getting Started を下記の通り修正する必要があります。 >> >>>% erl -pa ebin -config kai -kai n 1 -kai r 1 -kai w 1 >> ↓ >>>% erl -boot start_sasl +W w -pa ebin -config ebin/kai -kai n 1 -kai r 1 -kai w 1 >> >>>% erl -pa ebin -config kai -kai port 11011 -kai memcache_port 11211 >> ↓ >>>% erl -boot start_sasl +W w -pa ebin -config ebin/kai -kai port 11011 -kai memcache_port 11211 >> >> ちなみに、rb は、rb:start/0 を評価された時点でログファイルを読み込むので >> rb:start/0 評価後に、error_logger で info_msg 等をログファイルに書き込んだ場合は >> 一旦、rb を再起動して rb:show/[0,1] や rb:list/[0,1] を評価して下さい。 >> >> 最後に、少し気になる点ですが・・・ >> timer:tc(kai_hash, choose_bucket_randomly, []) が重い為 >> 私の環境では、テストに失敗してしまいます。 >> これは、今回の修正とは関係ないハズなのですが、念のため挙げておきます。 > > そうでしたか.. > ちょっと余裕のある値にしたつもりでしたが,もう少しゆとりを持たせておきます. > > -- > Takeru INOUE <tak...@gm...> > -- cooldaemon |
From: Takeru I. <tak...@gm...> - 2008-08-25 13:32:47
|
2008/8/25 masahito ikuta <coo...@gm...>: > sasl 組み込みに関しての報告です。 > > https://kai.svn.sourceforge.net/svnroot/kai/branches/cooldaemon_embed_sasl/ > > 修正点は下記の通りです。 > ・kai_log を error_logger に置き換え(kai_log は、一応削除しましたが、復活は可能です) > ・kai.config を make で生成するように修正 (log ディレクトリの指定の為です) > ・kai_tcp_server で accept に失敗した際は、sleep して再度 accept を実行するよう修正 kai_tcp_server でのエラー出力に ?error マクロを使ってしまうと,kai.hrl への依存が残ってしまうように思いました. 独立したモジュールとして使えるようにするためには,kai_tcp_server については error_logger を直接呼び出したほうがいいかもと思いました. ちょっと神経質かなぁ.. もし,?error のまま残すのであれば,先のメールに書いた「SASL の段落出力が気にくわない」という問題に対して妥協案を出せるかもしれません. エラー出力には ?error などのマクロなどを使うようにしておき,マクロ定義で error_logger と kai_log を選択するようにする,という手もありますね. とはいえ,SASL は長い年月を経て今の仕様になっているわけだから,段落出力を嫌う僕が少数派なのかなぁ. > error_logger でログをファイルに残す為 > Getting Started を下記の通り修正する必要があります。 > >>% erl -pa ebin -config kai -kai n 1 -kai r 1 -kai w 1 > ↓ >>% erl -boot start_sasl +W w -pa ebin -config ebin/kai -kai n 1 -kai r 1 -kai w 1 > >>% erl -pa ebin -config kai -kai port 11011 -kai memcache_port 11211 > ↓ >>% erl -boot start_sasl +W w -pa ebin -config ebin/kai -kai port 11011 -kai memcache_port 11211 > > ちなみに、rb は、rb:start/0 を評価された時点でログファイルを読み込むので > rb:start/0 評価後に、error_logger で info_msg 等をログファイルに書き込んだ場合は > 一旦、rb を再起動して rb:show/[0,1] や rb:list/[0,1] を評価して下さい。 > > 最後に、少し気になる点ですが・・・ > timer:tc(kai_hash, choose_bucket_randomly, []) が重い為 > 私の環境では、テストに失敗してしまいます。 > これは、今回の修正とは関係ないハズなのですが、念のため挙げておきます。 そうでしたか.. ちょっと余裕のある値にしたつもりでしたが,もう少しゆとりを持たせておきます. -- Takeru INOUE <tak...@gm...> |
From: Takeru I. <tak...@gm...> - 2008-08-25 13:26:48
|
さくっと対応していただきありがとうございます. 軽く使ってみましたのですが,クセのある出力がどうにも扱いにくく感じられます. 振り出しに戻して申し訳ないのですが,皆さんのご意見を聞かせていただけますでしょうか. Kai を走らせた後,次のようなコマンドを実行して,すべてのログを出力させました. % erl -boot start_sasl +W w -pa ebin -config ebin/kai -run rb start -s rb show -run c q すると,このメールの最後に添付したようなログが出力されます. 一般的な「行指向のログ」ではなく,SASL 特有の「段落単位のログ」になります. また,プロンプトのような "1>" が混ざってしまうようです (除去できるのかな?). 段落単位のログになることは知っていたのですが,改めて見てみるとつらい気がしてきました. 僕はログを見るときに,grep, sort, sed, perl などを使って行単位でフィルタをかけることをよくやります (古い人間なのだろうか?). Apache のような典型的な行指向ログでは,このアプローチは役に立ちます. ところが,SASL の出力ではこれができないので,段落単位で動作する "専用 grep" を作るか,ファイルに落としてから適当な処理をすることになります. というわけで,個人的には SASL を使うメリットがイマイチよくわからなくなっているのですが,皆さんどうお考えでしょうか. --- rb: reading report...done. rb: reading report...done. rb: reading report...Eshell V5.6.2 (abort with ^G) done. 1> rb: reading report...1> done. 1> rb: reading report...1> done. 1> rb: reading report...1> done. 1> rb: reading report...1> done. 1> rb: reading report...1> done. 1> rb: reading report...1> done. 1> rb: reading report...1> done. 1> PROGRESS REPORT <0.32.0> 2008-08-25 22:09:49 1> =============================================================================== 1> supervisor1> {local,sasl_safe_sup} 1> started1> 1> [{pid,<0.33.0>}, {name,alarm_handler}, {mfa,{alarm_handler,start_link,[]}}, {restart_type,permanent}, {shutdown,2000}, {child_type,worker}] 1> 1> PROGRESS REPORT <0.32.0> 2008-08-25 22:09:49 1> =============================================================================== 1> supervisor1> {local,sasl_safe_sup} 1> started1> 1> [{pid,<0.34.0>}, {name,overload}, {mfa,{overload,start_link,[]}}, {restart_type,permanent}, {shutdown,2000}, {child_type,worker}] 1> 1> 2008/8/25 masahito ikuta <coo...@gm...>: > sasl 組み込みに関しての報告です。 > > https://kai.svn.sourceforge.net/svnroot/kai/branches/cooldaemon_embed_sasl/ > > 修正点は下記の通りです。 > ・kai_log を error_logger に置き換え(kai_log は、一応削除しましたが、復活は可能です) > ・kai.config を make で生成するように修正 (log ディレクトリの指定の為です) > ・kai_tcp_server で accept に失敗した際は、sleep して再度 accept を実行するよう修正 > > error_logger でログをファイルに残す為 > Getting Started を下記の通り修正する必要があります。 > >>% erl -pa ebin -config kai -kai n 1 -kai r 1 -kai w 1 > ↓ >>% erl -boot start_sasl +W w -pa ebin -config ebin/kai -kai n 1 -kai r 1 -kai w 1 > >>% erl -pa ebin -config kai -kai port 11011 -kai memcache_port 11211 > ↓ >>% erl -boot start_sasl +W w -pa ebin -config ebin/kai -kai port 11011 -kai memcache_port 11211 > > ちなみに、rb は、rb:start/0 を評価された時点でログファイルを読み込むので > rb:start/0 評価後に、error_logger で info_msg 等をログファイルに書き込んだ場合は > 一旦、rb を再起動して rb:show/[0,1] や rb:list/[0,1] を評価して下さい。 > > 最後に、少し気になる点ですが・・・ > timer:tc(kai_hash, choose_bucket_randomly, []) が重い為 > 私の環境では、テストに失敗してしまいます。 > これは、今回の修正とは関係ないハズなのですが、念のため挙げておきます。 > > -- > cooldaemon > > ------------------------------------------------------------------------- > This SF.Net email is sponsored by the Moblin Your Move Developer's challenge > Build the coolest Linux based applications with Moblin SDK & win great prizes > Grand prize is a trip for two to an Open Source event anywhere in the world > http://moblin-contest.org/redirect.php?banner_id=100&url=/ > _______________________________________________ > Kai-devel-ja mailing list > Kai...@li... > https://lists.sourceforge.net/lists/listinfo/kai-devel-ja > -- Takeru INOUE <tak...@gm...> |
From: masahito i. <coo...@gm...> - 2008-08-25 03:37:11
|
sasl 組み込みに関しての報告です。 https://kai.svn.sourceforge.net/svnroot/kai/branches/cooldaemon_embed_sasl/ 修正点は下記の通りです。 ・kai_log を error_logger に置き換え(kai_log は、一応削除しましたが、復活は可能です) ・kai.config を make で生成するように修正 (log ディレクトリの指定の為です) ・kai_tcp_server で accept に失敗した際は、sleep して再度 accept を実行するよう修正 error_logger でログをファイルに残す為 Getting Started を下記の通り修正する必要があります。 >% erl -pa ebin -config kai -kai n 1 -kai r 1 -kai w 1 ↓ >% erl -boot start_sasl +W w -pa ebin -config ebin/kai -kai n 1 -kai r 1 -kai w 1 >% erl -pa ebin -config kai -kai port 11011 -kai memcache_port 11211 ↓ >% erl -boot start_sasl +W w -pa ebin -config ebin/kai -kai port 11011 -kai memcache_port 11211 ちなみに、rb は、rb:start/0 を評価された時点でログファイルを読み込むので rb:start/0 評価後に、error_logger で info_msg 等をログファイルに書き込んだ場合は 一旦、rb を再起動して rb:show/[0,1] や rb:list/[0,1] を評価して下さい。 最後に、少し気になる点ですが・・・ timer:tc(kai_hash, choose_bucket_randomly, []) が重い為 私の環境では、テストに失敗してしまいます。 これは、今回の修正とは関係ないハズなのですが、念のため挙げておきます。 -- cooldaemon |
From: Takeru I. <tak...@gm...> - 2008-08-24 13:22:33
|
0.1 のリリースから一ヶ月半が経つので,そろそろ Kai 0.2 をリリースしたいなと考えてます. cooldaemon さんが取り組んでくれている SASL が落ち着いたら,connection pool をマージして,それを 0.2 にしようと思ってますが,いかがでしょうか. 0.1 からの差分は,次のようになる予定です. - Better stability under high load - Introducing connection pooling - Avoidance of deadlock - Fixing a bug of node list in the consistent hash - Preparation for vector clocks - Routing requests to the coordinator - Operability issues - SASL - EDoc and dialyzer 2008/8/21 <tak...@gm...>: > はい、詳しい人にやってもらったほうがよさそうなので、お願いしますm(__)m > > On 8/21/08, masahito ikuta <coo...@gm...> wrote: >>> みんな,show のような関数を定義して使ってるんですかねぇ. >> >> ELOG は、yaws の source を見て盗んだような記憶があります。 >> show は、何となく私が適当に作ったものです。 >> 試しに、私のほうで branch を作って SASL を組み込んでみましょうか? -- Takeru INOUE <tak...@gm...> |
From: Takeru I. <tak...@gm...> - 2008-08-24 13:06:03
|
初めまして,kuenishi さん. Kai はまだ 2000行くらいの小さなプロジェクトなので (それでも最初の倍になってるなぁ),どんどんいじってみてください. あと,Dynamo 論文についての疑問とかを ML に投げてくださっても構わないですよ. ではでは. 2008/8/23 Kota Uenishi <kue...@gm...>: > 初めまして、kuenishiといいます。 > > kai-devel-jaに登録しようとして(sf.netがどんどんわからない…) > 間違っておくってしまったメール( [Kai-devel-ja] kai! 2008-08-18 18:16)が > フィルタを通ってしまったようで…。お騒がせしてすいませんf(^^;) > > Dynamoに限らず、erlangを使った分散システムに興味を持ってます。 > OTPなどをいずれいじっていきたい(可能なら職場で使いたい)と思っているので、 > erlangはまだ素人同然ですが、よろしくおねがいします。 > %% まずはしこしこコードや論文を読みます > > On Tue, Aug 19, 2008 at 3:16 AM, Kota Uenishi <kue...@gm...> wrote: >> -- >> ~^~^~^~^~^~^~^~^~^~^~^~^~ >> Kota Uenishi >> kue...@gm... >> > > > > -- > ~^~^~^~^~^~^~^~^~^~^~^~^~ > Kota Uenishi > kue...@gm... > > ------------------------------------------------------------------------- > This SF.Net email is sponsored by the Moblin Your Move Developer's challenge > Build the coolest Linux based applications with Moblin SDK & win great prizes > Grand prize is a trip for two to an Open Source event anywhere in the world > http://moblin-contest.org/redirect.php?banner_id=100&url=/ > _______________________________________________ > Kai-devel-ja mailing list > Kai...@li... > https://lists.sourceforge.net/lists/listinfo/kai-devel-ja > -- Takeru INOUE <tak...@gm...> |
From: Kota U. <kue...@gm...> - 2008-08-23 05:31:52
|
初めまして、kuenishiといいます。 kai-devel-jaに登録しようとして(sf.netがどんどんわからない…) 間違っておくってしまったメール( [Kai-devel-ja] kai! 2008-08-18 18:16)が フィルタを通ってしまったようで…。お騒がせしてすいませんf(^^;) Dynamoに限らず、erlangを使った分散システムに興味を持ってます。 OTPなどをいずれいじっていきたい(可能なら職場で使いたい)と思っているので、 erlangはまだ素人同然ですが、よろしくおねがいします。 %% まずはしこしこコードや論文を読みます On Tue, Aug 19, 2008 at 3:16 AM, Kota Uenishi <kue...@gm...> wrote: > -- > ~^~^~^~^~^~^~^~^~^~^~^~^~ > Kota Uenishi > kue...@gm... > -- ~^~^~^~^~^~^~^~^~^~^~^~^~ Kota Uenishi kue...@gm... |
From: <tak...@gm...> - 2008-08-21 09:29:12
|
はい、詳しい人にやってもらったほうがよさそうなので、お願いしますm(__)m On 8/21/08, masahito ikuta <coo...@gm...> wrote: >> みんな,show のような関数を定義して使ってるんですかねぇ. > > ELOG は、yaws の source を見て盗んだような記憶があります。 > show は、何となく私が適当に作ったものです。 > 試しに、私のほうで branch を作って SASL を組み込んでみましょうか? > > 2008/8/21 Takeru INOUE <tak...@gm...>: >> とても参考になります. >> >> みんな,show のような関数を定義して使ってるんですかねぇ. >> ちょっと試してみます (今日からしばらくオフラインなので,来週にでも). >> >> 2008/8/21 masahito ikuta <coo...@gm...>: >>> 確かに、rb を使う事は必須です。 >>> http://d.hatena.ne.jp/cooldaemon/20070918/1190085199 >>> >>> 私が以前作った key/value store の例ですが・・・ >>> http://labs.miu.vc/svn/cooldaemon/erl/yamd/trunk/include/yamd.hrl >>> ↑こんなのを定義しておいて・・・ >>> エラー発生時に >>> ELOG("gen_tcp:listen/2 returned error\n~p\n", [Reason]). >>> みたいな感じで使います。 >>> >>> 出力は、コマンドラインから >>> $ ./scripts/yamd show error >>> と入力すると出るようにしているのですが >>> それは、↓ここの show 関数で定義しています。 >>> http://labs.miu.vc/svn/cooldaemon/erl/yamd/trunk/src/yamd_ctl.erl >>> >>> 去年の事で、記憶が曖昧なのですが >>> たしか、絞り込みは type でしかできなかったような? >>> >>> 2008/8/20 Takeru INOUE <tak...@gm...>: >>>> では,SASL の方向にしましょう. >>>> >>>> …と言いたいのですが,SASL の上手い使い方がわかってません. >>>> 『プログラミング Erlang』を読んだときに,rb を使わないとログを解析できないように思えて,独自の kai_log >>>> モジュールを使うようにしたという経緯があります. >>>> やはり,Perl などを使ってログ解析できないのはつらいので. >>>> 上手い手はあるのでしょうか? >>>> >>>> 2008/8/20 masahito ikuta <coo...@gm...>: >>>>> kai 全体で SASL を使いつつ >>>>> 該当箇所で、exit({error, Reason}) で落とすというのは、どうでしょうか? >>>>> >>>>> 2008/8/20 Takeru INOUE <tak...@gm...>: >>>>>> 高負荷時に,file descriptor が不足して,kai_tcp_server の gen_tcp:accept >>>>>> がエラーを返すことがありました. >>>>>> 現在の実装では,gen_tcp:accept の戻り値として {ok, Socket} しか受け取らないようになっていますが,{error, >>>>>> Reason} も捕獲するようにしておこうと思います. >>>>>> また,ログにも出力しようかと考えています. >>>>>> >>>>>> 理由は次の通りです. >>>>>> Erlang の流儀に従うのであれば,エラーを捕獲せずに,supervisor などに後処理を任せるのかもしれません. >>>>>> ところが,今回の場合,手がかりなしで異常終了してしまったので (下記参照),原因を突き止めるのに苦労しました. >>>>>> >>>>>> =INFO REPORT==== 17-Aug-2008::19:44:30 === >>>>>> application: kai >>>>>> exited: shutdown >>>>>> type: temporary >>>>>> >>>>>> # いまだに Erlang のエラーメッセージの法則がよく分からない… >>>>>> >>>>>> というわけで,エラーを捕獲してログに残そうと思うのですが,どんなもんでしょうか? >>>>>> まだ trunk/ には反映させていません. >>>>>> この修正は,↓ で見ることができます. >>>>>> >>>>>> svn diff -r 73:74 http://kai.svn.sourceforge.net/svnroot/kai >>>>>> >>>>>> なお,ログを残すためには,tcp_server が kai_log に依存することになります. >>>>>> 最終的には,kai >>>>>> に依存しない独立したモジュールにするのがよいと思いますが,とりあえず開発のしやすさを優先してログを出力できればと思ってます >>>>>> (SASL とかを使うべき何だろうか?). >>> >>> -- >>> cooldaemon >>> >> >> >> >> -- >> Takeru INOUE <tak...@gm...> >> > > > > -- > cooldaemon > -- Takeru INOUE <tak...@gm...> |
From: masahito i. <coo...@gm...> - 2008-08-21 06:08:04
|
> みんな,show のような関数を定義して使ってるんですかねぇ. ELOG は、yaws の source を見て盗んだような記憶があります。 show は、何となく私が適当に作ったものです。 試しに、私のほうで branch を作って SASL を組み込んでみましょうか? 2008/8/21 Takeru INOUE <tak...@gm...>: > とても参考になります. > > みんな,show のような関数を定義して使ってるんですかねぇ. > ちょっと試してみます (今日からしばらくオフラインなので,来週にでも). > > 2008/8/21 masahito ikuta <coo...@gm...>: >> 確かに、rb を使う事は必須です。 >> http://d.hatena.ne.jp/cooldaemon/20070918/1190085199 >> >> 私が以前作った key/value store の例ですが・・・ >> http://labs.miu.vc/svn/cooldaemon/erl/yamd/trunk/include/yamd.hrl >> ↑こんなのを定義しておいて・・・ >> エラー発生時に >> ELOG("gen_tcp:listen/2 returned error\n~p\n", [Reason]). >> みたいな感じで使います。 >> >> 出力は、コマンドラインから >> $ ./scripts/yamd show error >> と入力すると出るようにしているのですが >> それは、↓ここの show 関数で定義しています。 >> http://labs.miu.vc/svn/cooldaemon/erl/yamd/trunk/src/yamd_ctl.erl >> >> 去年の事で、記憶が曖昧なのですが >> たしか、絞り込みは type でしかできなかったような? >> >> 2008/8/20 Takeru INOUE <tak...@gm...>: >>> では,SASL の方向にしましょう. >>> >>> …と言いたいのですが,SASL の上手い使い方がわかってません. >>> 『プログラミング Erlang』を読んだときに,rb を使わないとログを解析できないように思えて,独自の kai_log >>> モジュールを使うようにしたという経緯があります. >>> やはり,Perl などを使ってログ解析できないのはつらいので. >>> 上手い手はあるのでしょうか? >>> >>> 2008/8/20 masahito ikuta <coo...@gm...>: >>>> kai 全体で SASL を使いつつ >>>> 該当箇所で、exit({error, Reason}) で落とすというのは、どうでしょうか? >>>> >>>> 2008/8/20 Takeru INOUE <tak...@gm...>: >>>>> 高負荷時に,file descriptor が不足して,kai_tcp_server の gen_tcp:accept がエラーを返すことがありました. >>>>> 現在の実装では,gen_tcp:accept の戻り値として {ok, Socket} しか受け取らないようになっていますが,{error, >>>>> Reason} も捕獲するようにしておこうと思います. >>>>> また,ログにも出力しようかと考えています. >>>>> >>>>> 理由は次の通りです. >>>>> Erlang の流儀に従うのであれば,エラーを捕獲せずに,supervisor などに後処理を任せるのかもしれません. >>>>> ところが,今回の場合,手がかりなしで異常終了してしまったので (下記参照),原因を突き止めるのに苦労しました. >>>>> >>>>> =INFO REPORT==== 17-Aug-2008::19:44:30 === >>>>> application: kai >>>>> exited: shutdown >>>>> type: temporary >>>>> >>>>> # いまだに Erlang のエラーメッセージの法則がよく分からない… >>>>> >>>>> というわけで,エラーを捕獲してログに残そうと思うのですが,どんなもんでしょうか? >>>>> まだ trunk/ には反映させていません. >>>>> この修正は,↓ で見ることができます. >>>>> >>>>> svn diff -r 73:74 http://kai.svn.sourceforge.net/svnroot/kai >>>>> >>>>> なお,ログを残すためには,tcp_server が kai_log に依存することになります. >>>>> 最終的には,kai に依存しない独立したモジュールにするのがよいと思いますが,とりあえず開発のしやすさを優先してログを出力できればと思ってます >>>>> (SASL とかを使うべき何だろうか?). >> >> -- >> cooldaemon >> > > > > -- > Takeru INOUE <tak...@gm...> > -- cooldaemon |
From: Takeru I. <tak...@gm...> - 2008-08-21 04:14:21
|
とても参考になります. みんな,show のような関数を定義して使ってるんですかねぇ. ちょっと試してみます (今日からしばらくオフラインなので,来週にでも). 2008/8/21 masahito ikuta <coo...@gm...>: > 確かに、rb を使う事は必須です。 > http://d.hatena.ne.jp/cooldaemon/20070918/1190085199 > > 私が以前作った key/value store の例ですが・・・ > http://labs.miu.vc/svn/cooldaemon/erl/yamd/trunk/include/yamd.hrl > ↑こんなのを定義しておいて・・・ > エラー発生時に > ELOG("gen_tcp:listen/2 returned error\n~p\n", [Reason]). > みたいな感じで使います。 > > 出力は、コマンドラインから > $ ./scripts/yamd show error > と入力すると出るようにしているのですが > それは、↓ここの show 関数で定義しています。 > http://labs.miu.vc/svn/cooldaemon/erl/yamd/trunk/src/yamd_ctl.erl > > 去年の事で、記憶が曖昧なのですが > たしか、絞り込みは type でしかできなかったような? > > 2008/8/20 Takeru INOUE <tak...@gm...>: >> では,SASL の方向にしましょう. >> >> …と言いたいのですが,SASL の上手い使い方がわかってません. >> 『プログラミング Erlang』を読んだときに,rb を使わないとログを解析できないように思えて,独自の kai_log >> モジュールを使うようにしたという経緯があります. >> やはり,Perl などを使ってログ解析できないのはつらいので. >> 上手い手はあるのでしょうか? >> >> 2008/8/20 masahito ikuta <coo...@gm...>: >>> kai 全体で SASL を使いつつ >>> 該当箇所で、exit({error, Reason}) で落とすというのは、どうでしょうか? >>> >>> 2008/8/20 Takeru INOUE <tak...@gm...>: >>>> 高負荷時に,file descriptor が不足して,kai_tcp_server の gen_tcp:accept がエラーを返すことがありました. >>>> 現在の実装では,gen_tcp:accept の戻り値として {ok, Socket} しか受け取らないようになっていますが,{error, >>>> Reason} も捕獲するようにしておこうと思います. >>>> また,ログにも出力しようかと考えています. >>>> >>>> 理由は次の通りです. >>>> Erlang の流儀に従うのであれば,エラーを捕獲せずに,supervisor などに後処理を任せるのかもしれません. >>>> ところが,今回の場合,手がかりなしで異常終了してしまったので (下記参照),原因を突き止めるのに苦労しました. >>>> >>>> =INFO REPORT==== 17-Aug-2008::19:44:30 === >>>> application: kai >>>> exited: shutdown >>>> type: temporary >>>> >>>> # いまだに Erlang のエラーメッセージの法則がよく分からない… >>>> >>>> というわけで,エラーを捕獲してログに残そうと思うのですが,どんなもんでしょうか? >>>> まだ trunk/ には反映させていません. >>>> この修正は,↓ で見ることができます. >>>> >>>> svn diff -r 73:74 http://kai.svn.sourceforge.net/svnroot/kai >>>> >>>> なお,ログを残すためには,tcp_server が kai_log に依存することになります. >>>> 最終的には,kai に依存しない独立したモジュールにするのがよいと思いますが,とりあえず開発のしやすさを優先してログを出力できればと思ってます >>>> (SASL とかを使うべき何だろうか?). > > -- > cooldaemon > -- Takeru INOUE <tak...@gm...> |
From: masahito i. <coo...@gm...> - 2008-08-20 22:03:00
|
確かに、rb を使う事は必須です。 http://d.hatena.ne.jp/cooldaemon/20070918/1190085199 私が以前作った key/value store の例ですが・・・ http://labs.miu.vc/svn/cooldaemon/erl/yamd/trunk/include/yamd.hrl ↑こんなのを定義しておいて・・・ エラー発生時に ELOG("gen_tcp:listen/2 returned error\n~p\n", [Reason]). みたいな感じで使います。 出力は、コマンドラインから $ ./scripts/yamd show error と入力すると出るようにしているのですが それは、↓ここの show 関数で定義しています。 http://labs.miu.vc/svn/cooldaemon/erl/yamd/trunk/src/yamd_ctl.erl 去年の事で、記憶が曖昧なのですが たしか、絞り込みは type でしかできなかったような? 2008/8/20 Takeru INOUE <tak...@gm...>: > では,SASL の方向にしましょう. > > …と言いたいのですが,SASL の上手い使い方がわかってません. > 『プログラミング Erlang』を読んだときに,rb を使わないとログを解析できないように思えて,独自の kai_log > モジュールを使うようにしたという経緯があります. > やはり,Perl などを使ってログ解析できないのはつらいので. > 上手い手はあるのでしょうか? > > 2008/8/20 masahito ikuta <coo...@gm...>: >> kai 全体で SASL を使いつつ >> 該当箇所で、exit({error, Reason}) で落とすというのは、どうでしょうか? >> >> 2008/8/20 Takeru INOUE <tak...@gm...>: >>> 高負荷時に,file descriptor が不足して,kai_tcp_server の gen_tcp:accept がエラーを返すことがありました. >>> 現在の実装では,gen_tcp:accept の戻り値として {ok, Socket} しか受け取らないようになっていますが,{error, >>> Reason} も捕獲するようにしておこうと思います. >>> また,ログにも出力しようかと考えています. >>> >>> 理由は次の通りです. >>> Erlang の流儀に従うのであれば,エラーを捕獲せずに,supervisor などに後処理を任せるのかもしれません. >>> ところが,今回の場合,手がかりなしで異常終了してしまったので (下記参照),原因を突き止めるのに苦労しました. >>> >>> =INFO REPORT==== 17-Aug-2008::19:44:30 === >>> application: kai >>> exited: shutdown >>> type: temporary >>> >>> # いまだに Erlang のエラーメッセージの法則がよく分からない… >>> >>> というわけで,エラーを捕獲してログに残そうと思うのですが,どんなもんでしょうか? >>> まだ trunk/ には反映させていません. >>> この修正は,↓ で見ることができます. >>> >>> svn diff -r 73:74 http://kai.svn.sourceforge.net/svnroot/kai >>> >>> なお,ログを残すためには,tcp_server が kai_log に依存することになります. >>> 最終的には,kai に依存しない独立したモジュールにするのがよいと思いますが,とりあえず開発のしやすさを優先してログを出力できればと思ってます >>> (SASL とかを使うべき何だろうか?). -- cooldaemon |
From: Takeru I. <tak...@gm...> - 2008-08-20 11:32:18
|
では,SASL の方向にしましょう. …と言いたいのですが,SASL の上手い使い方がわかってません. 『プログラミング Erlang』を読んだときに,rb を使わないとログを解析できないように思えて,独自の kai_log モジュールを使うようにしたという経緯があります. やはり,Perl などを使ってログ解析できないのはつらいので. 上手い手はあるのでしょうか? 2008/8/20 masahito ikuta <coo...@gm...>: > kai 全体で SASL を使いつつ > 該当箇所で、exit({error, Reason}) で落とすというのは、どうでしょうか? > > 2008/8/20 Takeru INOUE <tak...@gm...>: >> 高負荷時に,file descriptor が不足して,kai_tcp_server の gen_tcp:accept がエラーを返すことがありました. >> 現在の実装では,gen_tcp:accept の戻り値として {ok, Socket} しか受け取らないようになっていますが,{error, >> Reason} も捕獲するようにしておこうと思います. >> また,ログにも出力しようかと考えています. >> >> 理由は次の通りです. >> Erlang の流儀に従うのであれば,エラーを捕獲せずに,supervisor などに後処理を任せるのかもしれません. >> ところが,今回の場合,手がかりなしで異常終了してしまったので (下記参照),原因を突き止めるのに苦労しました. >> >> =INFO REPORT==== 17-Aug-2008::19:44:30 === >> application: kai >> exited: shutdown >> type: temporary >> >> # いまだに Erlang のエラーメッセージの法則がよく分からない… >> >> というわけで,エラーを捕獲してログに残そうと思うのですが,どんなもんでしょうか? >> まだ trunk/ には反映させていません. >> この修正は,↓ で見ることができます. >> >> svn diff -r 73:74 http://kai.svn.sourceforge.net/svnroot/kai >> >> なお,ログを残すためには,tcp_server が kai_log に依存することになります. >> 最終的には,kai に依存しない独立したモジュールにするのがよいと思いますが,とりあえず開発のしやすさを優先してログを出力できればと思ってます >> (SASL とかを使うべき何だろうか?). >> >> >> 2008/7/10 masahito ikuta <coo...@gm...>: >>>> これを待って,タブ文字の修正などを行いますね. >>> >>> タブの修正も、他の諸々の修正も >>> trunk 側で、バシバシ行なって頂いてかまいませんよ? >>> >>> cooldaemon_embed_tcp_server branch で >>> make test 時の normal exit 対応や >>> active true 対応等の kai_tcp_server 修正を >>> 引き続き行う事にしようと思いますが・・・ >>> >>> trunk に更新があった場合は >>> こまめに branch に merge するので >>> 気にしないで下さい。 >>> >>>> tcp 以外のメッセージも受け取れるというのは,嬉しい人が多そうですね. >>> >>> まずは、他のメッセージも受け取れるように修正してしまいますね。 >>> >>>> こういうのは erlang ML でプロに聞いてしまうのが早そうです. >>> >>> いつ、誰が、投稿しましょうか? >>> あと、kai 本体のアナウンスが先でも良いかもしれないなーとも思ってます。 >>> >>>> あぁ,ドキュメントが遅れている.. >>> >>> できる所からコツコツと(汗 >>> って事で、kai_tcp_server あたりから書いてみます。 >>> 英語 SKILL は娘以下なので、添削お願いしまーす(w; >>> >>> ところで、EDOC に対応が終わったあたりで >>> CEAN とか Erlware に対応する事も >>> 検討しませんか? >>> >>> 2008/7/9 Takeru INOUE <tak...@gm...>: >>>>> merge しました。 >>>> >>>> お疲れ様でした. >>>> kai の改良だけでなく,tcp_server まで出来上がって大仕事だったと思います. >>>> >>>>> make test 時、一つの SUITE が終了する際に >>>>> kai_tcp_server_acceptor_N を normal で終了していない為 >>>>> エラーメッセージが出ています。 >>>>> >>>>> 後日修正します。 >>>> >>>> これを待って,タブ文字の修正などを行いますね. >>>> >>>>>> kai_tcp_server を kai でしか使わないのはもったいないですねぇ. >>>>>> erlang ML に投げてみてもいいかも? >>>>> >>>>> erlang ML で紹介する事には賛成なのですが >>>>> 心残りが三つ、それから、提案が一つあります。 >>>>> >>>>> >>>>> ▼心残り >>>>> 以下、個人的な重要度順です。 >>>>> >>>>> 1.テスト項目を増やす必要がある >>>>> 早々に、対応せねば。 >>>>> >>>>> 2.オプションの active true 対応に見直しが必要かも? >>>>> active を true にするメリットは >>>>> receive でメッセージ待ちをする為 >>>>> tcp 以外のメッセージも受信可能となる点です。 >>>>> ※勉強不足で勘違いかもしれませんが >>>>> >>>>> 現在、tcp 以外のメッセージを受け取ると exit してしまうので >>>>> Mod:handle_info を評価するように修正しようかと考えておりますが >>>>> 如何なものでしょうか? >>>>> >>>>> ('EXIT' メッセージを受け取った際の処理も必要かも・・・ >>>>> んー、gen 関連モジュールの source を参考にしつつ >>>>> erlang ML で意見をもらいつつ修正ってのが望ましいです) >>>> >>>> tcp 以外のメッセージも受け取れるというのは,嬉しい人が多そうですね. >>>> こういうのは erlang ML でプロに聞いてしまうのが早そうです. >>>> >>>>> 3.EDOC に対応する必要がある >>>>> kai 全体に関わるのですが、edoc を採用しませんか? >>>> >>>> そうしましょう. >>>> あぁ,ドキュメントが遅れている.. >>>> >>>>> ▼提案 >>>>> kai_tcp_server を、tcp_server に改名しませんか?(もしくは、ptcp_server) >>>>> 何となくですが、その方が他のプロジェクトでも使いやすいかと思います。 >>>> >>>> 僕も tcp_server がいいと思います. >>>> p を付けるかどうかは微妙ですが,これも erlang ML に聞くのがいいのかなぁ. >>>> >>>>> ちなみに、kai というプレフィクスが消えた後も >>>>> kai のリポジトリで管理続投が良いと思います。 >>>>> >>>>> ※ smerl も、元々は、単独のリポジトリで管理されていましたが >>>>> 現在は、erlyweb のリポジトリで管理されています。(他に使っているプロジェクトが無いからという噂もw;) >>>> >>>> なるほど. >>>> 他のプロジェクトの参考になる部分は積極的にマネしていきましょう. >>>> >>>> >>>>> 2008/7/9 Takeru INOUE <tak...@gm...>: >>>>>> 今日はエラーが出ませんでした.. >>>>>> なんだったのかなぁ.. >>>>>> >>>>>> 接続数が制限されるのを確認しました. >>>>>> merge していいと思います. >>>>>> >>>>>> コードも一通り見せていただきましたが,とっても erlang らしくて感動しました. >>>>>> 近いうちに,すべてのコードのタブ文字を修正しますが,コードの書き方も cooldaemon さんっぽく直しておきます. >>>>>> >>>>>> kai_tcp_server を kai でしか使わないのはもったいないですねぇ. >>>>>> erlang ML に投げてみてもいいかも? >>>>>> >>>>>> >>>>>> 2008/7/8 masahito ikuta <coo...@gm...>: >>>>>>> MacOSX 10.5.4、MacOSX 10.4.11、FreeBSD 6.3 + R12B-3 で確認しましたが >>>>>>> 特に動作に問題は無いように思われます。 >>>>>>> ※FreeBSD を使う場合は、Makefike 内の make を gmake に修正する必要あり >>>>>>> >>>>>>> ちなみに、下記メッセージは、エラーではないですよね? >>>>>>>>>>> 2008-07-06 22:33:35.298615 [info] ./kai_hash.erl:162: {update, >>>>>>>>>>> [{{{192,168,1,225}, >>>>>>>>>>> 11011}, >>>>>>>>>>> >>>>>>>>>>> [{number_of_virtual_nodes, >>>>>>>>>>> 128}]}], >>>>>>>>>>> []} >>>>>>>>>>> >>>>>>> >>>>>>>> src/kai.app.src と kai.config ですが, >>>>>>>> >>>>>>>> - src/kai.app.src はデフォルト値 >>>>>>>> - kai.config はユーザ用設定ファイル >>>>>>>> >>>>>>>> というつもりでいました. >>>>>>>> erlang の一般的な使い方的にあってます? >>>>>>> >>>>>>> あってると思います。 >>>>>>> >>>>>>> ただ、今回のように、設定項目を追加した場合 >>>>>>> 二カ所へ追加するよりは、一カ所へ追加して終わりとした方が >>>>>>> 修正漏れが減るのではないかと思います。 >>>>>>> (テストも用意した方が良いでしょうねー) >>>>>>> >>>>>>> 2008/7/8 Takeru INOUE <tak...@gm...>: >>>>>>>> application:start(kai). したときに同じエラーが出るなぁ. >>>>>>>> こっちの環境がおかしいのかも. >>>>>>>> また明日みてみます. >>>>>>>> >>>>>>>>> > あと,src/kai.app.src と kai.config で値を変えているのには意図があります? >>>>>>>>> kai.app の更新をすっかり忘れてました。 >>>>>>>>> んー・・・make をうまく使って、設定を一カ所に >>>>>>>>> まとめられないものでしょうか? >>>>>>>> >>>>>>>> src/kai.app.src と kai.config ですが, >>>>>>>> >>>>>>>> - src/kai.app.src はデフォルト値 >>>>>>>> - kai.config はユーザ用設定ファイル >>>>>>>> >>>>>>>> というつもりでいました. >>>>>>>> erlang の一般的な使い方的にあってます? >>>>>>>> >>>>>>>> あと,kai.config の値はなんでもいいわけなのですが,デフォルト値と同じになっているのが分かりやすいかなと思い,そのようにしてありました. >>>>>>>> >>>>>>>> >>>>>>>> 2008/7/7 masahito ikuta <coo...@gm...>: >>>>>>>>> ご指摘頂いて箇所のみ修正した版を 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 >>>>>>>>> >>>>>>>> >>>>>>>> >>>>>>>> >>>>>>>> -- >>>>>>>> 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-08-20 09:35:07
|
kai 全体で SASL を使いつつ 該当箇所で、exit({error, Reason}) で落とすというのは、どうでしょうか? 2008/8/20 Takeru INOUE <tak...@gm...>: > 高負荷時に,file descriptor が不足して,kai_tcp_server の gen_tcp:accept がエラーを返すことがありました. > 現在の実装では,gen_tcp:accept の戻り値として {ok, Socket} しか受け取らないようになっていますが,{error, > Reason} も捕獲するようにしておこうと思います. > また,ログにも出力しようかと考えています. > > 理由は次の通りです. > Erlang の流儀に従うのであれば,エラーを捕獲せずに,supervisor などに後処理を任せるのかもしれません. > ところが,今回の場合,手がかりなしで異常終了してしまったので (下記参照),原因を突き止めるのに苦労しました. > > =INFO REPORT==== 17-Aug-2008::19:44:30 === > application: kai > exited: shutdown > type: temporary > > # いまだに Erlang のエラーメッセージの法則がよく分からない… > > というわけで,エラーを捕獲してログに残そうと思うのですが,どんなもんでしょうか? > まだ trunk/ には反映させていません. > この修正は,↓ で見ることができます. > > svn diff -r 73:74 http://kai.svn.sourceforge.net/svnroot/kai > > なお,ログを残すためには,tcp_server が kai_log に依存することになります. > 最終的には,kai に依存しない独立したモジュールにするのがよいと思いますが,とりあえず開発のしやすさを優先してログを出力できればと思ってます > (SASL とかを使うべき何だろうか?). > > > 2008/7/10 masahito ikuta <coo...@gm...>: >>> これを待って,タブ文字の修正などを行いますね. >> >> タブの修正も、他の諸々の修正も >> trunk 側で、バシバシ行なって頂いてかまいませんよ? >> >> cooldaemon_embed_tcp_server branch で >> make test 時の normal exit 対応や >> active true 対応等の kai_tcp_server 修正を >> 引き続き行う事にしようと思いますが・・・ >> >> trunk に更新があった場合は >> こまめに branch に merge するので >> 気にしないで下さい。 >> >>> tcp 以外のメッセージも受け取れるというのは,嬉しい人が多そうですね. >> >> まずは、他のメッセージも受け取れるように修正してしまいますね。 >> >>> こういうのは erlang ML でプロに聞いてしまうのが早そうです. >> >> いつ、誰が、投稿しましょうか? >> あと、kai 本体のアナウンスが先でも良いかもしれないなーとも思ってます。 >> >>> あぁ,ドキュメントが遅れている.. >> >> できる所からコツコツと(汗 >> って事で、kai_tcp_server あたりから書いてみます。 >> 英語 SKILL は娘以下なので、添削お願いしまーす(w; >> >> ところで、EDOC に対応が終わったあたりで >> CEAN とか Erlware に対応する事も >> 検討しませんか? >> >> 2008/7/9 Takeru INOUE <tak...@gm...>: >>>> merge しました。 >>> >>> お疲れ様でした. >>> kai の改良だけでなく,tcp_server まで出来上がって大仕事だったと思います. >>> >>>> make test 時、一つの SUITE が終了する際に >>>> kai_tcp_server_acceptor_N を normal で終了していない為 >>>> エラーメッセージが出ています。 >>>> >>>> 後日修正します。 >>> >>> これを待って,タブ文字の修正などを行いますね. >>> >>>>> kai_tcp_server を kai でしか使わないのはもったいないですねぇ. >>>>> erlang ML に投げてみてもいいかも? >>>> >>>> erlang ML で紹介する事には賛成なのですが >>>> 心残りが三つ、それから、提案が一つあります。 >>>> >>>> >>>> ▼心残り >>>> 以下、個人的な重要度順です。 >>>> >>>> 1.テスト項目を増やす必要がある >>>> 早々に、対応せねば。 >>>> >>>> 2.オプションの active true 対応に見直しが必要かも? >>>> active を true にするメリットは >>>> receive でメッセージ待ちをする為 >>>> tcp 以外のメッセージも受信可能となる点です。 >>>> ※勉強不足で勘違いかもしれませんが >>>> >>>> 現在、tcp 以外のメッセージを受け取ると exit してしまうので >>>> Mod:handle_info を評価するように修正しようかと考えておりますが >>>> 如何なものでしょうか? >>>> >>>> ('EXIT' メッセージを受け取った際の処理も必要かも・・・ >>>> んー、gen 関連モジュールの source を参考にしつつ >>>> erlang ML で意見をもらいつつ修正ってのが望ましいです) >>> >>> tcp 以外のメッセージも受け取れるというのは,嬉しい人が多そうですね. >>> こういうのは erlang ML でプロに聞いてしまうのが早そうです. >>> >>>> 3.EDOC に対応する必要がある >>>> kai 全体に関わるのですが、edoc を採用しませんか? >>> >>> そうしましょう. >>> あぁ,ドキュメントが遅れている.. >>> >>>> ▼提案 >>>> kai_tcp_server を、tcp_server に改名しませんか?(もしくは、ptcp_server) >>>> 何となくですが、その方が他のプロジェクトでも使いやすいかと思います。 >>> >>> 僕も tcp_server がいいと思います. >>> p を付けるかどうかは微妙ですが,これも erlang ML に聞くのがいいのかなぁ. >>> >>>> ちなみに、kai というプレフィクスが消えた後も >>>> kai のリポジトリで管理続投が良いと思います。 >>>> >>>> ※ smerl も、元々は、単独のリポジトリで管理されていましたが >>>> 現在は、erlyweb のリポジトリで管理されています。(他に使っているプロジェクトが無いからという噂もw;) >>> >>> なるほど. >>> 他のプロジェクトの参考になる部分は積極的にマネしていきましょう. >>> >>> >>>> 2008/7/9 Takeru INOUE <tak...@gm...>: >>>>> 今日はエラーが出ませんでした.. >>>>> なんだったのかなぁ.. >>>>> >>>>> 接続数が制限されるのを確認しました. >>>>> merge していいと思います. >>>>> >>>>> コードも一通り見せていただきましたが,とっても erlang らしくて感動しました. >>>>> 近いうちに,すべてのコードのタブ文字を修正しますが,コードの書き方も cooldaemon さんっぽく直しておきます. >>>>> >>>>> kai_tcp_server を kai でしか使わないのはもったいないですねぇ. >>>>> erlang ML に投げてみてもいいかも? >>>>> >>>>> >>>>> 2008/7/8 masahito ikuta <coo...@gm...>: >>>>>> MacOSX 10.5.4、MacOSX 10.4.11、FreeBSD 6.3 + R12B-3 で確認しましたが >>>>>> 特に動作に問題は無いように思われます。 >>>>>> ※FreeBSD を使う場合は、Makefike 内の make を gmake に修正する必要あり >>>>>> >>>>>> ちなみに、下記メッセージは、エラーではないですよね? >>>>>>>>>> 2008-07-06 22:33:35.298615 [info] ./kai_hash.erl:162: {update, >>>>>>>>>> [{{{192,168,1,225}, >>>>>>>>>> 11011}, >>>>>>>>>> >>>>>>>>>> [{number_of_virtual_nodes, >>>>>>>>>> 128}]}], >>>>>>>>>> []} >>>>>>>>>> >>>>>> >>>>>>> src/kai.app.src と kai.config ですが, >>>>>>> >>>>>>> - src/kai.app.src はデフォルト値 >>>>>>> - kai.config はユーザ用設定ファイル >>>>>>> >>>>>>> というつもりでいました. >>>>>>> erlang の一般的な使い方的にあってます? >>>>>> >>>>>> あってると思います。 >>>>>> >>>>>> ただ、今回のように、設定項目を追加した場合 >>>>>> 二カ所へ追加するよりは、一カ所へ追加して終わりとした方が >>>>>> 修正漏れが減るのではないかと思います。 >>>>>> (テストも用意した方が良いでしょうねー) >>>>>> >>>>>> 2008/7/8 Takeru INOUE <tak...@gm...>: >>>>>>> application:start(kai). したときに同じエラーが出るなぁ. >>>>>>> こっちの環境がおかしいのかも. >>>>>>> また明日みてみます. >>>>>>> >>>>>>>> > あと,src/kai.app.src と kai.config で値を変えているのには意図があります? >>>>>>>> kai.app の更新をすっかり忘れてました。 >>>>>>>> んー・・・make をうまく使って、設定を一カ所に >>>>>>>> まとめられないものでしょうか? >>>>>>> >>>>>>> src/kai.app.src と kai.config ですが, >>>>>>> >>>>>>> - src/kai.app.src はデフォルト値 >>>>>>> - kai.config はユーザ用設定ファイル >>>>>>> >>>>>>> というつもりでいました. >>>>>>> erlang の一般的な使い方的にあってます? >>>>>>> >>>>>>> あと,kai.config の値はなんでもいいわけなのですが,デフォルト値と同じになっているのが分かりやすいかなと思い,そのようにしてありました. >>>>>>> >>>>>>> >>>>>>> 2008/7/7 masahito ikuta <coo...@gm...>: >>>>>>>> ご指摘頂いて箇所のみ修正した版を 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 >>>>>>>> >>>>>>> >>>>>>> >>>>>>> >>>>>>> -- >>>>>>> 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-08-19 15:10:36
|
高負荷時に,file descriptor が不足して,kai_tcp_server の gen_tcp:accept がエラーを返すことがありました. 現在の実装では,gen_tcp:accept の戻り値として {ok, Socket} しか受け取らないようになっていますが,{error, Reason} も捕獲するようにしておこうと思います. また,ログにも出力しようかと考えています. 理由は次の通りです. Erlang の流儀に従うのであれば,エラーを捕獲せずに,supervisor などに後処理を任せるのかもしれません. ところが,今回の場合,手がかりなしで異常終了してしまったので (下記参照),原因を突き止めるのに苦労しました. =INFO REPORT==== 17-Aug-2008::19:44:30 === application: kai exited: shutdown type: temporary # いまだに Erlang のエラーメッセージの法則がよく分からない… というわけで,エラーを捕獲してログに残そうと思うのですが,どんなもんでしょうか? まだ trunk/ には反映させていません. この修正は,↓ で見ることができます. svn diff -r 73:74 http://kai.svn.sourceforge.net/svnroot/kai なお,ログを残すためには,tcp_server が kai_log に依存することになります. 最終的には,kai に依存しない独立したモジュールにするのがよいと思いますが,とりあえず開発のしやすさを優先してログを出力できればと思ってます (SASL とかを使うべき何だろうか?). 2008/7/10 masahito ikuta <coo...@gm...>: >> これを待って,タブ文字の修正などを行いますね. > > タブの修正も、他の諸々の修正も > trunk 側で、バシバシ行なって頂いてかまいませんよ? > > cooldaemon_embed_tcp_server branch で > make test 時の normal exit 対応や > active true 対応等の kai_tcp_server 修正を > 引き続き行う事にしようと思いますが・・・ > > trunk に更新があった場合は > こまめに branch に merge するので > 気にしないで下さい。 > >> tcp 以外のメッセージも受け取れるというのは,嬉しい人が多そうですね. > > まずは、他のメッセージも受け取れるように修正してしまいますね。 > >> こういうのは erlang ML でプロに聞いてしまうのが早そうです. > > いつ、誰が、投稿しましょうか? > あと、kai 本体のアナウンスが先でも良いかもしれないなーとも思ってます。 > >> あぁ,ドキュメントが遅れている.. > > できる所からコツコツと(汗 > って事で、kai_tcp_server あたりから書いてみます。 > 英語 SKILL は娘以下なので、添削お願いしまーす(w; > > ところで、EDOC に対応が終わったあたりで > CEAN とか Erlware に対応する事も > 検討しませんか? > > 2008/7/9 Takeru INOUE <tak...@gm...>: >>> merge しました。 >> >> お疲れ様でした. >> kai の改良だけでなく,tcp_server まで出来上がって大仕事だったと思います. >> >>> make test 時、一つの SUITE が終了する際に >>> kai_tcp_server_acceptor_N を normal で終了していない為 >>> エラーメッセージが出ています。 >>> >>> 後日修正します。 >> >> これを待って,タブ文字の修正などを行いますね. >> >>>> kai_tcp_server を kai でしか使わないのはもったいないですねぇ. >>>> erlang ML に投げてみてもいいかも? >>> >>> erlang ML で紹介する事には賛成なのですが >>> 心残りが三つ、それから、提案が一つあります。 >>> >>> >>> ▼心残り >>> 以下、個人的な重要度順です。 >>> >>> 1.テスト項目を増やす必要がある >>> 早々に、対応せねば。 >>> >>> 2.オプションの active true 対応に見直しが必要かも? >>> active を true にするメリットは >>> receive でメッセージ待ちをする為 >>> tcp 以外のメッセージも受信可能となる点です。 >>> ※勉強不足で勘違いかもしれませんが >>> >>> 現在、tcp 以外のメッセージを受け取ると exit してしまうので >>> Mod:handle_info を評価するように修正しようかと考えておりますが >>> 如何なものでしょうか? >>> >>> ('EXIT' メッセージを受け取った際の処理も必要かも・・・ >>> んー、gen 関連モジュールの source を参考にしつつ >>> erlang ML で意見をもらいつつ修正ってのが望ましいです) >> >> tcp 以外のメッセージも受け取れるというのは,嬉しい人が多そうですね. >> こういうのは erlang ML でプロに聞いてしまうのが早そうです. >> >>> 3.EDOC に対応する必要がある >>> kai 全体に関わるのですが、edoc を採用しませんか? >> >> そうしましょう. >> あぁ,ドキュメントが遅れている.. >> >>> ▼提案 >>> kai_tcp_server を、tcp_server に改名しませんか?(もしくは、ptcp_server) >>> 何となくですが、その方が他のプロジェクトでも使いやすいかと思います。 >> >> 僕も tcp_server がいいと思います. >> p を付けるかどうかは微妙ですが,これも erlang ML に聞くのがいいのかなぁ. >> >>> ちなみに、kai というプレフィクスが消えた後も >>> kai のリポジトリで管理続投が良いと思います。 >>> >>> ※ smerl も、元々は、単独のリポジトリで管理されていましたが >>> 現在は、erlyweb のリポジトリで管理されています。(他に使っているプロジェクトが無いからという噂もw;) >> >> なるほど. >> 他のプロジェクトの参考になる部分は積極的にマネしていきましょう. >> >> >>> 2008/7/9 Takeru INOUE <tak...@gm...>: >>>> 今日はエラーが出ませんでした.. >>>> なんだったのかなぁ.. >>>> >>>> 接続数が制限されるのを確認しました. >>>> merge していいと思います. >>>> >>>> コードも一通り見せていただきましたが,とっても erlang らしくて感動しました. >>>> 近いうちに,すべてのコードのタブ文字を修正しますが,コードの書き方も cooldaemon さんっぽく直しておきます. >>>> >>>> kai_tcp_server を kai でしか使わないのはもったいないですねぇ. >>>> erlang ML に投げてみてもいいかも? >>>> >>>> >>>> 2008/7/8 masahito ikuta <coo...@gm...>: >>>>> MacOSX 10.5.4、MacOSX 10.4.11、FreeBSD 6.3 + R12B-3 で確認しましたが >>>>> 特に動作に問題は無いように思われます。 >>>>> ※FreeBSD を使う場合は、Makefike 内の make を gmake に修正する必要あり >>>>> >>>>> ちなみに、下記メッセージは、エラーではないですよね? >>>>>>>>> 2008-07-06 22:33:35.298615 [info] ./kai_hash.erl:162: {update, >>>>>>>>> [{{{192,168,1,225}, >>>>>>>>> 11011}, >>>>>>>>> >>>>>>>>> [{number_of_virtual_nodes, >>>>>>>>> 128}]}], >>>>>>>>> []} >>>>>>>>> >>>>> >>>>>> src/kai.app.src と kai.config ですが, >>>>>> >>>>>> - src/kai.app.src はデフォルト値 >>>>>> - kai.config はユーザ用設定ファイル >>>>>> >>>>>> というつもりでいました. >>>>>> erlang の一般的な使い方的にあってます? >>>>> >>>>> あってると思います。 >>>>> >>>>> ただ、今回のように、設定項目を追加した場合 >>>>> 二カ所へ追加するよりは、一カ所へ追加して終わりとした方が >>>>> 修正漏れが減るのではないかと思います。 >>>>> (テストも用意した方が良いでしょうねー) >>>>> >>>>> 2008/7/8 Takeru INOUE <tak...@gm...>: >>>>>> application:start(kai). したときに同じエラーが出るなぁ. >>>>>> こっちの環境がおかしいのかも. >>>>>> また明日みてみます. >>>>>> >>>>>>> > あと,src/kai.app.src と kai.config で値を変えているのには意図があります? >>>>>>> kai.app の更新をすっかり忘れてました。 >>>>>>> んー・・・make をうまく使って、設定を一カ所に >>>>>>> まとめられないものでしょうか? >>>>>> >>>>>> src/kai.app.src と kai.config ですが, >>>>>> >>>>>> - src/kai.app.src はデフォルト値 >>>>>> - kai.config はユーザ用設定ファイル >>>>>> >>>>>> というつもりでいました. >>>>>> erlang の一般的な使い方的にあってます? >>>>>> >>>>>> あと,kai.config の値はなんでもいいわけなのですが,デフォルト値と同じになっているのが分かりやすいかなと思い,そのようにしてありました. >>>>>> >>>>>> >>>>>> 2008/7/7 masahito ikuta <coo...@gm...>: >>>>>>> ご指摘頂いて箇所のみ修正した版を 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 >>>>>>> >>>>>> >>>>>> >>>>>> >>>>>> -- >>>>>> Takeru INOUE <tak...@gm...> >>>>>> >>>>> >>>>> >>>>> >>>>> -- >>>>> cooldaemon >>>>> >>>> >>>> >>>> >>>> -- >>>> Takeru INOUE <tak...@gm...> >>>> >>> >>> >>> >>> -- >>> cooldaemon >>> >> >> >> >> -- >> Takeru INOUE <tak...@gm...> >> > > > > -- > cooldaemon > -- Takeru INOUE <tak...@gm...> |
From: Kota U. <kue...@gm...> - 2008-08-18 18:16:37
|
-- ~^~^~^~^~^~^~^~^~^~^~^~^~ Kota Uenishi kue...@gm... |
From: Takeru I. <tak...@gm...> - 2008-08-18 13:50:10
|
# 元メールは "kai_api を kai_api_recv と kai_api_send に分割" ですが,タイトルを変えました. 先日,高負荷時のエラーを回避するために接続プールを実装しました. 接続プールは,connect したソケットを閉じずに保存しておき,使い回すというものです. 中途半端な実装になっていたのですが,そのまま放置するのもよくないので,使えるレベルに実装し直しました. コードは branches/takemaru_connection_pooling/ にあります. 問題なさそうなら trunk/ にマージしようと思います. 先日の実装では,kai_api を kai_api_recv と kai_api_send に分割していました. しかし,kai_api はノードをクラスタに接続するときに使われるモジュール名であり,あまり変更しないほうがいいかなと思いました. そこで,kai_api は元に戻して,接続プールのみを kai_connection として実装し直しました. また,以前の実装では,対象ノードへのソケットが空いていなければ接続が無尽蔵に増えてしまうという問題がありました. 今回の実装では,接続数が一定数を超えると,使われていないソケットを閉じるようにしています (いわゆる LRU です). 接続数の上限値は max_connections というパラメータで設定できます. …勘のいい方は気づいたと思いますが,max_connections というパラメータは,kai_api の待ち受けプロセス数として使っていました. 新たなパラメータ名を導入しようかとも思ったのですが,正確な意味に合わせて刷新することにしました. # cooldaemon さんが kai_tcp_server を実装したときに気づけばよかったのですが…. 設定パラメータ名は以下のように変更されています. s/port/api_port/ s/max_connections/api_max_processes/ s/memcache_max_connections/memcache_max_processes/ api_max_processes は,gen_tcp:accept によって接続したソケットを処理するプロセス数になります. 一方で,max_connections は,gen_tcp:connect によって接続したソケット数という意味になります. 今回のコミットによって,ほとんどすべてのモジュールが修正されています. kai_tcp_server も修正されています. kai_version は修正されてないかな? マージしちゃっても大丈夫そうでしょうか? 2008/8/9 Takeru INOUE <tak...@gm...>: > 性能測定のメールに書いたように,branches/takemaru_connection_pooling では connection > pooling を実装してあります. > これは,一度 connect したソケットを閉じずに保存しておき,使い回すというものです. > > これに伴い,kai_api モジュールを kai_api_recv と kai_api_send に分割しました. > kai_api_recv は,kai_tcp_server を実装しており,RPC の待ち受けを行っています. > kai_api_send は RPC の送信を行います. > kai_api_send は connection pooling も実装しています (gen_server を使っています). > > モジュール名を変更したので,かなり広範な修正となっています. > trunk/ への merge はしばらく待ったほうがいいですかねぇ. > -- Takeru INOUE <tak...@gm...> |
From: Takeru I. <tak...@gm...> - 2008-08-11 15:43:39
|
ちょっと口うるさく聞こえるかもしれないけど,大事なところだと思うので,正確に表現することを優先して厳密に書きます. 一般論として,checksum と呼ばれるものの衝突確率は,ユースケースに関わらず非常に低くなければいけないと思います. というのは,checksum は信頼性の高いメカニズムだと考えられているためです. たとえば,Kai を使ったシステムに問題が発生したとして,checksum の衝突が原因だとすると,debug にすごく苦労しそうです. 理解しやすくするために,2 つのユースケースを挙げてみます. Web Application を想定した場合,checksum の衝突が起こる可能性はほとんどないでしょう. 通常の Web Application では,ひとつの HTTP リクエストの間に get と cas を行います. つまり,get してから cas するまでの時間が非常に短く,その間に他プロセスが書き込む可能性も低くなるので,checksum が衝突する可能性も低くなります. しかし,Kai のユースケースは Web Application だけではないと思います. たとえば,大量のデータをバッチ処理するときに,Kai を一時的なストレージとして使うことが考えられます. この場合,アプリケーションがかなり長い時間にわたって状態を保持することがあります. アプリケーション開発者は,get してから cas するまでの時間が長くなるような実装をするかもしれません. たとえば,cas でエラーが起こったときのみ get し直す,というようにプログラムするということです. こうなると,checksum の衝突確率は無視できないくらいに高くなるかもしれません. 極端な場合にはほとんどの cas で衝突チェックが重要になり,前のメールで書いたように数十秒で実際に衝突してしまうでしょう. ちなみに,キーの数が多かったとしても,各キーの状態を保持するアプリケーションが同時に複数存在しうる構成になっていれば,衝突が発生する可能性はさほど下がらないと思います (キーの数と衝突確率には直接的な関係はないということ). 個人的には,Kai のように汎用性の高いソフトウェアでは,ユースケースを限定してしまうのは難しいと考えています. また,開発者に対して "cas の前に get しておけ" ということを徹底するのは現実的ではないでしょう. checksum が 48 bit あれば 281兆分の1 になるので,このくらいあればユースケースに関わらず安全と考えられそうです. 逆にいうと,それより短い checksum は危険だと思っています. >> 確かに,cas を使い続ける限り,並行バージョンがいつまでも残り続けることになりますね. >> これは困った. >> 複数バージョンが返ってくる場合は緊急事態ということで,クライアントは set で上書きしちゃえばいいのかなと思ってたりもします >> (アプリケーションにもよるけど). > > そこまで割り切りますか :-< "set で上書き" はよくないですね. このルールを浸透させるのは非現実的ですね. このような前提を踏まえた上で,concurrent version が存在するときに限って (この確率はユースケースに関わらず高くない),checksum を短くする (というか組み合わせる) ことはしても問題ないかなと思います. この場合,エンコードする checksum の数は動的に変わるので,この数を表すために何 bit かを使わなければなりません. というわけで,前のメールで書いた「先頭 4 bit で checksum の数を表し,残りのビットを等分して checksum の長さを決める」という妥協策になります. cas の問題はさておき,VectorClocks についてはここまでのメールでよく議論できてると思うので,実装してしまっていいと思います. cas はその後で考えてもいいんじゃないかなぁ. 2008/8/11 shunichi shinohara <shi...@gm...>: > 2008/8/9 Takeru INOUE <tak...@gm...>: >> 議論の前提は, >> >> - memcache API には準拠したままにしておく >> - cas で使われる checksum field (64 bit) の使い方を検討する >> >> というところだと思います. > > memcache プロトコルは簡単でクライアント実装も多いので、そこを > 確保するのは同意します。 > >> 確かに,cas を使い続ける限り,並行バージョンがいつまでも残り続けることになりますね. >> これは困った. >> 複数バージョンが返ってくる場合は緊急事態ということで,クライアントは set で上書きしちゃえばいいのかなと思ってたりもします >> (アプリケーションにもよるけど). > > そこまで割り切りますか :-< > >> さて,先のメールに,checksum を 16 bit にするという提案があります. >> Kai は 10,000 qps を超えるリクエストを捌く可能性があります. >> このうち,10% が cas だとします. >> すると,数十秒に一回,checksum が "偶然にも" 一致してしまいます. >> checksum として機能させるには,32 bit でも厳しいかも. > > これは、空間をチェックサムだけで考えているので、今の場合の衝突としては > 過大評価のようにおもいます。 > いまは、全体での衝突ではなくて、同一のキーにたいしての更新の衝突が問題です。 > # Merkle tree の衝突は全体で衝突しないかどうかが重要かもしれない > > キーの種類が、 > 10^4 ~ 10^5 (=1万~10万)だとすると、ほとんど衝突は > 問題ないようにおもいます。 > # 実際はもっとおおい? まぁ"ホット"なデータということではこんなもんかも > おおざっぱに、キーあたりでは 0.1 - 0.01 cas operations / sec > >> 個人的には,ここは手を抜いちゃってもいいのかなという気がしています. > > というわけで(?) 4つにわるのもなんなので、3つに割ると、21 bit つかえるので、 > ひとまずこのへんでどうでしょうか? > > たとえば、gets で 3種類の concurrent なデータ D1, D2, D3 があったばあいは、 > それぞれの21bit checksum をつなげた値 C を、それぞれのデータ送信時の > cas unique として送信する。 > クライアントは、どのデータについている cas unique もおなじ値なので > どれでもいいから、 cas コマンドの unique として使う。 > # クライアントは cas unique に対して、操作は必要ないようにしたい > > -- > shino > -- Takeru INOUE <tak...@gm...> |
From: shunichi s. <shi...@gm...> - 2008-08-11 13:48:29
|
2008/8/9 Takeru INOUE <tak...@gm...>: > 議論の前提は, > > - memcache API には準拠したままにしておく > - cas で使われる checksum field (64 bit) の使い方を検討する > > というところだと思います. memcache プロトコルは簡単でクライアント実装も多いので、そこを 確保するのは同意します。 > 確かに,cas を使い続ける限り,並行バージョンがいつまでも残り続けることになりますね. > これは困った. > 複数バージョンが返ってくる場合は緊急事態ということで,クライアントは set で上書きしちゃえばいいのかなと思ってたりもします > (アプリケーションにもよるけど). そこまで割り切りますか :-< > さて,先のメールに,checksum を 16 bit にするという提案があります. > Kai は 10,000 qps を超えるリクエストを捌く可能性があります. > このうち,10% が cas だとします. > すると,数十秒に一回,checksum が "偶然にも" 一致してしまいます. > checksum として機能させるには,32 bit でも厳しいかも. これは、空間をチェックサムだけで考えているので、今の場合の衝突としては 過大評価のようにおもいます。 いまは、全体での衝突ではなくて、同一のキーにたいしての更新の衝突が問題です。 # Merkle tree の衝突は全体で衝突しないかどうかが重要かもしれない キーの種類が、 > 10^4 ~ 10^5 (=1万~10万)だとすると、ほとんど衝突は 問題ないようにおもいます。 # 実際はもっとおおい? まぁ"ホット"なデータということではこんなもんかも おおざっぱに、キーあたりでは 0.1 - 0.01 cas operations / sec > 個人的には,ここは手を抜いちゃってもいいのかなという気がしています. というわけで(?) 4つにわるのもなんなので、3つに割ると、21 bit つかえるので、 ひとまずこのへんでどうでしょうか? たとえば、gets で 3種類の concurrent なデータ D1, D2, D3 があったばあいは、 それぞれの21bit checksum をつなげた値 C を、それぞれのデータ送信時の cas unique として送信する。 クライアントは、どのデータについている cas unique もおなじ値なので どれでもいいから、 cas コマンドの unique として使う。 # クライアントは cas unique に対して、操作は必要ないようにしたい -- shino |
From: Takeru I. <tak...@gm...> - 2008-08-09 11:18:45
|
議論の前提は, - memcache API には準拠したままにしておく - cas で使われる checksum field (64 bit) の使い方を検討する というところだと思います. 確かに,cas を使い続ける限り,並行バージョンがいつまでも残り続けることになりますね. これは困った. さて,先のメールに,checksum を 16 bit にするという提案があります. Kai は 10,000 qps を超えるリクエストを捌く可能性があります. このうち,10% が cas だとします. すると,数十秒に一回,checksum が "偶然にも" 一致してしまいます. checksum として機能させるには,32 bit でも厳しいかも. タイムスタンプを使ったとしても,各ノードが分散して値を決めるので,衝突確率は似たようなものになりそう. 先頭 4 bit を,"続く 60 bit に含まれる checksum の数" として使う手もあるかなぁ. 並行バージョンが存在しないときは 60 bit の checksum を使う. 存在するときは,30 bit や 20 bit の checksum を連結して,並行バージョン「群」を表す checksum として使う. 無駄に複雑な気がするし,本当に動くかな? 個人的には,ここは手を抜いちゃってもいいのかなという気がしています. 論文によれば,複数のバージョンが存在してしまう確率はかなり低い (0.06%) です. syntactic reconciliation (VectorClocks による機械的な解消) ができない確率は,さらに低いと思います. 複数バージョンが返ってくる場合は緊急事態ということで,クライアントは set で上書きしちゃえばいいのかなと思ってたりもします (アプリケーションにもよるけど). 難しいところだなぁ. 2008/8/8 shunichi shinohara <shi...@gm...>: > しばらく考えたのですが、まとまらなかったのでひとまず文字におとします。 > このメールは主に 2 点、ひとつめはプロトコルとして、 2つめは衝突の解消の可能性について > # 特に 2 つめが練れてない f(--) > > 2008/8/6 Takeru INOUE <tak...@gm...>: >> 次に cas unique ですが,こんな風に考えてました. >> クラスタ内部では,データに対して vector clocks と checksum の両方を付けて保存しておく. >> checksum のサイズは 64 bit とする. >> クラスタ内部でバージョン不整合を解消するときには vector clocks を用いる. >> クライアントにデータを返すときは,checksum を付随させる. > > これはおもいつかなかったです。興味深いですねー。 > >> クライアントから cas リクエストを受け取ったら,kai_store で書き込むときに checksum を比較する. >> checksum が一致しなければエラーを返す. > > ここでプロトコルがちょっとわからないです。例えば、 get(s?) の結果として > (checksum1, data1), (checksum2, data2) > というものが返ってきたとします。 > すると、その後の cas で、cas unique として指定するのはなににしましょうか? > data1 と data2 をマージするような解消法をとると、checksum1/2 のどっちか? というわけには > いかないですよね。 > > もしどちらかを選択したとすると、選択されなかった側の checksum をもった > ノード(B と呼ぶ)は store するときにエラーになってしまうようにおもいます。 > すると、B のデータは古いままで、いつまでたっても concurrent になってしまうのではないでしょうか? > > vector clocks (VC) の場合は、クライアントが VC も"マージ"するところに > ひとつのキモがあるとおもいます。 > すると、checksum の派生案として、checksum の桁をちいさくする方法があるかな、とおもいました。 > クライアントが要求した キー に対するデータを区別すれば良いだけなので、64bit の checksum は > かなり冗長でしょう。そこで、たとえば 16 bit にしてみると。 > すると、クライアントの cas リクエストにのせる cas unique としては、 checksum1 と 2 を単純に > 並べたものを使うことが出来ます。 # 最大 4 つまで並べられる > store ノードは、これを"マージ"された情報として扱えば、上のノード B もエラーにしなくて > 良いかとおもいました。 > # これも思いつきベースなので、ツッコミよろしくです m(_ _)m > >> 上の案は,memcache API に準拠することを優先しています. >> memcache API に準拠していることは Kai の大きな特徴になっているので,なるべく守ったほうがいいかなと. > > たしかにあの単純なプロトコルは良いです。クライアント実装が簡単にできるのはとても重要 > >> クライアントが vector clocks >> を見れなくなってしまうので,クライアントによるバージョン解決が少し難しくなるかもしれませんが,クライアントが解決すべきは vector >> clocks で解決できない場合なので,まぁいいかなと. > > 2つめ。 > VC で解決できないときにタイムスタンプがけっこう大事な役割を果すかなぁ、とおもっていたので > それがメタデータとして無いのが勿体無いなぁ、と「感じて」います # まだ自分の中でも明確じゃない > > 例えば、「タイムスタンプベースのマージ」という衝突解消法の可能性があるかと考えました。 > 具体例としては、クライアントは連想配列をデータとして格納するとします。 > # たとえば、買い物カゴの品目ID と 個数みたいな感じ > get(s) で返ってきたデータが以下のようなものだったとしましょう。タイムスタンプが付いてるとして > ノード A から Timestamp = 5 > key1: value1 > key2: value2 > ノード B から Timestamp = 10 > key1: value1-dash > key3: value3 > > ここでクライアントでの「タイムスタンプベースのマージ」を以下のように定義 > key1: value1-dash > key2: value2 > key3: value3 > > このような解消が本当に有用なのか、まともな例をおもいつかないので判断できていなのですが、 > 可能性としてあるかなぁ、と。 > この方法のためであれば、cas unique として、checksum の代わりにTimestamp を使うのも > 良いのかもしれない、と妄想しています。 > > 以下、蛇足 > どうも、僕は、(大量のデータの分別をしたいわけではなくて、) 特定のキーに対する数個の値を区別したい、 > というのが kai での cas unique の役割なので、もっと意味のある値を使う手もあるのかと思っているようです。 > # 弱いなぁ。。。 > > 例えば、ハッシュ値とタイムスタンプの折衷というのもありなのかもしれない? > > -- > shino > -- Takeru INOUE <tak...@gm...> |
From: Takeru I. <tak...@gm...> - 2008-08-09 08:56:15
|
2008/8/6 shunichi shino <shi...@gm...>: > まだ理解できていないので、もうちょっと詳しくお願いします m(_ _)m > > 2008/8/3 Takeru INOUE <tak...@gm...>: >> 2008/8/2 Takeru INOUE <tak...@gm...>: >>> deadlock の理由は次の通りです. >>> >>> Node A: >>> - クライアントからリクエストを受信する (kai_memcache) >>> - キーをチェックし,Node B にリクエストを転送する (kai_coordinator, kai_api) >>> - この時点で,Node A の kai_coordinator は待ち状態に入る >>> >>> Node B: >>> - Node A から転送されたリクエストを受信する前に,Node A と同様にリクエストを処理し,Node B に転送する >> >> 転送先は Node B ではなく Node Aが正しいです. >> >>> - この時点で,Node B の kai_coordinator は待ち状態に入る >>> >>> このようにして,お互いの kai_coordinator が待ちとなり,deadlock となります. >>> わかりにくいけど,伝わってるかな? > > Node A から、 node B に転送されたリクエストは、kai_api を通じるのはわかるけど、 > kai_coordinator(B) は通らないのではないかと思っとります > > と、ここまで書いたら分かりました!! > # 上のパラグラフ消そうかとおもったけど、理解の順序を晒したら役にたつかと?たたねーか > > クライアントが繋ぎにきたノードがそのままコーディネータになれば、 get/put を > 投げるだけなので、その後は kai_api しか通らない。 > しかし、転送(route) のパスにはいると、その後に、別ノードの kai_coordinator に > 入るってことですね。ああ、すっきりしました。 そうそう. >>> kai_coordinator は gen_server だったので,単一プロセスでした. >>> kai_api の多重度は関係なくて,kai_coordinator が単一プロセスであることが deadlock の原因でした. >>> >>> 解決方法はいくつかあると思いますが,もっとも簡単なのが gen_server をやめて通常の関数呼び出しにすることでした. >>> こうすることで,kai_coordinator を呼び出している kai_memcache や kai_api のプロセスから関数が呼び出されることになります. >>> 結果的にマルチプロセスとなるため,上のような deadlock を回避できます. >>> なお,kai_coordinator は state を持っていなかったので,gen_server をやめることは簡単でした. >>> >>> ちなみに,deadlock とは関係なく gen_server をやめるつもりでした. >>> というのは,kai_coordinator はかなり処理時間の長いモジュールでありながら,単一プロセスにしておくと,ボトルネックになることが明白だったからです. > > そうですね。プロセス構成図ちゃんと書いて手元においとこう、とおもいました。 > ところで、dynamo の論文、ようやっと読み終えたのですが、そこでは、kai_coordinator に > あたる部分は状態機械でコーディングしてあるよ、って書いてありましたね。 > 今後、書き戻しの処理とか複雑になりそうな部分なので、リクエスト毎に gen_fsm を > 生成するのが最終形なのでしょうかね。 エラー処理を考えると,状態マシンで実装しないといけないのかなぁ.. めんどくさいなぁ.. -- Takeru INOUE <tak...@gm...> |
From: Takeru I. <tak...@gm...> - 2008-08-09 07:13:05
|
性能測定のメールに書いたように,branches/takemaru_connection_pooling では connection pooling を実装してあります. これは,一度 connect したソケットを閉じずに保存しておき,使い回すというものです. これに伴い,kai_api モジュールを kai_api_recv と kai_api_send に分割しました. kai_api_recv は,kai_tcp_server を実装しており,RPC の待ち受けを行っています. kai_api_send は RPC の送信を行います. kai_api_send は connection pooling も実装しています (gen_server を使っています). モジュール名を変更したので,かなり広範な修正となっています. trunk/ への merge はしばらく待ったほうがいいですかねぇ. 2008/8/9 Takeru INOUE <tak...@gm...>: > これまでは,複数ノードからなるクラスタに高い負荷をかけると,2000 qps くらいでエラーが多発していました. > 主な原因は,TCP connect の失敗でした. > Kai クラスタの内部通信には kai_api を使っていますが,通信するたびに connect を行っていました. > > これを解決するために,ちょっと時期尚早かなと思ったのですが,connection pooling を実装しました. > これは,一度 connect したソケットを閉じずに保存しておき,使い回すというものです. > 複数プロセスから connection pool にアクセスするため,ソケットが使用中ということがあり得て,ボトルネックになってしまう可能性があります. > これを回避するために,使用中のときは新たに connect して新しいソケットを生成するようにしてあります. > > 実験条件は次の通りです. > ノード数は 5 です. > 性能を上げるために,次のように設定を変更してプロエス数を増やしました. > max_connections: 180 > memcache_max_connections: 60 > > 対象となるソースコードは,branches/takemaru_connection_pooling (r66) です. > > データサイズは 1KB で,数十万回の操作を行いました. > set:get の比率は 2:8 です. > > クライアント数が 30-40 のときに最も高い性能を発揮しました. > > (N,R,W) = (2,1,2) のときの結果は次の通りです. > 表の値は "合計 (set/get)" です. > > rate: 12155 (2176/9979) qps > latency: > median: (2.06/2.01) ms > 99%: (17.1/14.5) ms > CPU: 175 % くらい > > (N,R,W) = (3,2,2) のときです. > > rate: 9380 (1885,7496) qps > latency: > median: (1.90,2.07) ms > 99%: (15.8,14.7) ms > CPU: 170 % くらい > > データを複製するシステムとしては,悪くない数値でしょうか. > いつものように latency の逆数と rate を比較すると,並行処理で 20倍くらいの性能を稼いでいるのがわかります. > > CPU には余裕があります (4 コアなので 400 % が上限). > > これよりさらに高い負荷をかけると,kai_sync あるいは kai_membership が異常終了します. > 以下のようなエラーが発生するので,connection pooling がボトルネックになっているのかもしれません. > > ** State machine kai_sync terminating > ** Last event in was timeout > ** When State == ready > ** Data == [] > ** Reason for termination = > ** {shutdown,{gen_server,call, > [kai_api_send, > {return,{{192,168,1,1},11011},#Port<0.212>}]}} > > 正常系での性能の高さは証明できたと思うので,性能測定はしばらくお休みしようと思います. > 次の課題は障害時の性能などですね. > > > 2008/8/9 Takeru INOUE <tak...@gm...>: >> 目的が違うので,本来は memcached と比較する意味は余りありません. >> それでも比較したがる人がいるので (まぁ,いるんですよ),同条件で性能測定を行ってみました. >> 以下のようなチューニングを行い,高い性能を狙いました. >> >> 1 ノードで動作させ,単体の memcached と比較できるようにしました. >> もちろん,(N,R,W) = (1,1,1) です. >> また,kai_sync.erl, kai_membership.erl の TIMER を infinity にしました >> (そうしないと,過負荷でこれらのプロセスが異常終了することがあるので). >> 性能を上げるために,次のように設定を変更してプロエス数を増やしました. >> max_connections: 90 >> memcache_max_connections: 30 >> >> 対象となるソースコードは,trunk/ (r66) です. >> >> 1 KB のデータを数十万回操作して,その性能を測定しました. >> クライアント数が 12-14 のときに最も高い性能を発揮しました. >> 以下がその性能値です. >> >> set: >> rate: 7136 qps >> latency: >> median: 1.55 ms >> 99%: 2.76 ms >> CPU: 370 % くらい >> >> get: >> rate: 10193 qps >> latency: >> median: 1.21 ms >> 99%: 3.71 ms >> CPU: 355 % くらい >> >> 10,000 qps を超えると "速い" という気がしますね. >> C で実装して memory allocation にまで気を遣っている memcached >> ほどではないと思いますが,かなり速いソフトウェアと言えるのではないでしょうか. >> また,単純に latency の逆数をとると 1,000 qps にも満たないわけですが,多数のプロセスが協調することでその >> 10倍以上の値を実現しているというのは,Erlang ならではですね. >> >> 総スループットは 100Mbps に満たないので,帯域には余裕があります (1000Base-T です). >> >> CPU 使用率が 400% 近いのは 4 コアだからです (CPU Xeon 2.13 GHz x4). >> 今回のボトルネックは CPU だと思われます. >> >> >> 2008/8/9 Takeru INOUE <tak...@gm...>: >>>>> データサイズは 100 KB とやや大きめにし, (N,R,W) = (3,2,2) としました. >>>>> - rate: 731 qps (585 Mbps) >>>>> latency: >>>>> median: 12.9/10.5 ms (set/get) >>>>> 99%: 15.4/44.0 ms >>>>> >>>>> データを複製するタイプの key-value store としては,悪くない数値ではないでしょうか? >>>> >>>> 同感です。ひとつ、不思議なのは、median と 99% があまり離れていないことでしょうか? >>>> set ではこの 2 つの数字からは、標準偏差が 1ms 以下になっているとおもいます。 >>>> ちょっとバラつかなさすぎな??? >>> >>> この値は間違い (typo) でした m(_ _)m >>> この後に出すメールを参考にしてください. >>> >>>>> Latency の平均値は 1.67 ms で,逆数は 599 qps でした. >>>>> 実際のスループットは 6 倍のスループットでしかなく,先ほどの高い並行性は発揮できませんでした. >>>> >>>> kai_store は、1 ノードで 1 プロセスなので、そこがボトルネックになったりするでしょうか? >>>> おおざっぱに、3500qps だと、ノードあたり、3500*3/5 =~ 2000 qps くらいさばくので、 >>>> シングルスレッド化すると、逆数にして、500usec ですね。まだ捌けそうなきもする。 >>>> とすると、memcache 側かなぁ?? >>> >>> max_connections を増やしたり,connection pooling を実装したりして,かなり性能が伸びました. >>> これも,後で出すメールを. >>> >>>>> 最後に,CPU 使用率についてです. >>>>> 前回と同様に,4 core のマシンを使いましたが,1 core しか使われていませんでした. >>>>> CPU 使用率は 40-70% の間を変化していました. >>>>> >>>> >>>> これ、解決したいですねぇ。なんでなんだろ?? >>> >>> これも解決しました. >>> 単に top の見方をわかってなかっただけで,負荷を高めていったら CPU 使用率が 370% くらいまであがりました. >>> つまり,ちゃんとマルチコアで動いてたってことです. >>> >>> -- >>> Takeru INOUE <tak...@gm...> >>> >> >> >> >> -- >> Takeru INOUE <tak...@gm...> >> > > > > -- > Takeru INOUE <tak...@gm...> > -- Takeru INOUE <tak...@gm...> |
From: Takeru I. <tak...@gm...> - 2008-08-09 07:08:11
|
これまでは,複数ノードからなるクラスタに高い負荷をかけると,2000 qps くらいでエラーが多発していました. 主な原因は,TCP connect の失敗でした. Kai クラスタの内部通信には kai_api を使っていますが,通信するたびに connect を行っていました. これを解決するために,ちょっと時期尚早かなと思ったのですが,connection pooling を実装しました. これは,一度 connect したソケットを閉じずに保存しておき,使い回すというものです. 複数プロセスから connection pool にアクセスするため,ソケットが使用中ということがあり得て,ボトルネックになってしまう可能性があります. これを回避するために,使用中のときは新たに connect して新しいソケットを生成するようにしてあります. 実験条件は次の通りです. ノード数は 5 です. 性能を上げるために,次のように設定を変更してプロエス数を増やしました. max_connections: 180 memcache_max_connections: 60 対象となるソースコードは,branches/takemaru_connection_pooling (r66) です. データサイズは 1KB で,数十万回の操作を行いました. set:get の比率は 2:8 です. クライアント数が 30-40 のときに最も高い性能を発揮しました. (N,R,W) = (2,1,2) のときの結果は次の通りです. 表の値は "合計 (set/get)" です. rate: 12155 (2176/9979) qps latency: median: (2.06/2.01) ms 99%: (17.1/14.5) ms CPU: 175 % くらい (N,R,W) = (3,2,2) のときです. rate: 9380 (1885,7496) qps latency: median: (1.90,2.07) ms 99%: (15.8,14.7) ms CPU: 170 % くらい データを複製するシステムとしては,悪くない数値でしょうか. いつものように latency の逆数と rate を比較すると,並行処理で 20倍くらいの性能を稼いでいるのがわかります. CPU には余裕があります (4 コアなので 400 % が上限). これよりさらに高い負荷をかけると,kai_sync あるいは kai_membership が異常終了します. 以下のようなエラーが発生するので,connection pooling がボトルネックになっているのかもしれません. ** State machine kai_sync terminating ** Last event in was timeout ** When State == ready ** Data == [] ** Reason for termination = ** {shutdown,{gen_server,call, [kai_api_send, {return,{{192,168,1,1},11011},#Port<0.212>}]}} 正常系での性能の高さは証明できたと思うので,性能測定はしばらくお休みしようと思います. 次の課題は障害時の性能などですね. 2008/8/9 Takeru INOUE <tak...@gm...>: > 目的が違うので,本来は memcached と比較する意味は余りありません. > それでも比較したがる人がいるので (まぁ,いるんですよ),同条件で性能測定を行ってみました. > 以下のようなチューニングを行い,高い性能を狙いました. > > 1 ノードで動作させ,単体の memcached と比較できるようにしました. > もちろん,(N,R,W) = (1,1,1) です. > また,kai_sync.erl, kai_membership.erl の TIMER を infinity にしました > (そうしないと,過負荷でこれらのプロセスが異常終了することがあるので). > 性能を上げるために,次のように設定を変更してプロエス数を増やしました. > max_connections: 90 > memcache_max_connections: 30 > > 対象となるソースコードは,trunk/ (r66) です. > > 1 KB のデータを数十万回操作して,その性能を測定しました. > クライアント数が 12-14 のときに最も高い性能を発揮しました. > 以下がその性能値です. > > set: > rate: 7136 qps > latency: > median: 1.55 ms > 99%: 2.76 ms > CPU: 370 % くらい > > get: > rate: 10193 qps > latency: > median: 1.21 ms > 99%: 3.71 ms > CPU: 355 % くらい > > 10,000 qps を超えると "速い" という気がしますね. > C で実装して memory allocation にまで気を遣っている memcached > ほどではないと思いますが,かなり速いソフトウェアと言えるのではないでしょうか. > また,単純に latency の逆数をとると 1,000 qps にも満たないわけですが,多数のプロセスが協調することでその > 10倍以上の値を実現しているというのは,Erlang ならではですね. > > 総スループットは 100Mbps に満たないので,帯域には余裕があります (1000Base-T です). > > CPU 使用率が 400% 近いのは 4 コアだからです (CPU Xeon 2.13 GHz x4). > 今回のボトルネックは CPU だと思われます. > > > 2008/8/9 Takeru INOUE <tak...@gm...>: >>>> データサイズは 100 KB とやや大きめにし, (N,R,W) = (3,2,2) としました. >>>> - rate: 731 qps (585 Mbps) >>>> latency: >>>> median: 12.9/10.5 ms (set/get) >>>> 99%: 15.4/44.0 ms >>>> >>>> データを複製するタイプの key-value store としては,悪くない数値ではないでしょうか? >>> >>> 同感です。ひとつ、不思議なのは、median と 99% があまり離れていないことでしょうか? >>> set ではこの 2 つの数字からは、標準偏差が 1ms 以下になっているとおもいます。 >>> ちょっとバラつかなさすぎな??? >> >> この値は間違い (typo) でした m(_ _)m >> この後に出すメールを参考にしてください. >> >>>> Latency の平均値は 1.67 ms で,逆数は 599 qps でした. >>>> 実際のスループットは 6 倍のスループットでしかなく,先ほどの高い並行性は発揮できませんでした. >>> >>> kai_store は、1 ノードで 1 プロセスなので、そこがボトルネックになったりするでしょうか? >>> おおざっぱに、3500qps だと、ノードあたり、3500*3/5 =~ 2000 qps くらいさばくので、 >>> シングルスレッド化すると、逆数にして、500usec ですね。まだ捌けそうなきもする。 >>> とすると、memcache 側かなぁ?? >> >> max_connections を増やしたり,connection pooling を実装したりして,かなり性能が伸びました. >> これも,後で出すメールを. >> >>>> 最後に,CPU 使用率についてです. >>>> 前回と同様に,4 core のマシンを使いましたが,1 core しか使われていませんでした. >>>> CPU 使用率は 40-70% の間を変化していました. >>>> >>> >>> これ、解決したいですねぇ。なんでなんだろ?? >> >> これも解決しました. >> 単に top の見方をわかってなかっただけで,負荷を高めていったら CPU 使用率が 370% くらいまであがりました. >> つまり,ちゃんとマルチコアで動いてたってことです. >> >> -- >> Takeru INOUE <tak...@gm...> >> > > > > -- > Takeru INOUE <tak...@gm...> > -- Takeru INOUE <tak...@gm...> |