Продолжая серию статей что-то против чего-то, мы наконец рассмотрим что-то полезное, а именно сервер Minecraft. Рассмотрим какая операционная система и какая ява все же лучше для того, чтобы хостить лучшую игру человечества. Для сравнения взяты Ubuntu 18.04 LTS и Server Core 2019. На Ubuntu был установлен OpenJDK, а на Windows — Oracle Java и AdoptOpenJDK.

Как и на всех остальных сравнительных тестах, у виртуальных машин не было соседей, на хосте всегда была запущена только одна ВМ.

Серверы запускались с аргументами:

-Xmx8G -server

На Windows Server Core был удален компонент Windows Defender, как в нашем образе с Windows VDS за 99 рублей. Для сравнения, вот что вы теряете, когда оставляете его включенным. 



Для каждого из дистрибутивов Java были установлены последние публично доступные версии, а именно:

Oracle: «1.8.0_241»
AdoptOpenJDK: «1.8.0_242»
OpenJDK: «1.8.0_232»

Раунд №1, генерация мира


В этом тесте генерируем мир. В качестве генератора выступал Geographicraft с установленным Biomes’O’Plenty, Dynamic Trees, PVG, worley caves, IC и BC.

Мир отнюдь не классический и генерируется заметно медленнее обычного. 

Мир размером в 2704 чанков был отгенерирован:


Windows c AdoptOpenJDK отрывается от своих конкурентов на 5 секунд.

Раунд №2, старт сервера


Замер проходил в три прохода для каждой виртуальной машины. Каждый раз каждый из серверов завершал загрузку мира секунда в секунду по сравнению с прошлым результатом.


OpenJDK на Windows что и OpenJDK на Linux показывают одинаковые результаты.

Раунд №3, занимаемая память


Процесс начинает потреблять тем больше памяти, чем больше установлено на нем ядер. Ниже приведена таблица занимаемой памяти процесса пустого сервера без загруженного на нем мира.


Oracle JRE потребляла в среднем на 80-100 мегабайт больше на четном количестве ядер. Тоже самое касалось и AdoptOpenJDK, только на нечетном количестве ядер.

Linux не показывал такой странности.

Раунд №4, 32 курицы в коробке 2 на 2



Сцена представляет из себя расчет коллизии 32 куриц в коробке 2 на 2. Сцена была подготовлена заранее и один и тот же мир был раскидан по серверам, чтобы все было честно.

Для этого теста было установлено одно ядро, а процессу выставлялся приоритет реального времени.


Рабочий набор OpenJDK в этой сцене был на 40 мегабайт больше чем у соперников.


Среднее потребление процесора у Oracle и AdoptOpenJDK одинаковое, но мусор Oracle при всех равных собирает чаще и интенсивнее, что чаще приводит ко всплескам процессорной активности.

Чтобы экстраполировать какое количество подобных сцен мы сможем обработать, давайте просто увеличим тикрейт сервера.


В тесте с повышенной нагрузкой Ubuntu c OpenJDK сравнялся с Windows c AdoptOpenJDk, а Oracle догоняет.


Под более высокой нагрузкой OpenJDK на Windows дал лучшие результаты, чем на Ubuntu.

Сервер OpenJDK на Ubuntu постоянно статерил и сцена замирала. Чуть хуже был Windows на этом же OpenJDK. Oracle же справился лучше всех, с наименьшим количеством подвисаний.


Среди прочих, Oracle SE уложился в тот же объем ОЗУ что и OpenJDK.

Раунд №5, 64*64 чанка и Dynamic trees



Эта сцена содержит в себе лес и несколько десятков мобов. Километры деревьев постоянно растут и обновляют положения своих блоков.

Каждое дерево это отдельный тайл, но изначально имеют пониженный тикрейт, тикая лишь 1 раз в 20 игровых тиков. Ниже приведен график утилизации процессора на тикрейт сервера.


Ubuntu + OpenJDK и Windows Server с Oracle на борту не смогли запустить сервер в ранее обговоренными аргументами, поэтому в график не попали.

Чтобы все же запусить сервер, пришлось изменить флаги на:

-Xms4g -Xmx8G -server -XX:+UseCompressedOops -XX:+AggressiveOpts

Все три экземпляра по началу упирались в 100% процессора, но только Windows Server + AdoptOpenJDK не уронил сервер. После сбора мусора все нормализовалось до графика ниже.


При переходе от тикрейта в 60 до 70, на Ubuntu график загрузки процессора стал вести себя как синусоида, из-за чего среднее значение утилизации ЦП внезапно начало падать от роста сложности задачи. Из-за этого график пришлось остановить там, где он есть сейчас.

Вероятно, дело в отличиях планировщика Linux’a и Windows.

Выводы:

Несмотря на объективную разницу в ОС и дистрибутивах JRE невозможно дать конкретную рекомендацию, которая объективно лучше для того, чтобы держать на нем сервер.

В данном случае, наверное, стоит выбирать ту операционную систему, с которой вы лучше знакомы.