3流プログラマのメモ書き

元開発職→社内SE→派遣で営業支援の三流プログラマのIT技術メモ書き。 このメモが忘れっぽい自分とググってきた技術者の役に立ってくれれば幸いです。(jehupc.exblog.jpから移転中)

SunRayで誰かが動画再生すると全体の描画が遅くなった

SunRay2を使ってるんですが、突然描画重くなったりする現象が発生してました。

サーバのCPU,メモリ負荷は問題なかったため、smokeping でSunrayサーバのネットワークの遅延を調べてみると以下のようになってました。

ちょうど描画が重かった12:40-13:00にかけて大きな遅延が発生しています。

さらにユーザの利用調査をしていると、どうやら動画再生をしているときに重くなり、Sunrayサーバへの遅延も発生しているようです。

この現象についてググると、Osamu Sayama's Weblog:sunray bandwidth limit にドンピシャな情報が載っていました。

どうやらSunRayで動画サイト等を見ると、画面遷移が多いためサーバ側はクライアント側に大量の描画パケットを送信します。

SunRayの描画パケットはSunRay2で画面描画が遅く残像らしきものが残るで書いたようにUDPを使ってます

UDPは相手の都合お構いなしにパケットを投げるので、今回の動画のように画面更新が多くて、クライアント側のネットーワークがサーバ側ネットーワークより遅い場合、描画パケットが大量過ぎて捌ききれない状態になり、他のユーザへの描画パケットや/クライアントからのマウス・キーボード操作パケットが破棄/遅延されてしまうようですね。

参考先にあるように、DTU側で帯域制限をしてやれば、そのDTUに対してサーバ側は設定された帯域以上はパケットを投げず全体への影響を抑えることができるようです。

それで、utcapture コマンドで帯域制限無しと有りでのSunRayサーバ~クライアントのパケットロスを調べてみました。

utcapture の結果の各列の意味は下記のとおりです。

TERMINALID:クライアントの MAC アドレス。

TIMESTAMP:「20041229112512」などの「年-月-日-時-分-秒」の時刻形式で表示されるロスが発生した時間。

TOTAL PACKET:サーバーからクライアントに送信された合計パケット数。

TOTAL LOSS:クライアントによって消失と報告された合計パケット数。

BYTES SENT:サーバーからクライアントに送信された合計バイト数。

PERCENT LOSS:現在と前のポーリング間隔の間に消失したパケットの割合。

LATENCY:クライアントとサーバー間の往復にかかる時間 (ミリ秒単位)

まず帯域制限をかけなかった場合です。

====帯域制限なし

bash-3.00# /opt/SUNWut/sbin/utcapture | grep aabbcc(特定のDTUのみ抽出したかったので、そのDTUのMACアドレスgrepしてます)

TERMINALID TIMESTAMP TOTAL PACKET TOTAL LOSS BYTES SENT PERCENT LOSS LATENCY

↓通常の業務操作

002128aabbcc 20111111143745 45453 6565 51095948

002128aabbcc 20111111143815 82038 9317 96325054 7.522

002128aabbcc 20111111143830 124093 11114 150312460 4.273

002128aabbcc 20111111143845 135388 11664 164520680 4.869

↓画像ファイルを全画面で表示を繰り返したとき

002128aabbcc 20111111143915 142906 13804 171358852 28.465

002128aabbcc 20111111143930 203722 32692 227348840 31.058

002128aabbcc 20111111143945 287421 66322 293922746 40.180

002128aabbcc 20111111144015 318069 76575 321067832 33.454

002128aabbcc 20111111144031 318079 76576 321068570 10.000

画像ファイルを全画面表示するとやはりサーバから送信するパケットが増えるとと共にパケットロスと遅延が増大しています。

次に、DTU側で帯域制限を 30Mbps でかけた時です。

(帯域制限のかけ方は、DTUで Ctrl+Pause+M → Advanced → Bandwidth Limit で、bps単位で帯域を制限します)

====帯域制限あり 30Mbps

bash-3.00# /opt/SUNWut/sbin/utcapture | grep aabbcc

TERMINALID TIMESTAMP TOTAL PACKET TOTAL LOSS BYTES SENT PERCENT LOSS LATENCY

↓画像ファイルを全画面で表示を繰り返したとき

002128aabbcc 20111111144231 86999 11306 101932702 7.813

002128aabbcc 20111111144301 123778 16061 145332462 12.929

002128aabbcc 20111111144316 151922 20277 177660986 14.980

ちょっとは送信パケットが減り、同様にパケットロスと遅延も減っています。

さらに、8Mbpsで制限をかけた時です。

====帯域制限 8Mbps

bash-3.00# /opt/SUNWut/sbin/utcapture | grep aabbcc

TERMINALID TIMESTAMP TOTAL PACKET TOTAL LOSS BYTES SENT PERCENT LOSS LATENCY

↓画像ファイルを全画面で表示を繰り返したとき

002128aabbcc 20111111144446 48332 1457 61692026 2.405

002128aabbcc 20111111144531 51240 1458 65180180 0.117

002128aabbcc 20111111144546 53590 1478 68135492 0.851

002128aabbcc 20111111144616 57335 1627 72505752 3.979

002128aabbcc 20111111144731 67512 1629 84757134 0.261

002128aabbcc 20111111144847 80039 1653 99529180 1.666

↓画像ファイル全画面テスト

002128aabbcc 20111111145132 88198 1853 110024494 2.483

002128aabbcc 20111111145147 100233 2177 125551832 2.692

8Mbpsでは、画像ファイル全画面表示しても大きな遅延やパケットロスがさほど発生していません。

もちろんクライアント側では制限なしの時に比べると描画が遅く感じますが、他への影響をかけないという観点からするとやはり帯域制限は必要だと感じました。

参考:

Sun Ray Server Software 4.0 管理者マニュアル P34あたりにutcaptureの使い方が載ってます。

最近忙しすぎて全然ブログ更新できてませんでしたが、ようやく時間ができたのでボチボチアップしていこうかと思います。