Minecraftサーバーをリアルタイムで監視してコントロールする
◾️概要
Minecraftのサーバーを起動しっぱなしでは電気代がかかるため、利用しないときは止めておきたいです。ただ、止めておいても利用するときには起動しないといけず、さてこれは誰がするのでしょうか。
そこで本サークルではDiscord Botをかまして誰でもサーバーを起動・停止を行えるようにFuguBotという自作のボットを運用しています。
しかし、そのFuguBotも安定して動いているわけではなく、何かと上手に動作していないことがあります。今回はその中でもサーバーを監視し続けることへのトライアンドエラーを記事にまとめれたらなと思い筆を動かしています。
◾️FuguBotとは?
Minecraftのサーバーをいい感じに管理してくれるDiscord Botです。機能を箇条書きしてみますと以下の通りになります。
Discordからユーザがサーバーを起動・停止できる
ユーザのサーバ入退室が通知される
サーバに人がいない状態が5分以上続ければ停止する
内部的にはPythonで記述されており、MinecraftサーバーのDockerコンテナを監視などを行っているものです。
◾️何がうまく行ってないのか?
簡単に言えば、ユーザの入退室が検知できていません。先ほど持っている機能と紹介しましたが、実は動いていないんですよね。お恥ずかしい。
内部的には、Fugu君はDockerコンテナへPythonのAPIを通してログを定期的に取得し、それを解析することでサーバーの入退室を検知しています。
しかし、Minecraftサーバーへ自作のPluginを入れるなどの影響で大量にログが出ており、どこかがボトルネックとなって処理が追いついてないようです。
具体的にはFugu君は5秒に一度ログを獲得し、解析するので5秒以内に解析が終わっていないと次のログの解析は始めることができません。(もし並列にしてしまうとユーザ退出と入室の順序が異なってしまう可能性がある)
しかし、おそらく処理が追いついていないためにうまく動作していないものと考えられます。
では、具体的にどこがボトルネックになり得るでしょうか。考えてみましたが、以下のものが思いつきました。
Docker APIのlogの獲得が遅い
Pythonによるlogの分析が遅い
logが多すぎる
これらのどれかまたは最悪の場合は全てありえます。
◾️調べてみよう!
早速ボトルネックの候補を網羅的に調べてみたいと思います。
(記事ではもうすぐに結果ですが、調べてみる方法を考えるのが難しい!!)
⚫️Docker API の log 獲得が遅い
この検証で注意するべきは、Fugu君から見れば獲得が遅いかもしれないが、内部的にはMinecraftサーバがログを吐き、それをDockerがlogに出力してから獲得の流れなので、もっと細かくみるべきです。
しかし、そこまでしてると大変なので、今回は獲得までの流れはブラックボックスとしてMinecraftサーバがログを出力してからFugu君に到達するまでの時間を計測してみます。都合のいいことにMinecraftはログに出力時間が記載されているためFugu君に届いた時の時間の差で計算することができるでしょう。
⚫️Pythonによるlogの分析が遅い
これはかなりあり得る話なのかなと個人的は思います。なんたってPythonは遅いで有名ですからね。
この解析はPythonがログを獲得してから分析するまでの間で時間を測ればいいのでコードに付け足しをするだけで簡単にデータを取得することができるでしょう。
⚫️logが多すぎる
logは素朴に数えるだけでいいので、5秒間隔で区切って平均値や分散を取って確認することにしましょうか。
◾️原因は?
調べてみようとしてshellからdocker logsを実行してみるとかなりログが溜まっているようでPythonから呼び出さなくても遅いことを発見しまして、もしかしたらログの最初から探索しているのかなと思いました。
で、結局それが原因でした。
◾️修正
docker logsにはtailオプションというものがあり、これはログを最も古いものから探索するのではなく最新から遡れるものです。
container.logs(tail=5000)
docker apiにも同様のオプションがあるので、5秒間で5000は出力されないだろう(バグの原因になりそう)とたかを括って修正すればうまく動作することを確認しました。
◾️まとめ
たくさんの要因は挙げたものの検証はせず、簡単なミスな事例でしたが何か参考になれば幸いです。
この記事が気に入ったらサポートをしてみませんか?