From kurosawa @ valinux.co.jp Tue Jun 12 17:46:44 2007 From: kurosawa @ valinux.co.jp (KUROSAWA Takahiro) Date: Tue, 12 Jun 2007 17:46:44 +0900 Subject: [Ultramonkey-l7-develop 28] Re: =?iso-2022-jp?b?V2VpZ2h0ZWQgUm91bmRSb2JpbiAbJEI1IUc9REkbKEI=?= =?iso-2022-jp?b?GyRCMkMlUSVDJUEbKEI=?= In-Reply-To: References: <20070601101940.A1AB.KONDO.HIDEAKI@oss.ntt.co.jp> Message-ID: <20070612084644.A7D972DC7A0@mail.valinux.co.jp> 黒澤です. On Sun, 03 Jun 2007 02:08:12 +0900 Shinya TAKEBAYASHI wrote: > > 1:1:2や5:5:10に設定された場合の動作は、リアルサーバの > > 1台目->2台目->3台目->3台目->1台目->2台目・・・という > > ような感じでバランシングされるものと思います。 > > そうですね,そうでないとラウンドロビンになりませんよね・・・. > > http://primeserver.fujitsu.com/ipcom/catalog/data/1/3.html > > の「静的な重み付きラウンドロビン」を参考に,アルゴリズムを > 再考してみます. LVS の WRR アルゴリズム (net/ipv4/ipvs/ip_vs_wrr.c) からひっぱっ てくれば実装できそうですが,ソースをそのまま使ってしまうとコピー ライトとライセンスの問題が出てきますね. LVS でやっているのは,だいたいこんな感じみたいです: (1) 各リアルサーバに指定された weight の最大公約数 (gcd と表記) と weight の最大値 (max_weight と表記) を調べておく. 最大公約数の計算にはユークリッドの互除法というものを使っているようです. 計算方法自体は簡単です. (2) 整数 x を用意し,それに max_weight を代入. (3) リアルサーバのスケジュール時に,リアルサーバの weight が x 以上の ものだけを round-robin で一周だけスケジュールする. (4) 一周スケジュールしたら x から gcd を引く (x -= gcd). x > 0 なら (3) へ.x <= 0 なら (2) へ. 例えば,リアルサーバが rs_a, rs_b, rs_c, rs_d の 4 台構成で, weight がそれぞれ 24, 12, 18, 30 の場合,gcd = 6, max_weight = 30 となるので,それぞれの周回でスケジュールされるのは, 1 周目: x = 30 / rs_d 2 周目: x = 24 / rs_a, rs_d 3 周目: x = 18 / rs_a, rs_c, rs_d 4 周目: x = 12 / rs_a, rs_b, rs_c, rs_d 5 周目: x = 6 / rs_a, rs_b, rs_c, rs_d 6 周目: x = 30 / (一周目と同じ) ... となります.5 周スケジュールして,各リアルサーバがスケジュールされる回数は, rs_a : rs_b : rs_c : rs_d = 4 : 2 : 3 : 5 = 24 : 12 : 18 : 30 となります.