MinecraftServerをマルチスレッドで動作させる。

## はじめに
　最近、自分で建てているサーバが発展してきてSpigotでは重たくなってきたためネットでMCserverのマルチスレッドについて調べてみたら、PaperMCの派生として「__Folia__」があったのでこちらのインストールの仕方について説明します。

:::note warn
2023/12/26　
現在この記事に記したコマンドで、1.20.2のバージョンをダウンロードできます。
:::
## Foliaとは
　Folia groups nearby loaded chunks to form an "independent region.と公式サイトに説明されています。要するに、いくつかのチャンクを１つのグループにしてそのたくさんのグループを並列で処理することでマルチスレッドでの処理を実現してるということらしいです。また、Foliaは200~300人以上の大規模サーバで効果を発揮するそうです。もちろん少人数でも効果はあります。また、開発されているバージョンは1.19.4からです。__1.19.4未満のバージョンは開発されていないです。__

https://paper-chan.moe/


### 余談　
 バニラサーバやSpigotサーバの処理は主にシングルスレッドで処理しているため、サーバの動作を良好にするにはCPUの動作周波数が重要となってきます。なのでXeonなどコア数をたくさん積んでいるCPUでは1コアあたりの動作周波数が低いのでコアがたくさんあってもサーバに負荷がかかると、どうしても重たくなってしまいます。
## FoliaとSpigotの性能の違い
同じ動作状況・負荷の環境で計測した結果です。

１枚目の画像がFolia
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3325330/a7b32575-d64b-25b8-74cb-ef58519535fc.png)
２枚目の画像はSpigot
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3325330/d127a5f4-904b-031b-235b-6f39c31286de.png)
MSPTを見ると、**３倍**の差がありFoliaでは負荷が分散されています。
タスクマネージャーでCPUの使用状況をみるとしっかりと、すべてのコアで処理が分散されていることが確認できます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3325330/79b30d82-0eef-b760-a6c4-7aab3d65c959.png)


## テスト動作環境
- Windows11 pro ※Linuxでも動作します。
- mem:80G and 128GB
- CPU:Xeon E5-2637v3 *2 and Xeon E5-2690v4 *2
- git for windows 　**重要！**
gitをインストールしていない方は下記のURLからダウンロードしてください。

https://gitforwindows.org/
## Foliaのダウンロード
- まず適当にフォルダを作成します。
- 次に作成したフォルダを開き、右クリックを押し、ターミナルで開くを選択します。
　![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3325330/79fcdb91-0124-db48-bc53-6c4e9f6fe1aa.png)
- ターミナルで下記のコードを実行します。
  ```
   git clone https://github.com/PaperMC/Folia.git
  ```
    　　これを実行することでFoliaをダウンロードします。
　　![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3325330/b3dd98c0-8363-070a-f084-57fc7ee17cc7.png)
- Foliaのダウンロードが終わったら、ダウンロードしたフォルダに移動します。
  ```
   cd Folia
  ```
- 次に、パッチを適用します。
  ```
  ./gradlew applyPatches
  ```
  ※エラーが出たらこれを実行。
   ```
   gradlew.bat applyPatches
   ```
　　　![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3325330/3bfce263-f578-25f0-6f86-440a2b706428.png)
   ## ※初めてgitを使う人は以下のようなエラーが出る場合があります。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3325330/ab12e3c4-77ac-f106-7d29-102a7aad5e6e.png)

   - githubのアカウントを作成します。
       
https://github.com/

   - 次にgithubのアカウントをコマンドで登録します。
        ```
         git config --global user.email "you@example.com(登録したメールアドレス)" 
        ```
        ```
         git config --global user.name "Your Name(アカウント名)"
        ```
   - 登録が完了したら、もう一度パッチを適用してください。
 _____________________________________________________________________________________________

- パッチの適用が完了したらサーバを起動するjarファイルを作成します。
  ```
  ./gradlew createReobfBundlerJar
  ```
- jarファイルの作成が完了したら、下記のパスにフォルダが生成されます。
  ```
  ~\Folia\build\libs\folia-bundler-1.19.4-R0.1-SNAPSHOT-reobf.jar
  ```
- jarファイルを適当なフォルダに移動します。
　例えば、デスクトップにserverというフォルダを作り、そこにjarファイルを移動させます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3325330/49c611f8-0033-bfcd-3a0b-b18853fa5e7b.png)

- 移動した先でjarファイルを実行します。
- 実行するとフォルダとファイルが生成されます。そこで**eula.txt**というファイルを開き**eula=False**を**eula=True**に変えます。
   ![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3325330/c9889e8d-e886-d176-10f0-c6b4989758f1.png)

- 次にサーバを起動するbatファイルを作成します。***server.txt***というファイルを作成します。txtファイルに下記のコマンドを書き込み保存します。
  ![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3325330/94b93fae-8df5-871d-d5b6-9f8b9d923cf8.png)

 ```
  java -Xmx4096M -XX:+UnlockExperimentalVMOptions -XX:+UnlockDiagnosticVMOptions -XX:+AlwaysPreTouch -XX:+DisableExplicitGC -XX:+UseNUMA -XX:NmethodSweepActivity=1 -XX:ReservedCodeCacheSize=400M -XX:NonNMethodCodeHeapSize=12M -XX:ProfiledCodeHeapSize=194M -XX:NonProfiledCodeHeapSize=194M -XX:-DontCompileHugeMethods -XX:MaxNodeLimit=240000 -XX:NodeLimitFudgeFactor=8000 -XX:+UseVectorCmov -XX:+PerfDisableSharedMem -XX:+UseFastUnorderedTimeStamps -XX:+UseCriticalJavaThreadPriority -XX:ThreadPriorityPolicy=1 -XX:AllocatePrefetchStyle=3 -XX:MaxGCPauseMillis=130 -XX:+UnlockExperimentalVMOptions -XX:+DisableExplicitGC -XX:+AlwaysPreTouch -XX:G1NewSizePercent=28 -XX:G1HeapRegionSize=16M -XX:G1ReservePercent=20 -XX:G1MixedGCCountTarget=3 -XX:InitiatingHeapOccupancyPercent=10 -XX:G1MixedGCLiveThresholdPercent=90 -XX:G1RSetUpdatingPauseTimePercent=0 -XX:SurvivorRatio=32 -XX:MaxTenuringThreshold=1 -XX:G1SATBBufferEnqueueingThresholdPercent=30 -XX:G1ConcMarkStepDurationMillis=5 -XX:G1ConcRSHotCardLimit=16 -XX:G1ConcRefinementServiceIntervalMillis=150 -XX:+UseTransparentHugePages -jar folia-bundler-1.19.4-R0.1-SNAPSHOT-reobf.jar nogui
```
 ***※使用しているOSによっては、-XX:+UseTransparentHugePagesが使えないので各自で削除してください。(<INS>Windowsの場合は消す</INS>）
　　また、各自サーバに割り当てるメモリを変更してください。***
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3325330/ed71e4f3-403a-1cbf-a8c3-8c30d0b081ff.png)

- server.txtをserver.batに変更します。
　![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3325330/57220827-8855-1fd8-990c-b9e588d0c307.png)　![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3325330/66f0a3c9-60b7-2f2a-4b59-0f7ad55444d8.png)　

 ※ファイルの名前に拡張子が表示されていない場合は下の画像のようにチェックをつけてください。
　　![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3325330/b092aea2-e876-0867-ee1c-c71281783bac.png)
　　![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3325330/55378ad8-0573-dc03-d169-aa033bc457a8.png)
- 作成したbatファイルを開いてください。
　※ここでコマンドプロンプトがすぐに落ちてしまう場合は、batファイルの中身に記入されている、***-XX:+UseTransparentHugePages***を削除してください。

これでサーバ起動の方法についての説明は以上です。
## プラグインについて。
現状Foilaでは、PaperMCやSpigotMCで使用されるプラグインについては、プラグインの開発者がマルチスレッドに対応させなければFoilaでは使えないためほとんどのプラグインが使用できません。海外の方が現状で使えるプラグインをまとめているテキストがあったためそちらを参照してください。

https://github.com/BlockhostOfficial/folia-plugins

## おすすめのプラグイン
- ViaVersion（サーバーのバージョンと異なる人も入れるようになる） https://www.spigotmc.org/resources/viaversion.19254/
- Viabackwards(上のとほぼ同じ） https://www.spigotmc.org/resources/viabackwards.27448/
- BlueMap (Web上でマップを見れる）https://github.com/BlueMap-Minecraft/BlueMap/releases
- chunky (事前にマップをロードできる）https://www.spigotmc.org/resources/chunky.81534/
- invsee (誰がどのアイテムを取ったかわかる)　https://www.spigotmc.org/resources/invsee.82342/
- geyser (統合版からも入れるようになる)　https://geysermc.org/download
 
## 参考文献
以下のサイトを参考に作成しました。

https://paper-chan.moe/

https://github.com/PaperMC/Folia