想定読者
- インフラエンジニア
始めに
この記事は半分は備忘録です.
なので,完成品についてだけでなく,試そうとした色々な構成についても書いています.
記事の前提
この記事の前提として,Minecraft Bedrock Server(以下BDS)については知っているものとします.
例えばUDPを使っているみたいな解説はいちいち致しませんのでご了承ください.
前記
以前に使っていたBDSのデプロイ構成を簡単にご紹介したいと思います.
シングルノード上にUbuntu Serverをインストールし,その上にdockerを使ってコンテナでBDSのコンテナをデプロイしていました.
コンテナイメージはitzg/minecraft-bedrock-serverを使用しました.
サーバーを外に出すため,契約していた光回線のポートを一つ解放してUDPバケットを通すような方式にしていました.
反省
この構成を続けないという決断に至ったのは,この構成でのラグがひどいという報告を受けたからです.
実際にプレイしているところを画面共有見せてもらったりしたのですが,敵をクリックした数秒後にダメージが入った演出があり,その気にはすでにこちらがダメージを負っているみたいなことが珍しくなかったです.
これについて私は深く深く反省し,UXの向上に努めるべく,インフラエンジニアの威信をかけて,次のサーバーをデプロイしようというところであります.
構成の構想
ひと口にラグを改善するといっても手段は幾通りもあります.ここで注目したいのは,前回LAN内で折り返しをしていた私のプレイだけは非常に快適だったことです.つまりのところサーバー側に関してはほとんど問題なく稼働しており,サーバーが外に出るまでのところについて私どもの改善が見込まれるのではないかなと言う結論に至りました.
上流について
ここで一つ注意なのですが,私が以前に使っていた光回線はソフトバンクで,私が今回使う回線は大家さんの意向で更新されたマーブル光であります.つまり厳密な検証環境ではないということは重々ご承知いただきたいなと思います.
基本的にはソフトバンク光よりもマーブル光の方が通信速度も安定していてパケットロスも少なくて回線の品質は良いです.しかしながらマーブル光はポート開放をすることができません.固定IPオプションを申し込めばもしかしたらみたいな話を聞いたのですが,そこらへんの準備がうまくいってない段階でこの企画を始めてしまったので,ポート開放は諦めて代替の手段を使います.
サーバーを外に出す
サーバーを外に出す方式について,本当はCloudflareトンネルを使いたかったのですが,トンネルが場合によってはUDPパケット通さないという仕様があったため,泣く泣く別のトンネルサービスを利用することにします.
それがplayit.ggです.ゲーム用にサーバーをエクスポートするためのサービスらしくて,これ以外に良さげな選択肢がなかった(あったら教えてほしい)のでこれで頑張るという感じです.今のところそこまで悪い印象はないですが(ソフトバンク回線の時に比べて),本番環境で8人とかが同時ログインしたら話が変わってくるかもしれません.
どこを高速にするべきか
以上のことを踏まえまして,今回速度向上のために使用するのは,LAN内部でどれだけロスを減らせるかに尽きるかと思います.
反省点
前回,ボトルネックになっていた可能性のある箇所について列挙します.
- Dockerのネットワークを経由してノードネットワークに出ていた
- Ubuntu Serverの過剰な機能がリソースを圧迫した
- Dockerが制御に挟まっていた
このあたりかなと思っています.
改善点
なんだかDockerが悪者みたいな書き方をしていますが,docker composeなどは非常によい奴で,自分が最初にシステム管理を担当したときにDockerだったのが心底助かりました.いい奴です.
んでも,このくらいのエッジ環境を作るとなると,色々と改善点が見えてくるのです.
速度というか,直に動かすという意味ではsystemd-nspawnの方が強いですし,そこまでいかなくてもcontainerdを直に触るほうが,そりゃ速いですよ.
ということで,Dockerを使わずにcountainerdを直に叩くorベアメタルにBDSをインストールしちゃう,という方策が一つ立ちました.OSももっとキレッキレのものを使う模索をしたいと思います.
Flatcar
コンテナを動かしたいだけなら,それ専用のOSがあるよという話をKaaSの方から聞いたことがありました.コンテナ専用OSの一つがFlatcarです.
Flatcar公式サイト
他のコンテナ専用OSもあって,k8s専用のTalos等です.
構成案s
Flatcar-systemd-nspawn
FlatcarというOSの上に,systemc-nspawnでBDSをデプロイするという方法です.
Flatcar上で色々と動かす必要があって,イミュータブルなシステムと相性が最悪でした.
今後はこの構成は登場しません.
Flatcar-containerd
containerdを直接叩こうという試みです.
nerdctlコマンドをインストールするIgnitionを書くところで詰まった(適切なバイナリーを落としてきても,バイナリーの形式が実行可能ではないというエラーが出た)ので,頓挫しました.
Flatcar-k3s
containerdを直接叩くような挙動をしたいけれど,Flatcarの外から叩きたいという思想です.
k3sを入れたInginitionを書くのが難しかった(検索しても情報が少ない)ので,停止中.
Gentoo
この記事の中で一番狂った選択肢です.
Linux Kernelのヘルツを変えてパケットさばきを高速にしたり,各種ツールについて,-Ofastでビルドするなどの,速くするためのカスタムを最も自由度が高くできるので,おすすめ.
最初に思いついたアイデアですが,作業コストが高すぎるので,テスト期間が終わって余力があったらやろうかなと思っています.
Alpine-k3s
Alpine Linuxというとても小さなLinuxの上にk3sクラスタを作ってcontainerdをコントロールしようというものです.デプロイが比較的簡単で(ほんとか?),私でも3時間くらいでできました.
ちなみにコントローラーもAlpine Linuxですが,workのAlpine Linuxだけベアメタルにしようかなと思ってます.