Dwarf Fortress — легендарная игра, детально симулирующая фэнтезийный мир, а игрок (в одном из режимов) может строить и управлять поселением (крепостью) гномов (дворфов). Про игру написано достаточно, поэтому я не буду вдаваться в подробности. Важно, что из-за большого размера игрового мира и высокой детализации симуляции, игра довольно требовательна к ресурсам — как процессору, так и памяти/кэшу. Игра поддерживает все три основные операционные системы.

Для игры существует проект DFHack, занимающийся реверс-инжинирингом структур данных игры и позволяющий создавать плагины и скрипты на C++, Lua или Ruby.

Я же являюсь автором приложения и сопутствующего серверного кода, полностью реализующего пользовательский интерфейс игры на устройствах под управлением iOS. То есть пользователь ставит оригинальную игру, плагин и приложение, и может играть удалённо с мобильного устройства со всеми удобствами.

Сервер можно установить как у себя дома, так и арендовать у одного из облачных провайдеров. Так и родилась идея этого исследования — во-первых, узнать, какой из облачных сервисов лучше подходит и может быть рекомендован пользователям в первую очередь, и во-вторых, собственно сравнить производительность серверов, используя что-то отличное от веб-серверов и специальных утилит.

Для тестирования была использована версия Dwarf Fortress / DFHack 0.43.03-r1. У меня имеется публичный образ для Docker, включающий саму игру и минимальную версию DFHack (а так же собственно серверный код для удаленной игры, но в данном случае он не используется). Был написан скрипт на Lua, запускающий тесты и отсылающий результаты на веб-сервер. Также для автоматизации был использован следующий скрипт, указываемый в user-data при конфигурации серверов. То есть требовалось просто создать сервер, подождать, пока придут результаты и удалить его.

#!/bin/bash
fallocate -l 4G /swp ; chmod 600 /swp ; mkswap /swp ; swapon /swp ; echo '/swp none swap sw 0 0' >>/etc/fstab
apt-get update
apt-get install -fy docker.io
apt install unzip
wget https://github.com/mifki/dfremote-cloud-benchmark/raw/master/benchmark.lua
wget http://mifki.com/a/t/gloveloved.zip
unzip gloveloved.zip -d save/
docker run --name=df -dt -v $PWD/save:/df_linux/data/save -v $PWD/benchmark.lua:/df_linux/hack/scripts/benchmark.lua mifki/dfremote
sleep 5
docker exec df /df_linux/dfhack-run benchmark server_name

Тестировались следующие провайдеры: Digital Ocean, Amazon Lightsail, Amazon EC2, Vultr, Linode, Google Compute Engine, и Macbook Pro Late 2013 2Ghz Core i7.

Если облачный сервис поддерживает создание сервера с Docker в один клик, то использовалась эта возможность, если нет — то выбиралась версия Ubuntu 16.04. Таким образом, только у Vultr была использована не Ubuntu, а CentOS 7. Для серверов с больше, чем 2гб памяти, своп-файл не использовался. Для Google Compute Engine micro и small выбирался SSD диск.

Были выбраны наиболее дешевые варианты серверов, во-первых, потому что они более интересны тем, кто собирается использовать их для игры, а во-вторых, потому что Dwarf Fortress всё равно использует для симуляции только одно ядро процессора и (в указанной версии) является 32-битным приложением.

Тесты


Процесс игры в Dwarf Fortress состоит из двух частей — генерации мира и начальной истории, при которой можно указать размер мира и длину истории (и другие параметры), и собственно игрового процесса. Последовательно, без перезапуска игры, выполнялись следующие тесты:

  1. Генерация мира очень маленького (smaller) размера с очень длинной (very long) историей.
  2. Генерация мира большого (large) размера с короткой (short) историей.
  3. Игровой процесс. Использовался один из “групповых” (когда много человек играют по очереди) сэйвов — glovedloved (Anethadefini, 254). Выбор не так важен, покуда в нем достаточно большая крепость, и ничего, что бы автоматически остановило игру, не происходит за время теста, который длился 20 внутриигровых дней.

Последний тест наиболее важен, во-первых, потому что это собственно игровой процесс, ради которого всё и происходит, а во-вторых, он менее подвержен влиянию случайностей, чем генерация мира (при которой случайным образом генерируются цивилизации, поселения, ландшафт, события и так далее).

Результаты


Вот график. Время выполнения в секундах, соответственно, меньше — лучше. Цены за месяц в долларах США.

image

Сразу виден неестественный разброс в результатах первого теста, не знаю точно, с чем это связано. Полагаю, отчасти с кэшированием, отчасти с низкой производительностью только что созданного сервера по каким-то причинам. Поэтому результаты отсортированы по последнему тесту, который, как отмечалось, наиболее важный. Второй тест тоже в целом соотносится с результатами третьего.

Не считая ожидаемого первого места у сервера EC2 c4.large, относящегося к оптимизированному для производительности типу C4, Amazon Lightsail оказался быстрее всех, что, учитывая цену, довольно приятная неожиданность. За ним практически с таким же результатом следует однопроцессорный сервер от Google и ноутбук. Далее хорош оказался до этого мне неизвестный Vultr, Linode, от которого я ожидал большего. Приз зрительских симпатий получает Digital Ocean — медленнее, но наиболее простой и быстрый в использовании. Довольно дорогие сервера EC2 m3.medium на удивление медленные, а самые дешевые сервера GCE совсем плохие даже с SSD дисками, результата тестирования сервера размера micro я не дождался.

Отдельно надо сказать о EC2 инстансах типа T2. Их особенностью является то, что при простое сервер получает процессорные кредиты (до определенного лимита), которые расходуются под нагрузкой. Расходуя кредиты, сервер работает с полной производительностью, когда они заканчиваются — производительность падает до 20%. С одной стороны, это очень хорошо подходит для наших целей — люди, особенно с мобильного устройства, не играют непрерывно весь день, плюс симуляция в игре останавливается, когда человек что-то делает в меню и т.п., поэтому это хороший вариант получить высокую производительность за небольшие деньги. С другой стороны, это “ненастоящая” производительность, поэтому я не включил инстансы этого типа в тестирование, дабы никого не путать. По опыту, пока есть кредиты, они довольно быстрые, когда они кончаются — очень медленные.

На этом всё.
Поделиться с друзьями
-->

Комментарии (10)


  1. T-362
    10.02.2017 14:02
    +3

    >(крепостью) гномов
    Дворфов!

    Как говорится — «я джва года жду такую игру». DFAAS, еще бы с автором договориться и развернуться пошире…

    А теперь куча вопросов —

    • Tаилсеты поддерживает?
    • Как идет передача данных в приложение — стандартным терминальным образом или что-то свое?
    • Будет ли приложение для нормальных остальных платформ (винда, андроид, линуксы)?
    • Можно добавить к графикам средние FPS за 20 дней (кто не знает в DF кадры в секунду работают так-же и игровой скоростью)?
    • А умеет работать «фоново» — без включенного приложения (и пуш уведомления при паузах)?
    • Будет ли какая-то поддержка синхронизации сейвов (дропбокс, гит)?
    • Можно ссылочку в личку с образом и/или гитхабом?


    1. pronvit
      11.02.2017 01:12

      Автор не против, проблема в «as a service» в том, что игра требовательная и по сути каждому игроку надо ядро процессора, что получается для них дороговато. Но я работаю в этом направлении.

      > Tаилсеты поддерживает?

      Поддерживает.

      > Как идет передача данных в приложение — стандартным терминальным образом или что-то свое?

      Нет, конечно, свой сервер.

      > Будет ли приложение для нормальных остальных платформ (винда, андроид, линуксы)?

      Я об этом думал, конечно, но для этого надо переписать на что-то кроссплатформенное, я честно пробовал, но мне ничего не понравилось. Поэтому пока сосредоточился на том, что умею лучше всего.

      > Можно добавить к графикам средние FPS за 20 дней (кто не знает в DF кадры в секунду работают так-же и игровой скоростью)?

      Ну это надо было постоянно мониторить FPS на протяжении теста, я этого не делал.

      > А умеет работать «фоново» — без включенного приложения (и пуш уведомления при паузах)?

      Это планируется в будущем, с настройкой, при каких событиях останавливать игру и уведомлять.

      > Будет ли какая-то поддержка синхронизации сейвов (дропбокс, гит)?

      Планируется. Большинство людей все же пока играют, подключаясь к домашним компьютерам, поэтому это не так критично.

      >Можно ссылочку в личку с образом и/или гитхабом?

      Dwarf Fortress Remote в гугле.


  1. arandomic
    10.02.2017 14:04
    +1

    Интереснее было бы послушать про детали реализации клиент-серверного взаимодействия.
    Я так понимаю, в разгар игрового процесса, в крепости происходит множество событий, которые необходимо доносить игроку — и перемещения юнитов и изменение уровня воды в каждой клетке, итп.

    Вы передаете только данные которые можно непосредственно отобразить в текущем view клиента? (грубо говоря только один «слой» земли)

    А не хотите выложить спецификацию серверного API? — нашлись бы желающие сделать Android-клиента.

    (UPD) Нашел припрятанную в скрипте развертывания ссылку на гитхаб — спасибо — поизучаем)


    1. T-362
      10.02.2017 14:29

      О, спасибо за наводку на ссылку, а слона то я и не приметил.

      Скрины приложения кстати впечатляющи, и таилсеты есть, и главное — человеческое меню, тут одно только описание создания своего интерфейса вместо стандартного ужаса достойно отдельной статьи.


    1. pronvit
      11.02.2017 01:18

      > Интереснее было бы послушать про детали реализации клиент-серверного взаимодействия.

      Я могу много чего рассказать и про этот проект и про другие мои проекты, связанные с DF, но такой пиар из песочницы не пропустили бы, поэтому подошел со стороны:)

      > Вы передаете только данные которые можно непосредственно отобразить в текущем view клиента? (грубо говоря только один «слой» земли)

      Да, на сервере происходит стандартный рендеринг текущего view клиента и передаются измененные тайлы. Ну как «стандартный», по меньше мере рендерится несколько уровней (знаете про плагин TWBT?).

      > А не хотите выложить спецификацию серверного API? — нашлись бы желающие сделать Android-клиента.

      Код сервера открыт, там все понятно в плане API — просто набор команд для всяких разных действий игрока во всех меню. Ну и про сам протокол я желающим расскажу.


      1. T-362
        13.02.2017 14:06

        ИМХО хорошо получилось. Вы и дальше попробуйте со стороны, более технически, типа «Перехват управления и реализация протокола для удаленного доступа к %игранейм%», с примерами разбора кода, работы с АПИ, использования дебаггеров и блок-схемами логики.

        Кстати как универсальная, хоть и жестокая, идея — реализовать клиент на вебе и запихнуть в электрон какойнить, так будет весьма кросплатформенно, хотя и бессердечно, но все-таки менее ресурсоемко чем ДФ (или QT с тем-же SDL для рендеринга тайлов).


  1. mindcaster
    10.02.2017 17:17
    -1

    Вы проделали огромную работу, но я предвижу что ряд людей типа меня будут опечалены тем, что это только под IOS. Да что греха таить, тут даже не по удаленке а на том же самом компе нормальный интерфейс я, например, был бы счастлив получить. Вы будете как-то расширяться?

    (некоторое время не играл в ДФ, возможно уже появились нормальные интерфейсы для этой замечательной во всех остальных отношениях игры, но пока что это лучшее и самое удобное из того что я видел)


    1. pronvit
      11.02.2017 01:24

      Я выше ответил, что сам пока сосредоточился на iOS. Что касается десктопа, то я из людей, которым нравится стандартный интерфейс. Да, чтобы он был юзабельным, мне пришлось создать плагин TWBT, иначе б и сам не стал играть, наверное. Но после этого и при наличии других улучшающих интерфейс плагинов (для поиска в списках и т.п.) я его не променяю на «интерфейс с мышкой».


      1. mindcaster
        11.02.2017 13:19

        Про TWBT не слышал, спасибо

        Меня в стандартном убивает отсутствие логики в хоткеях. В одном списке хоткей значит одно, в другом другое, арргх. Но тут, видимо, уже не сделать ничего.


        1. pronvit
          11.02.2017 13:23

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