[連載3]どどんとふが重い?

前回の投稿で、おそらく純粋にTRPGを快適に利用したい考えている一般利用者を99%ほどふるい落としたような気がしますが、気にせず続けます。

じゃあ、より多数の人数を終了するにはどうすれば良いのか、対処法を考えていきたいと思います。

対処法1:レイテンシを思いっきり短くする

インターネット上だと色んな速度のネットワークやPCがあり、遅いPCに引きずられてしまいます。

これに対する最強の解決策が、インターネットを使わず全ての利用者が、最新の高速なPCに買い換えて、公式鯖管理人の家に有線LANで直結するという方法です。

Client1300

つまり、この状態を

こうします。
これは海外ではオンラインゲームを快適に行うために使われるやりかたで、LANパーティーと呼ばれています。
確かに通信部分の平均応答時間が、0.4秒から0.02秒に改善されますから、今のリソースでも遅延はあまり発生しなくなるでしょう。
どどんとふのコードはそのままで、公式鯖も大きく構成を変更することなく、自鯖がなくても解決しますね。
しかし、1300人がPCを持ち寄るとなると、部屋には入れませんし、電源も足りませんので、ざっと思いつく限りでも以下の準備が必要そうです。

・仮設テントや机、椅子、照明などの手配と設営。

1300人分ですので、PC含めて一人あたり1畳(1.65m^2)分のスペースだとしても2145m^2。競技用の50mプール3個分ほどらしいです。
マルチモードの光ファイバー(1000base-SX)が到達できる範囲にそれだけのスペースがなければ、シングルモード(1000Base-LX)で伸ばすしかないですね。自宅のL2スイッチはSFPスロットが付いているので、SFPさえ取り付ければどちらでも対応可能です。

・電源車の手配もしくは、電力会社に工事用の仮設電源設備の設置を依頼する

PC1台が200Wだと仮定すれば合計260KVA。それにネットワーク機器と照明が追加されるのでざっくり300KVAぐらいでしょうか?
空調は計算がややこしいし屋外前提なので使わないものとして計算します。
川崎重工のガスタービン発電車(MPU300)あたりがちょうど良さそうです。レンタルの価格相場はどこも個別見積もりっぽいのでわかりませんでした。
5t車なので中型免許でなんとかなりそうですが、これ出力電圧が6600VだからそのままだとPCには使えないのでダウントランスとか分電盤が別に必要です。設営場所の端から端まで電源引くにはPC5台(1000W)ごとにドラムコ ードを分けるとしても260個必要です。一個4300円なので、ざっくり112万円ですね。

・設営場所までの屋外LAN配線およびネットワークスイッチ増設

1300人だとLANポートだけでなくIPアドレスも足りないのでをL3スイッチも必要ですね。
L2スイッチは、1300ポート分なので48ポートを30台でなんとかなりそうです。
ネットギアやD-Linkの48ポートスイッチが、1台約5万円なので30台で150万円。L3スイッチが、Ciscoの3750マルチレイヤースイッチが26万。LANケーブル代も会わせると200万で足りるかどうかという数字です。


・所轄の警察に道路使用許可の申請

・私道部分は、私道の所有者および近隣の通行権所有者への使用許可

・近隣住民への説明と同意

結論:俺が住めなくなりますので、辞めてください。普通に公民館なりレンタル会議スペースでオフセすればいいだろ!

対処法2:レイテンシが長くなっても待ちがでないぐらいプロセス数を増やしまくる

プロセス数が足りないから待ちが生じるので、公式鯖のプロセス数とメモリを大量に増やすという方法です。
1300人を捌くために1300個のプロセスとそれが入るだけのメモリを用意すればこの問題は解決します。
DodontoFServer.rbの仮想メモリ使用サイズは1プロセスあたり90MBですので、90MB×1300で117GB。
それにnginxやzramやOSなどの必要量を加味すると128~160GB搭載すれば処理できるようになります。
LGA2011-3のXeon搭載のマザーボードなら、128GBや256GBを搭載できるモデルもありますので、マザーボード、CPU、電源、ケース、メモリでざっくり50万ぐらいでしょうか?
ほぼ同じ構成の待機系もあるので2台分ですね。1300人が一人800円ずつです。利用者全体でいえば5000人ぐらいはいそうなので、それなら一人あたり200円で済みます。
ちょっと高くつきますが、完成品のサーバー(例えばIBM/Lenovoのx3650M5 メモリ最大768GB 1CPUソケットでも最大384GB)なら自作する手間もありませんし、24/365のハードウェア保守サポートがつきます。

結論:100万円ください。家族で旅行に行って、残りを住宅ローンの返済に充てます。公式鯖の増設?ちょと重いぐらい我慢してください。

まじめな対処法3:nginxでバッファリングする

次は真面目な解決策です。前回紹介した図をまず見てみましょう。

A-1の処理に時間がかかるのであれば、nginxはDodontoFServer.rbから処理結果が返ってきた時点でDodontoFServer.rbを開放してしまえば良いのです。幸いなことに公式鯖のnginxは32768コネクションまで同時に捌けるよう設定していますので、nginxが詰まることは当分なさそうです。これなら、相手の回線速度による待ちが発生しようがしまいが、DodontoFServer.rbはリクエストがジャンジャカ受け取り&処理できます。
で、結論からいうと実はこの設定はすでにやっていたのです。公式鯖のnginxの設定で該当箇所を見てみましょう。

        location ~ ^/DodontoF_srv1/DodontoFServer.rb$ {
          fastcgi_pass 127.0.0.1:9001;
          fastcgi_index index.html;
          fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
          include fastcgi_params;
          fastcgi_ignore_client_abort on;
          fastcgi_connect_timeout 120;
          fastcgi_send_timeout 180;
          fastcgi_read_timeout 180;
          fastcgi_buffer_size 256k;
          fastcgi_buffers 128 256k;    # ← !?
          fastcgi_busy_buffers_size 256k;
          fastcgi_temp_file_write_size 256k;
        }

上記設定にある「fastcgi_buffers 」という設定項目がそれにあたります。設定内容は、256KBのバッファを128個用意するという設定になっています。
つまり、128×4鯖ということは512。ざっくり500人程度までは待ちが生じない設定になっていたのです!!しかも、その当時はこの設定内容をよくわかっていなかったので256KBも確保していました。どう考えても多すぎます。
はい、公式鯖3rd generationをリリースしたときは、これで余裕だったのですが、今では全然足りていません。これを現状のリクエスト数に応じて調整すれば良いわけですね。
DodontoFServer.rbの平均リクエストサイズは前回の投稿で約700Byteだとわかりましたが、Analogレポートのサイズ別の内訳を見ると、バッファサイズを16KBにすれば全リクエストの99%以上をバッファリングできることになります。

今後の利用者増を考慮してもとりあえず1鯖あたりは500個ほど用意しておけば足りそうですね。これなら同時ログイン数が2000人になっても遅延はでないはずです。

ちゃんと情報を整理する事は重要ですね。実はこの記事を書いているうちにこの解決策を思いつきました。なんだ簡単にできるじゃないか。。。

ということで、次のメンテナンスでこの設定を試してみて、いずれ結果を紹介したいと思います。