MPP5 PPPoEサーバーの負荷分散

それでは、生データから始めましょう。

FreeBSD + MPD5(PPPoE)に基づいた4つのNASサーバーを備えたISPがあり、タスクはサーバーの負荷を正規化することです。

まず、正規化前のサーバー負荷のグラフを見てみましょう。





ひどい散布がすぐに見えます(茶色と青色のグラフィックに注意してください)。

これらのサーバーは同じ構成(ALMOSTは他のNASと同じ、UPD_1を参照)、同じソフトウェア、同じ設定(および同じネットワーク接続)を持っています。 しかし、スケジュールから判断すると、そのうちの1つはまだ他のアイドルよりもアイドル状態です。

正義を回復するために、このイベントが開始されました。

正規化手法



技術的には、mpd5へのtelnetアクセスを使用し、max-childrenパラメーターを設定して特定のNASへのアクセスを制限します。

特定のサーバーへのアクセスを提供する-max-children = 10000に設定します。

また、アルゴリズムによるその後の分析のために、特定のNASのユーザー数を読み取ります。



アルゴリズム



最も物議を醸すセクション。 ここで、うまくいくという結論を述べます。 それでも、このアルゴリズムのビジョンを紹介してください。 まず最初に、入力に次の形式のNASのリストがあります。

nases = [ ('VPN2',('192.168.X.Y','5001','username','password',600)), ('VPN3',('192.168.X.Y1','5001','username','password',300)), ('VPN4',('192.168.X.Y2','5001','username','password',600)), ('VPN5',('192.168.X.Y3','5001','username','password',200)) ]
      
      



パラメータはそれぞれ次のとおりです。

サーバー名、アドレス、ポート、mpd管理者名、パスワード、正規化係数(実際、これはこのサーバーがサポートする並列セッションの最大数です)



アルゴリズムの本質は次のとおりです。

  1. すべてのサーバーが機能しているかどうかを判断します(1つまたは複数のサーバーが落ちた場合-他のサーバーに比例して係数を再配布します)
  2. アイテム1を考慮して、各サーバーの満杯の割合を計算します1
  3. リストを満杯率の降順でソートします。
  4. 最も人口の多いN台のサーバーの電源を切り、残りを使用可能にします。




実装のポイントについて:

1.ユーザー数を決定します。

 def getUserCount(anas): (nas,params) = anas (host,port,user,pwd,koeff) = params try: client = telnetlib.Telnet(host,port) client.read_until("Username:") client.write(user+'\n') client.read_until("Password:") client.write(pwd+'\n') client.read_until("[]") client.write("sh mem \n") res = int(client.read_until("BUND").split('\n')[3].split()[1]) dummy = client.read_until("[]") client.write("sh global \n") limit=int(client.read_until("Global options").split("\n")[10].split()[2]) client.close() return (nas,(res,limit),params) except: return (nas,(0,0),params) ress = map(getUserCount,nases)
      
      







2.すべてのサーバーの係数の合計を考慮します。

 naskcount = reduce(lambda total,nas: total+nas[1][4],nases,0)
      
      







3. c.1で受信したリストからオンラインのすべてのユーザーの合計を計算します。

 naswcount = reduce(lambda total,nas: total+(((nas[1][0] != 0) and nas[2][4]) or 0),ress,0)
      
      







4.落ちる可能性のあるサーバーの係数を考慮して新しい係数を計算します( new_koeff = koeff *(nascount / naswcount) ):

 def corKoeff(nas): (nas,(klk,limit),params) = nas (host,port,user,pwd,koeff) = params koeff = koeff * ((klk != 0 ) and (float(naskcount)/float(naswcount)) or 0) params = (host,port,user,pwd,int(round(koeff,0))) return (nas,(klk,limit),params) ress1 = map(corKoeff,ress)
      
      







5.サーバー占有率( パーセント= 100%* klk / koeff )を計算してソートします。

 def calcMaxUser(nas): (nas,(klk,limit),params) = nas (host,port,user,pwd,koeff) = params return (nas,klk,(koeff !=0 and float(100*klk)/float(koeff)) or 0,params) ress2 = map(calcMaxUser,ress1) ress2.sort(lambda x,y: cmp(x[2],y[2]))
      
      







今、私たちは「耳を傾ける」ことを行います(最小負荷の2つの要素を除くすべてのサーバーで-1を置き換えます(個人的にはこのアプローチはあまり好きではありませんが、より「文化的」にする方法がわかりません)。

 for i in range(-1,-len(ress2)+1,-1): (nas,klk,koeff,params) = ress2[i] koeff = -1 ress2[i] = (nas,klk,koeff,params)
      
      







その後、ress2には、mpdにmax-childrenをインストールするために必要なものがすべて揃っています。 これがまさに私たちがしていることです(-1とマークされたサーバーでは最大数を10,000に設定し、他のすべてのユーザーには現在のユーザー数に等しい-10%(係数は頭から取得することができ、主なことは現在の接続ユーザー数を超えないことです):

 def setMax(nas): (nas,klk,koeff,params) = nas (host,port,user,pwd,kkx) = params if koeff != -1: klk = 10000 else: klk = round(klk * float(100-down_koeff)/float(100)) try: client = telnetlib.Telnet(host,port) client.read_until("Username:") client.write(user+'\n') client.read_until("Password:") client.write(pwd+'\n') client.read_until("[]") client.write("set global max-children %d\n" % klk) client.close() return (nas,"max set to %d" % klk) except: return (nas,"Error setting max-children %d" % klk)
      
      







結果



その結果、このスクリプトをcronにインストールした後、このような正規化が行われました



青茶色はほぼ同じように行きます。 達成するために必要だったこと



PS

Pythonでtelnetを使用する際の問題: ここ

mpd5パラメータ(ロシア語): ここ

R.P.S.



作業する場合、telnet出力を最後まで必ず「読み込む」ことを忘れないでくださいdummy = client.read_until( "[]")そうしないと、予期しない結果(たとえば、機能しなかったコマンド)が発生します。



UPD:名前をmoreに変更しました( obramkoに感謝)。 「 MPD5 VPNサーバーの負荷を正規化するラウンドロビン

管理者からのUPD_1:論争の的 」なNAS-s に関する説明:

ブラウン:

FreeBSD 8.2-RELEASE-p1 #1: Fri May 13 22:55:37 EEST 2011

CPU: Intel(R) Core(TM) i7 CPU 860 @ 2.80GHz (3363.89-MHz K8-class CPU)

Origin = "GenuineIntel" Id = 0x106e5 Family = 6 Model = 1e Stepping = 5 Features=0xbfebfbff <FPU,VME,DE,PSE,TSC,MSR,PAE,MCE,CX8,APIC,SEP,MTRR,PGE,MCA,CMOV,PAT,PSE36,CLFLUSH,DTS,ACPI,MMX,FXSR,SSE,SSE2,SS,HTT,TM,PBE > Features2=0x98e3fd <SSE3,DTES64,MON,DS_CPL,VMX,SMX,EST,TM2,SSSE3,CX16,xTPR,PDCM,SSE4.1,SSE4.2,POPCNT >

AMD Features=0x28100800 <SYSCALL,NX,RDTSCP,LM>

AMD Features2=0x1<LAHF>

TSC: P-state invariant

real memory = 2147483648 (2048 MB)

avail memory = 2041532416 (1946 MB)











青:

FreeBSD 8.2-RELEASE-p1 #1: Fri May 13 22:55:37 EEST 2011

Timecounter "i8254" frequency 1193182 Hz quality 0

CPU: Intel(R) Core(TM) i7 CPU 920 @ 2.67GHz (2664.79-MHz K8-class CPU)

Origin = "GenuineIntel" Id = 0x106a5 Family = 6 Model = 1a Stepping = 5 Features=0xbfebfbff < FPU,VME,DE,PSE,TSC,MSR,PAE,MCE,CX8,APIC,SEP,MTRR,PGE,MCA,CMOV,PAT,PSE36,CLFLUSH,DTS,ACPI,MMX,FXSR,SSE,SSE2,SS,HTT,TM,PBE >

Features2=0x98e3bd < SSE3,DTES64,MON,DS_CPL,VMX,EST,TM2,SSSE3,CX16,xTPR,PDCM,SSE4.1,SSE4.2,POPCNT >

AMD Features=0x28100800 <SYSCALL,NX,RDTSCP,LM >

AMD Features2=0x17<LAHF>

TSC: P-state invariant

real memory = 4294967296 (4096 MB)

avail memory = 4106272768 (3916 MB)









どちらの場合も、LAGGは2つのEMで使用され、顧客とそれぞれ1つのigbと通信します-世界へのアクセス。

違いはCPUとRAMにあります。

サーバーのDIDINITYを誤解させたチェヘビの人々に謝罪します。 ただし、原則として、上記の手法を使用する場合、通常は同じ数のユーザーを保持します。 したがって、このメモは有用であると考えており、コメントをお待ちしています。



管理者からのUPD_2 :このメソッドを開発するに至った理由。

ほとんどのお客様は午前中に接続しますが、午後6〜7時にダウンロードを開始しました。

正規化しないと、「青い」NASがほとんどの接続を引き継ぎます。 通常はピークまでそれらと連携します。 また、6〜7時間後にほとんどのお客様がそれぞれ15〜20メガビットでダウンロードを開始するため、2週間に1回程度パニックに陥ります。 この正規化の方法は、X時間前であっても、当社が設定した係数に従って顧客をばらまくことにより、顧客に信頼性の高いコミュニケーションを提供し、数時間の睡眠をサポートします。



All Articles