In the latest gamer news, everyone is freaking out about Valve allowing mod developers charge. It’s amazing how quickly it’s fragmented the community in what was at 2 days before a Valve/GabeN worshiping reddit. (here/here/here/here and a rebuttal)
In the middle of all of this I saw this comment in passing:
So yeah, I never followed the whole Minecraft community thing, but apparently people were hosting servers, then asking users to pay for using mods, and even for using basic items. And since most people who love Minecraft out there are kids, they were paying with their parents credit cards all over the place for server time, and server mods and whatnot, the parents would find out, and them blame Mojang over the entire thing. So they banned paying servers (at least from what I understood).
So out of curiosity, since I’ve only really played single player, I thought I’d see how hard it is to run a Minecraft server.
First, I’m going to create a Debian 7 VM on my ESXi server. Nothing too fancy, I have an 8 core box with 8GB of ram, so I was thinking 2 vCPU’s and 384MB of ram, and a 4GB disk. I mean it’s a simple game, how much can it need, right?
Turns out, it wants a LOT more.
So the install of the OS went pretty smooth, then I have to install Java, which is pretty simple:
apt-get install default-jdk
With that done, the next thing to do is download the server jar file from the download site, or for the purpose of my test, I’m using version 1.8.4.
When I went to run it however, I saw the recommended flags:
java -Xmx1024M -Xms1024M -jar minecraft_server.jar nogui
Ouch. Yes this thing does expect 1GB of ram. Ok, so I have to RAM and CPU to spare, so I went ahead and gave it 2GB (since I installed the x86 version of Debian..) and 4 vCPUs.
The next thing for me to do was to set it up on the internet, since I’m not in the office. I have a VM out on the internet, with an OpenVPN back to my ESXi box for my email. So without trashing my nat I could get xinetd do the dirty work with this simple entry:
root@VPS:/etc/xinetd.d# cat minecraft service minecraft { disable = no type = UNLISTED socket_type = stream protocol = tcp user = nobody wait = no redirect = 192.168.1.139 25565 port = 25565 }
Then restart xinetd like this:
/etc/init.d/xinetd restart
Now with Minecraft running on my ESXi server, and my VPS now configured to forward traffic to the ESXi box over the OpenVPN connection I was all set to go!
And I was able to connect, and all was ‘good’. But then checking the server…
545Mb of RAM! And this is with one user! And look @ the CPU. Wow no kidding!
And then I noticed something else, the email performance went from OK to horrible. I spent a lot of time playing with MTU’s receive and send buffers, and other ‘magic’ trying to get something working. Since my ESXi server doesn’t have a direct internet connection (yuck) I’m in a shared office so it’s not only behind NAT, but I have a DLINK that I use behind their NAT. And while the UDP protocol ‘works’, changing it to TCP gave me a 5x speed increase.
Very unexpected.
And not to forget, some helpful stuff for the server:
How do you shut down safely, from the console?
stop
What is the best way to run the server?
Probably behind screen. I started it from /etc/rc.local like this:
/usr/bin/screen -dmS minecraft /usr/local/minecraft/start.sh
start.sh is simply:
#!/bin/sh cd /usr/local/minecraft/ java -Xmx1024M -Xms1024M -jar minecraft_server.jar nogui
How do I connect to the console?
screen -r minecraft
Remember in this case we gave the screen session a name so it’s easy to find.
How do I disconnect from the console
CONTROL+A+D
Why am I doing this?
I have no idea why. Honestly, I find crafting in a game kind of tedious, but setting up a VPN, server and whatnot is more fun to me.
How about network performance? Since it’s just me, I thought I should look inside the tunnel for a minute and see how big the capture file is:
# tcpdump -s 1520 -w 1.cap -n -i tun0 port 25565 & sleep 60;kill %1
This will run tcpdump for a minute on the default minecraft port, then after 60 seconds end the capture.
# ls -alh *.cap -rw-r--r-- 1 root root 1.6M Apr 26 16:00 1.cap
Wow that was bigger than I thought. No wonder Minecraft people are always crying about latency! That translates to 213,33 Kbps or 0.21 Mbps.
Can it be compressed?
# gzip 1.cap # ls -alh *.cap.gz -rw-r--r-- 1 root root 680K Apr 26 16:00 1.cap.gz
Which then translates into 91,11 Kbps or 0.09 Mbps. Why people don’t compress their network stuff is beyond me, but then again what do I know?
I guess the next step would be to combine this with stunnel, which not only can encrypt the traffic, but compress it as well.