酒と機械とときどき読書

PCいじりやウイスキーについて書くブログ。ほとんど自分用備忘録

バニラのMinecraftサーバーをたてる

導入

友人とほぼバニラでMinecraftマルチをやることになり、数年ぶりにサーバー構築をすることになった。 真面目にMinecraftサーバーを運用していたのは10年以上前だったため、知識のアップデートとしてブログ記事にすることにした。

前提

特に友人たちから希望があった訳では無いが、MODは入れずにやろうということだったので、Minecraftは最新版を使うこととした。自身の管理負荷軽減のため、プラグインが入れられる様にBukkit系サーバーの使用は要検討とする。 また、Macユーザーがいる(+Java版のみ所有の人がいる)ため、統合版ではなく、Java版を使うことにした。 最大人数は7人だが、モチベが高くない人もいるため、通常の同時接続人数は5人程度と考えられる。

以上より、前提条件を下記表のように見積もった。

項目 想定
最大接続人数 10人
想定同時接続 5人
Minecraftバージョン 1.21.11
MOD なし
プラグイン 要検討

サーバーインフラ検討

HW

軽く調べてみたところ、私がサーバーを運営していた2010年代前半と比較して、CPU負荷がだいぶ高くなっているらしい。また、サーバーのメイン処理はシングルスレッドなので、重要なのはCPUのシングルスレッド性能らしい。 常時稼働していてMinecraftサーバーを運用出来るようなCPU性能のあるマシンは自宅に無いため、VPS契約するか、物理サーバーを用意する必要がある。 自宅には使用していないPCだったりパーツだったりが転がっているのと、友人たちのMinecraft熱がどれだけ続くかわからないのでVPSで長期契約しづらいというのもあり、自宅にあるパーツで物理サーバーを用意することにした。

まず候補になるCPUは下記の3つ。自分でテストしたGeekbench6(シングル)の結果も併記する。

  • Ryzen7 5700X Score: 2169
  • Ryzen7 1700 Score: 917
  • Core i5 6500 Score: 1147

Geminiに聞いてみたところ、同時接続5人でMOD無しであればi5 6500又はRyzen7 1700で十分そうだったので、悩んだ結果i5 6500を採用することにした。 マルチスレッド性能では圧倒的に1700の方が高いので他の用途に取っておきたかったのと、値上がり中のDDR4メモリを追加購入したくなかったためである。

CPUが決まったので、家にあったそれに合うパーツをかき集めたところ、下記表のようになった。

CPU Core i5 6500
RAM DDR3L 8GB *2
M/B H110M-S01
GPU オンボード
電源 KEIAN KT-450PS
ケース ZALMAN T8
システムディスク Patriot 120GB SATA SSD
ストレージ WD 2TB HDD

もともとメモリは8GB1枚だったのだが、若干不安だったのでヤフオクで中古DDR3Lメモリを1200円くらいで買い足して16GBにした。 ちなみに、12~13年前はHDDがまだまだ主流だったのもあり、ワールドデータをRAMディスクに置く運用が流行っていた記憶だが、今はSSDがメインなのでRAMディスク運用はみんなしていないらしい。 また、電源がだいぶ使い古した骨董品で常時稼働させるには不安だが、予備がなく、他のPCから剥ぎ取るのは面倒だったため、とりあえず我慢することにする。 SSDもあまりいい感じの容量のものがなく、120GBでもおそらくOS+環境一式+ワールドデータは収まるのだが、バックアップ等に使えるよう余っていたHDDを追加する。

SW

OSは、普段から使用しているOSがDebian系が多いので、Ubuntu24.04を使用する事にした。 また、いざ動かしてみてスペックが足りず別のPCを使用する羽目になった場合に備え、Dockerコンテナ上に構築する事としたい。 Docker直弄りでも良いかと思ったのだが、最近なにかの機会に目にした、WebUIを持つ管理ツールのPortainerを使って管理する。 また、自宅内に、Prometheus+Grafanaのモニタリング環境があるため、node-exporterを使って負荷状況のモニタリングを行う。

サーバープログラム

バニラのMinecraftサーバープログラムは最適化不足で重いらしく、プラグインサーバーを使用することで負荷軽減を図れるらしい。 下記3種類あたりが候補かと思ったが、軽量化目的ならばPaper一択となるようだ。(後で調べたら他にもfabric等の候補がありそう)

  • CraftBukkit
  • Spigot
  • Paper

サーバー設定

せっかくなので、軽量化のために出来る設定についてもある程度調べてみることにした。 まず、サーバー側での描画距離とシミュレーション距離の設定が大事らしい。 server.propertiesview-distancesimulation-distance がそれにあたる。さしあたり、それぞれ8と6に設定することとした。 また、CPUに負荷がかかる要因の一つにチャンクの生成があるため、チャンクをあらかじめ生成しておくことでサーバー負荷の軽減を試みた。 Chunkyというプラグインを使用して、ネザーとエンドは半径2000、通常のワールドは半径3000の範囲をサーバー公開前に事前生成する。

また、itzg/minecraft-server というDockerイメージが、サーバーエンジンやプラグインを設定しておけば勝手に環境構築してくれて便利そうなので使ってみることにした。 下記のようなdocker-compose.yml を作成した。LVMで作成した50GB程度のLVを/mnt/mcdataにマウントし、それをコンテナにbindしている。 このLVのスナップショットを取り、スナップショットからディスク全体をtar.gzにアーカイブするスクリプトをcronで毎朝6時に動かすことにした。(本当はSystemd Timerにしようと思ったが面倒なので...)

services:
  mc:
    image: itzg/minecraft-server:latest
    pull_policy: daily
    tty: true
    stdin_open: true
    ports:
      - "25565:25565"
      - "8565:8100"
    environment:
      EULA: "TRUE"
      TYPE: PAPER
      VERSION: 1.21.11
      MEMORY: 6G
      DIFFICULTY: hard
      VIEW_DISTANCE: 8
      SIMULATION_DISTANCE: 6
      JVM_OPTS: "-XX:+UseG1GC -XX:+ParallelRefProcEnabled -XX:MaxGCPauseMillis=200 -XX:+UnlockExperimentalVMOptions -XX:+DisableExplicitGC -XX:+AlwaysPreTouch -XX:G1NewSizePercent=30 -XX:G1MaxNewSizePercent=40 -XX:G1HeapRegionSize=8M -XX:G1ReservePercent=20 -XX:G1HeapWastePercent=5 -XX:G1MixedGCCountTarget=4 -XX:InitiatingHeapOccupancyPercent=15 -XX:G1MixedGCLiveThresholdPercent=90 -XX:G1RSetUpdatingPauseTimePercent=5 -XX:SurvivorRatio=32 -XX:+PerfDisableSharedMem -XX:MaxTenuringThreshold=1"
      PLUGINS: |
        https://cdn.modrinth.com/data/swbUV1cr/versions/WyxMyd9G/bluemap-5.15-paper.jar
        https://cdn.modrinth.com/data/1u6JkXh5/versions/1MJ3rIHu/worldedit-bukkit-7.4.0-rc-01.jar
        https://cdn.modrinth.com/data/fALzjamp/versions/P3y2MXnd/Chunky-Bukkit-1.4.40.jar

    volumes:
      - /mnt/mcdata:/data
    

ネットワークまわり

コンテナから自宅LANへの公開は、Docker Composeであらかじめ設定してあるため、インターネットへの公開のみ設定すれば良い。 自宅はアパートだが、個人で引いた回線があり、ミニPCにOpenWRTをインストールしたルーターがあるためNAT(ポート開放)の設定をしてインターネットからサーバーPCに接続出来るようにした。 インターネット向けのポートは、一応セキュリティを考慮して25565からずらしておいた。 こんな感じのイメージ図となる。

運用開始

実際に運用開始してみると、基本的に同時ログインは1人か2人で、今まで最多で4人だった。基本的にTPSは20を下回ることがなく、msptが極稀に(ログイン時など?)60msに行く程度、という感じで運用できている。 とある休日のGrafanaダッシュボードのCPU負荷部分のスクリーンショットを載せておく。22時頃に4人ログインしているが、だいたいゲーム内の同じ場所にいるので、バラバラな場所だともう少し負荷が高くなるかもしれない。

Grafanaダッシュボード
色々気にしながら構築してみたが、結果的に余裕のある運用ができそうで良かった。

まとめ

今回のサーバー構築ではHW、SW選定から設定までだいぶGeminiにお世話になった。 自分が多少なりとも知識がついたせいもあるかもしれないが、以前サーバー構築を行った時と比べて深いところまで検討して構築を行えた気がして、技術の進化を感じる経験になった。また、Minecraftサーバーの要求スペックがだいぶ上がってるのも技術の進化の一つではあるだろう。 久しぶりのMinecraftはゲームそのものも楽しい(知らないアイテムとか敵がたくさんいて浦島太郎の気分だった)し、サーバー構築も色々と勉強になって楽しかった。 ただ、色々とサーバー構築例を調査している最中に、「こういう構成でマイクラやってます」という内容の最近書かれたブログ記事を少なく感じたため、自分で記事にすることにした。 生成AIが流行っている今だからこそ、生の人間の文章を少しでも残しておきたい。

Geekbench 6 on Orange Pi Zero 2W 1GB

前置き

ちょっと試してみたい事があって久しぶりにSBCを購入した。 Orange Pi Zero 2W のメモリ1GB版だ。

www.orangepi.org

AliExpressで購入したのだが、AliExpressを使うのも久しぶりだったので引越し前の住所に送ってしまい転送してもらうなど、余計な手間がかかってしまった。 折角新しいボードを手に入れたので、ここ最近の進化を体験するためにもベンチマークを走らせてみることにした。

ベンチマークソフト選定

別になんでも良かったのだが、クロスプラットフォームである(WindowsLinuxAndroidスマホで使える)ことから最近はGeekbenchを使うことが多い。 今回もGeekbench6を使うことにした。...のだが、Linux用のDownloadページに行くとx86_64にしかない。

geekbench6 Linux DLページ

ちょっと調べてみると、Preview版ならLinuxのArm用があるらしいのでそれを使う。

こちら

いざベンチマーク

wgetか何かでアーカイブを落としてきて展開、中にあるgeekbench6という実行ファイルを実行すればいい。

tar -xvf Geekbench-6.4.0-LinuxARMPreview.tar.gz
cd Geekbench-6.4.0-LinuxARMPreview
./geekbench6

実行はできるが、途中で止まってしまうようだ。 ちょっとシステムログを見てみると、

$ sudo dmesg
~~~~
[ 3613.219269] oom-kill:constraint=CONSTRAINT_NONE,nodemask=(null),cpuset=user.slice,mems_allowed=0,global_oom,task_memcg=/user.slice/user-1000.slice/session-5.scope,task=geekbench_aarch,pid=2742,uid=1000
[ 3613.219326] Out of memory: Killed process 2742 (geekbench_aarch) total-vm:1369620kB, anon-rss:576228kB, file-rss:28kB, shmem-rss:0kB, UID:1000 pgtables:2288kB oom_score_adj:0

メモリ不足でoom-killerに殺されている。 おそらくスワップ領域増やしてあげればなんとかなる気はする。(スワップ使ってまでベンチマークしてもあまり意味はない気がする)

スワップを増やす

こんな感じで一時的に増やしてみる。sudoをつけるかrootで実行する。

fallocate -l 1G /tmpswap
chmod 600 /tmpswap
mkswap /tmpswap
swapon /tmpswap

もういっかいベンチマーク

swapを増やせたのでもう一回トライしてみる。

./geekbench6

シングルは通ったが、マルチの実行中にまた落ちてしまった。合計4GB程のswapを用意して再度試したら完走した。

Raspberry PiのUSBメモリの自動マウント無効化メモ

USBメモリを挿した時にオートマウントして自作のスクリプトを走らせたかった。
/etc/udev/rules.d/以下にルールを作っておいたけどうまくいかず、ちょっと調べたところ勝手にマウントされていた。

https://ifritjp.github.io/blog/site/2020/02/21/raspberrypi-mount.html
こちらを参考にしたけど~/.configにpcmanfmの設定ファイルが無かった。

dpkg -L pcmanfm
でインストールされるファイルを調べたところ、/etc/xdg/pcmanfm/LXDE-pi/pcmanfm.confを書き換えれば良さそうだった。
上の記事通り
mount_on_startup
mount_removable
を0に変更し、再起動したら自動マウントはされなくなった。

iptablesのルールをリセットしたい

※この記事のままだとすべてACCEPTするルールも消えてしまうっぽいので注意。後で書き直す

自宅のLANに立てたサーバーを外部に公開したいと思ってiptablesを設定したが、間違えてしまっていた。ルーターなので再起動しないでルールを設定し直したかったので調べてみた。自分用メモ。

$iptable -t nat -F
$iptables -X

こんな感じでいけるらしい。今回はNATの設定をリセットしたかったので-Fオプションに-t natを追加してNATテーブルのルールを削除した。nat以外もリセットしたければ

$iptables -F
$iptables -t mangle -F

これもやっとくと良さそう。

-F

チェインの内容を全消去する。何も指定しないとテーブル内の全ルールを消去する。

-X

ユーザー定義チェインを消去する。何も指定しないと組み込みチェイン以外を全消去する。

こういう記事書くたびにググるよりmanページ見たほうがいいと思ってしまう。だがなぜかネットには劣化manみたいな情報が山程転がってる。

RadeonでOpenCLしたい

ちょっと深層学習を試したくて転がっていたRadeon RX470とあまりのパーツを使って1台PCを組んだ。 PlaidMLを通してTensorflowが使えれば目的のソフトが使えるはずなのだが、意外と道のりが長そうなので記事にすることにした。

Dockerでやりたい

結論から言うと無理だった。Dockerコンテナの中でRadeonを使うのは無理らしい。GeForceなら割と簡単にできそうだった。

Ubuntu 19.10でやりたい

これも無理そうだった。Pythonを使うなら新しい方が便利だろうと最新のUbuntuをインストールし、環境をセットアップしてみた。いざplaidml-setupを走らせると、GPUが見つからない。

Default Config Devices:
   No devices.

Experimental Config Devices:
   llvm_cpu.0 : CPU (LLVM)

Using experimental devices can cause poor performance, crashes, and other nastiness.

lspciでは認識されているが、clinfoでは見えない。

$ lspci | grep Radeon
01:00.0 VGA compatible controller: Advanced Micro Devices, Inc. [AMD/ATI] Ellesmere [Radeon RX 470/480/570/570X/580/580X/590] (rev cf)
01:00.1 Audio device: Advanced Micro Devices, Inc. [AMD/ATI] Ellesmere HDMI Audio [Radeon RX 470/480 / 570/580/590]

$ clinfo
Number of platforms                               0

調べてみるとプロプライエタリなドライバが必要らしい。amdgpu-pro linuxで検索すると色々出てくるが、結構古いVerのリリースノートが上に出てくるので注意。 2020年1月現在、19.50が最新っぽいのでそれを落としてきて、展開、インストール。

$ wget https://drivers.amd.com/drivers/linux//19.50/amdgpu-pro-19.50-967956-ubuntu-18.04.tar.xz
$ tar -xf amdgpu-pro-19.50-967956-ubuntu-18.04.tar.xz
$ sudo amdgpu-pro-19.50-967956-ubuntu-18.04/amdgpu-pro-install

色々言われるのだが、要は

ERROR: This package can only be installed on Ubuntu 18.04.

とのことでUbuntu18.04じゃなきゃだめなようだ。

Ubuntu 18.04でやりたい

Ubuntu 18.04で上記の手順でやってみたらすんなり動いた。やっぱり公式がやれって言うことは余程の理由がなければ守っといたほうが良い。

いつの間にかBusterがstableになってた

今年の2月の頭頃から10ヶ月間、ほとんどゲームしかしていないオタクになっていた。主にオンラインゲーム(だいたいLoLと黒い砂漠)をやっていてWindowsしか使っていなかったため、Linuxを起動することもほぼ無かった。最近になってようやく創作意欲が湧いてきたので久しぶりにノートPCのDebianを起動した。溜まりに溜まったアップデートを適用するのに時間がかかるだろうなというのは覚悟して

apt-get update

してみると、

N: Repository 'http://security.debian.org/debian-security buster/updates InRelease' changed its 'Version' value from '' to '10'
E: Repository 'http://security.debian.org/debian-security buster/updates InRelease' changed its 'Suite' value from 'testing' to 'stable'
N: This must be accepted explicitly before updates for this repository can be applied. See apt-secure(8) manpage for details.
N: Repository 'http://ftp.jp.debian.org/debian buster InRelease' changed its 'Version' value from '' to '10.2'
E: Repository 'http://ftp.jp.debian.org/debian buster InRelease' changed its 'Suite' value from 'testing' to 'stable'
N: This must be accepted explicitly before updates for this repository can be applied. See apt-secure(8) manpage for details.
E: Repository 'http://ftp.jp.debian.org/debian buster-updates InRelease' changed its 'Suite' value from 'testing-updates' to 'stable-updates'
N: This must be accepted explicitly before updates for this repository can be applied. See apt-secure(8) manpage for details.

こんな感じのメッセージがでてきてそもそもアップデート出来なかった。ハードウェアが割と新しかったり、使いたい新機能があったりでDebian testingを使っていたのだが、知らない間(2019年7月)にDebian 10が正式リリースされていたらしい。明示的に変更をacceptしないといけないらしいが、manページをみてもよくわからなかったのでググった。どうやら、

apt-get update --allow-releaseinfo-change

でアップデート出来るようになるそうだ。
続いて、

apt-get upgrade

しようとしたが、

libcuda1 : Depends: nvidia-alternative (= 418.74-1)
            Recommends: nvidia-smi but it is not going to be installed

このような依存関係のせいで止まってしまう。これは普通に

apt-get install nvidia-smi

でなんとかなった。ただ、nvidia-smiの依存パッケージのインストール中に、古いGeForce(たぶんFermi世代以前)を使ってる人はインストールするなよ的なメッセージが出てたのでハードが古い人は気をつけたほうがいいかもしれない。GPUドライバの更新があったので念の為ここで再起動を挟んだ。
再度

apt-get upgrade

すると、700MBほどのファイルをダウンロードし始めた。途中、libpamのアップデートで再起動するサービスを適宜選べと言われるが、そのまま進んだ。ディスプレイマネージャーも再起動しとけと言われた。
その後はなにか聞かれることもなく順調だったが、

update-initramfs: Generating /boot/initrd.img-4.19.0-2-amd64
Errors were encountered while processing:
 minissdpd
E: Sub-process /usr/bin/dpkg returned an error code (1)

こんなエラーで止まってしまった。minissdpdはUPnPの高速化用のデーモンらしい。何が悪いのかよくわからないので

apt-get remove minissdpd

で削除してしまうことにした。

スマホをWebカメラとして使いたい

2月頃からLoLを始めたらただただゲームをするだけのオタクに成り果ててしまった。
最近ようやくLoL以外のことをする気になってきたので久しぶりにブログを書くことにした。

フェイストラッキングを試してみたくてWebカメラを探したのだが、中々見つからなかったのでAndoroidスマホWebカメラとして使う方法を探してみた。
https://play.google.com/store/apps/details?id=com.dev47apps.droidcam&hl=ja
このアプリをAndroidにインストールし、PC側にもクライアントをインストールすることでUSB接続・WiFi経由のどちらでもWebカメラとして使えるようになる。
Windowsでしか試していないが、Linux用クライアントもありそうなので今度試してみたい。

USBでつないで試してみたが、かなり実用的な速度で遅延なく動くように感じた。