From n.nakai @ sdy.co.jp Thu Dec 27 02:22:52 2007 From: n.nakai @ sdy.co.jp (=?ISO-2022-JP?B?GyRCQ2Y1bzd7NVcbKEI=?=) Date: Thu, 27 Dec 2007 02:22:52 +0900 Subject: [Ultramonkey-l7-develop 117] =?iso-2022-jp?b?c2NoZWRfZGF0YRskQiRLJEQkJCRGJE4lUSVDJUEbKEI=?= Message-ID: <47728DEC.2050308@sdy.co.jp> TO:皆様 中居です。 お世話になっております。 冬至も過ぎてすっかり真冬の様相を呈してきました。 もう数日で今年が終わりますが…元旦からコードを書いていそうで怖い自分です。 さて、ちょっとコードを追いかけていて、スケジュールモジュールでの問題点を 発見致しましたのでパッチとともに報告を載せたいと思います。 現状、l7vsd_1.0.0などはstruct l7vs_serviceの中にvoid* sched_dataと言う変 数にスケジュールモジュールが使用するデータを格納することになっております。 具体的に言えば、l7vs_serviceが持つGList *dest_listのポインタを格納してい ます。 例:sched_rr.c 62 static struct l7vs_dest * 63 l7vs_sched_rr_schedule(struct l7vs_service *srv, struct l7vs_conn *conn) 64 { 65 GList *l; 66 67 if(srv == NULL) 68 { 69 return NULL; 70 } 71 if (srv->sched_data == NULL) { 72 l = g_list_first(srv->dest_list); 73 } else { 74 l = (GList *)srv->sched_data; 75 } 76 77 if (l == NULL) { 78 return NULL; 79 } 80 81 srv->sched_data = g_list_next(l); 82 83 return (struct l7vs_dest *)l->data; 84 } この方式の問題点は「serviceが持っているdest_listが不変のものだと思ってい る子と」だと思います。 なぜならばl7vsdは起動中にもrealserver(=dest)が追加/削除できるわけで、そ うするとl7vs_serviceが持っている sched_dataのdestを指す先がどこまで有効 なのか、 判断できないことです。 つまり、sched_dataにGList*を入れていますが、スケジューリング関数がよびだ されるまでにdest_listの構成が変わっているかもしれない、sched_dataが指し 示すdestのインスタンスが開放されているかもしれないと言うことです。 と、言うわけでその辺のパッチを作成してみました。 protomod.cのprotomod_finalize()で行っていたactivelistの判定を schedule_module内部の持たせた  →destのweightの判断はscheduleのみが判定すべきと思いました。 sched_rr.cではsched_dataの管理をmoduleが行うようにした。 sched_lc.cではそもそも最小のnactiveに接続するためsched_dataは必要なく、 呼ばれたときに一番最初に見つかった有効な destでnactiveが小さいものを払い 出すようにした。 sched_wrr.cではactive_listを基準に走査するように変更 詰まるところリストが変わる可能性のあるGlistをsched_dataに格納するのが諸 悪の根源と言うことで、素直にEndPointを持つようにしました。 と、言うのもserviceがdestを削除してもスケジューラに通知するわけではない ので、スケジューラが抱えているdest自体の開放が完治できないからです。 生きているインスタンスのポインタなのか、開放されているポインタなのかを判 断することができない以上、ここはEndPointのインスタンスを schedulerが管理 する歯科ありません。 ただ、ここでもう一つ問題点が発生します。 それはweightの問題です。 例えばcinsertモジュールでcookieから作り出したdestが現状接続できるかどう かは分かりません。 serviceが保有するdest_listをこじ開けてweight>0のリストを作成しscheduler に渡していますが、そもそも weightを書き換える場所なのかという議論がし尽 されていないように感じます。 とりあえず上記部分は一番エレガントなのは 1)schedulerがすべて有効なEndPointかを判断するコードにする。 2)その後有効ならばセッション継続、無効ならば再払出 と言う流れ似ると思いますが、さすがに手を入れるところが大きくなりすぎるの で手前のコードでl7vsdでのsched_dataはGList*ではないという判断が出きるそ うです。 まぁ、まだチェックが甘いところがあると思いますが、ファイルを添付します。 どうぞよろしくお願い致します。 -------------- next part -------------- テキスト形式以外の添付ファイルを保管しました... ファイル名: sched_data.patch 型: text/x-patch サイズ: 14209 バイト 説明: 無し URL: http://lists.sourceforge.jp/mailman/archives/ultramonkey-l7-develop/attachments/20071227/bc5f16ee/attachment.bin From tanuma.kouhei @ nttcom.co.jp Thu Dec 27 21:33:23 2007 From: tanuma.kouhei @ nttcom.co.jp (Kouhei TANUMA) Date: Thu, 27 Dec 2007 21:33:23 +0900 Subject: [Ultramonkey-l7-develop 118] =?iso-2022-jp?b?GyRCJTslQyU3JWclczBdO30kNyRKJCQlYiU4JWUhPCVrGyhC?= =?iso-2022-jp?b?GyRCJHI6bkAuJDckXiQ3JD8bKEI=?= Message-ID: <20071227190547.B189.TANUMA.KOUHEI@nttcom.co.jp> UltraMonkey-L7 Develop の皆様 田沼です。 標題のとおりになりますが、簡単に説明します。 静的なコンテンツを表示する WEB サーバなどでは、 クライアントと単一の WEB サーバ間で、セッションを維持する 必要がありませんので、設定したスケジュールモジュールに 従って、常に割り振りを行いたいと思います。 しかしながら、現在公開されているプロトコルモジュールは 全て何らかの方法でセッション維持を行うものとなっているため、 単純にスケジュールモジュールに任せるということが できなくなっています。 これを解決するべく『セッションを維持しない』プロトコル モジュールを作成しました。 (実際は protomod_cinsert を元に不要部分を削っただけですが…) 名前は sessionless としましたが、少し長い気もしますので、 適宜変更していただいてかまいません。 なお、本モジュールでは、専用のオプションは一つもありません。 Makefile.am のパッチと本モジュールの設定の例 (l7directord.cf) 、 l7directord に sessionless をオプションなしで認識するパッチを 添付します。 また、l7vsadm コマンドからは以下のような設定方法になります。 --------------------------------------------------------------------- ※ 仮想IPアドレス (10.0.0.1) 実 WEB サーバ 2 台 (192.168.0.1, 192.168.0.2) 常にラウンドロビンで振り分けする # l7vsadm -A -t 10.0.0.1:80 -m sessionless -s rr # l7vsadm -a -t 10.0.0.1:80 -m sessionless -s rr -r 192.168.0.1:80 # l7vsadm -a -t 10.0.0.1:80 -m sessionless -s rr -r 192.168.0.2:80 --------------------------------------------------------------------- ※ 仮想IPアドレス (10.0.0.2) 実 WEB サーバ 2 台 (192.168.0.1, 192.168.0.2) 常に重み付きラウンドロビン (割合 2:3) で振り分けする # l7vsadm -A -t 10.0.0.2:80 -m sessionless -s wrr # l7vsadm -a -t 10.0.0.2:80 -m sessionless -s wrr -r 192.168.0.1:80 -w 2 # l7vsadm -a -t 10.0.0.2:80 -m sessionless -s wrr -r 192.168.0.2:80 -w 3 --------------------------------------------------------------------- 以上です。 -------------- next part -------------- テキスト形式以外の添付ファイルを保管しました... ファイル名: protomod_sessionless.c 型: application/octet-stream サイズ: 14681 バイト 説明: 無し URL: http://lists.sourceforge.jp/mailman/archives/ultramonkey-l7-develop/attachments/20071227/1c555c88/attachment.obj -------------- next part -------------- テキスト形式以外の添付ファイルを保管しました... ファイル名: l7directord-1.0.0-0.patch 型: application/octet-stream サイズ: 1805 バイト 説明: 無し URL: http://lists.sourceforge.jp/mailman/archives/ultramonkey-l7-develop/attachments/20071227/1c555c88/attachment-0001.obj -------------- next part -------------- テキスト形式以外の添付ファイルを保管しました... ファイル名: Makefile.am.patch 型: application/octet-stream サイズ: 2220 バイト 説明: 無し URL: http://lists.sourceforge.jp/mailman/archives/ultramonkey-l7-develop/attachments/20071227/1c555c88/attachment-0002.obj -------------- next part -------------- テキスト形式以外の添付ファイルを保管しました... ファイル名: l7directord.cf 型: application/octet-stream サイズ: 1087 バイト 説明: 無し URL: http://lists.sourceforge.jp/mailman/archives/ultramonkey-l7-develop/attachments/20071227/1c555c88/attachment-0003.obj