- Сообщения
- 113
- Реакции
- 99
- Баллы
- 425
- Возраст
- 45
- Имя
- Александр
- За 10 дней
- 0 часов
Я недавно играю на этом сервере, и вижу, что сервер хороший, сообщество приятное, только иногда все страдают от нехватки производительности. Лаги, просадка ТПС и прочие спецэффекты, которые уже можно отнести к разряду погодных явлений в мире Гамма. И я решил попробовать провести небольшое исследование на эту тему. Мне, как инженеру, всегда было интересно, как приложение утилизирует эти гигагерцы и гигабайты памяти. Учитывая, что у нас в кровавом энтерпрайзе приложения на Java - довольно частое явление, я подумал, что возможно, мой опыт их эксплуатации немного поможет в этом. Единственное, что я никогда не запускал сервер Minecraft, но это было легко исправить.
До того, как я начал его запускать, у меня был какой-то набор иллюзий по поводу его масштабируемости. В голове рисовалась стройная картина серверного приложения, которе можно распараллелить на n инстансов (возможно, даже в контейнерах), каждый из которых будет обслуживать к примеру 1-10 пользователей, и работать с одним хранилищем мира, которое, к примеру, находится в базе данных. Однако, реальность оказалась несколько более прозаичной. После того, как я поднял сервер PaperMC, я обнаружил, что он хранит данные мира в файлах. И я не знаю, могут ли несколько инстансов сервера работать с ними, не мешая друг другу. Нужно читать документацию и изучать передовой опыт (работают же как-то сервера на 1000+ пользователей? или такого не бывает?)
За рамками данного исследования осталось - как PaperMC распараллеливает треды по процессорным ядрам. Так или иначе, мне показалось, что единственный разумный способ как-то распилить этот монолит на части - сделать так, чтобы каждый мир обрабатывался отдельным сервером (желательно, на отдельной железке).
И наконец, немного поэкспериментировав с сервером на хостинге, я понял, что не знаю, как собирать с него метрики производительности. Локально, если бы у меня была возможность, я бы собирал метрики через JMX при помощи Telegraf, отправлял в InfluxDB, и просматривал в Grafana (в общем, всё как на любимой работе). Однако на этом хостинге я не могу запускать на сервере каких-то дополнительных приложений. И поиском я случайно нашёл плагин для сервера - Minecraft Prometheus Exporter (линк на github), который позволяет собирать метрики в Prometheus, и затем просматривать их в красивом виде в той же Grafana. Единственное, что я никогда не видел Prometheus, и для него понадобится отдельный сервер. Но это не преграды для инженера.
Для этого эксперимента я создал виртуальную машину в одном облаке. Установил на ней Prometheus и Grafana, немного повозился - и в результате сервер подключился к плагину Prometheus Exporter на сервере Minecraft, и собирает оттуда метрики по использованию памяти, tps, количеству мобов, загруженных чанков и т.д.
В Grafana, после импорта Dashboard от разработчика плагина, это выглядит так:
Выглядит достаточно неплохо - серверу выделен 1 Гб памяти, играет на нём 1 человек, и как-то всё это на нём помещается.
Интересно, как бы это выглядело на боевом сервере, и можно ли из этого извлечь какую-то пользу в плане понимания, чем он тормозит в данный конкретный момент времени.
До того, как я начал его запускать, у меня был какой-то набор иллюзий по поводу его масштабируемости. В голове рисовалась стройная картина серверного приложения, которе можно распараллелить на n инстансов (возможно, даже в контейнерах), каждый из которых будет обслуживать к примеру 1-10 пользователей, и работать с одним хранилищем мира, которое, к примеру, находится в базе данных. Однако, реальность оказалась несколько более прозаичной. После того, как я поднял сервер PaperMC, я обнаружил, что он хранит данные мира в файлах. И я не знаю, могут ли несколько инстансов сервера работать с ними, не мешая друг другу. Нужно читать документацию и изучать передовой опыт (работают же как-то сервера на 1000+ пользователей? или такого не бывает?)
За рамками данного исследования осталось - как PaperMC распараллеливает треды по процессорным ядрам. Так или иначе, мне показалось, что единственный разумный способ как-то распилить этот монолит на части - сделать так, чтобы каждый мир обрабатывался отдельным сервером (желательно, на отдельной железке).
И наконец, немного поэкспериментировав с сервером на хостинге, я понял, что не знаю, как собирать с него метрики производительности. Локально, если бы у меня была возможность, я бы собирал метрики через JMX при помощи Telegraf, отправлял в InfluxDB, и просматривал в Grafana (в общем, всё как на любимой работе). Однако на этом хостинге я не могу запускать на сервере каких-то дополнительных приложений. И поиском я случайно нашёл плагин для сервера - Minecraft Prometheus Exporter (линк на github), который позволяет собирать метрики в Prometheus, и затем просматривать их в красивом виде в той же Grafana. Единственное, что я никогда не видел Prometheus, и для него понадобится отдельный сервер. Но это не преграды для инженера.
Для этого эксперимента я создал виртуальную машину в одном облаке. Установил на ней Prometheus и Grafana, немного повозился - и в результате сервер подключился к плагину Prometheus Exporter на сервере Minecraft, и собирает оттуда метрики по использованию памяти, tps, количеству мобов, загруженных чанков и т.д.
В Grafana, после импорта Dashboard от разработчика плагина, это выглядит так:
Выглядит достаточно неплохо - серверу выделен 1 Гб памяти, играет на нём 1 человек, и как-то всё это на нём помещается.
Интересно, как бы это выглядело на боевом сервере, и можно ли из этого извлечь какую-то пользу в плане понимания, чем он тормозит в данный конкретный момент времени.