Что мы знаем о танках

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

Игра про танки

Скриншот из World of Tanks, компании WARGAMING.

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

О появлении танков в играх


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

Игра танки онлайн

Скриншот из World of Tanks, компании WARGAMING.

После шутеров, появились стратегии, в том числе и у русскоязычных разработчиков. Примечательно, что танками в онлайн играх называют персонажей, с хорошо прокаченными навыками защиты и способных выдерживать многочисленные атаками монстров и реальных соперников. Игры танки для мальчиков — это море драйва и адреналина получаемого от управление огромной бронированной машиной!  Давайте вспомним самые известные и популярные игры, где присутствуют данный юнит исключая, разумеется, стратегии.


Серия ГТА

Гта — три этих буквы известны каждому мальчику и представителю молодого поколения, многим представителям которого еще не исполнилось 30 лет. Ведь ГТА является самым известным симулятором реального мира, позволяющим кататься на машинах, лодках и летательных аппаратах, покупать дома и сражаться с полицией. Впервые, танк появился в четвертой части серии, под названием Grand Theft Auto Vice City, где он вызывался с помощью легко запоминающегося кода, который до сих пор остался в память многих мальчиков — «panzer», или иногда приезжал при максимальном заполнении индикатора преступности. В дальнейшем, данный юнит можно было найти практически в любой части серии, однако без кода сделать это было достаточно трудно.

Call of Duty

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

Battlefield

Еще одна знаменитая военная серия, однако здесь имеется очень реалистичный и интересный сетевой режим. Если вы хотите поиграть в танки, то здесь, сделать это будет очень легко. Причем помимо них, для управления будет доступно еще много другой военной техники. Управление, само по себе, очень похоже на Call of Duty, однако в последней версии Battlefield 3 и графика и геймплей будут заметно превосходить предыдущую.


World of Tanks

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

gamelayer.ru

1. Вкратце об инструменте Яндекс.Танк

Некоторые полезные ссылки:

  1. Код проекта на GitHub:
    https://github.com/yandex-load/yandex-tank
  2. Официальная документация по настройке и использованию инструмента:
    http://yandextank.readthedocs.org/en/latest/
  3. Информация о модулях Яндекс.Танка в wiki разработчиков:
    https://github.com/yandex-load/yandex-tank/wiki/%D0%9C%D0%BE%D0%B4%D1%83%D0%BB%D0%B8
  4. Презентация, в которой рассказывается об истории возникновения инструмента:
    http://tech.yandex.ru/events/yasubbotnik/msk-jul-2012/talks/296/
  5. История возникновения сервиса нагрузочного тестирования в Яндексе и разработка Яндекс.Танка:
    http://habrahabr.ru/company/yandex/blog/202020/
  6. Яндекс-клуб, посвященный вопросам использования инструмента:
    http://clubs.ya.ru/yandex-tank/

Функциональные особенности Яндекс.Танка:


2. Настройка и стандартные режимы работы Яндекс.Танка

Задание профилей нагрузки через стандартный файл с настройками load.ini

[phantom] address=example.com:80 ; Target's address and port rps_schedule=const(65000,2m) ; load scheme header_http = 1.1 headers = [Host: example.com] [Connection: close] uris = /test [web] port = 80 ; interval = 1 ; manualstop = 1 ; 
  • используемый генератор нагрузки,
  • адрес нагружаемого веб-сервера и его порт,
  • используемая схема нагрузки.
  • хедеры http-пакета,
  • путь для GET-запроса (uris).

3. Подготовка собственных запросов для Яндекс.Танка

При создании патрона внутри файла load.ini вид запросов может следующий:

header_http = 1.1 headers = [Host: example-domain.ptsecurity.ru] [Connection: close] uris = /test /test1 /test2 

[Connection: close] [Host: example-domain.ptsecurity.ru] [Cookies: None] /?arg / /buy /buy/?rt=0&station_to=7&station_from=9 

[size_of_request] [tag]n [body_request] rn [size_of_request2] [tag]n [body_request2] rn 

Алгоритм подготовки запросов по формату Яндекс.Танка:

4. Дополнительная конфигурация Яндекс.Танка


Включение веб-монитора

Подключение агента Яндекс.Танка для измерения параметров на тестируемом сервере

Настройка параметров автостопа для тестов

Настройки логирования

5. Использование Яндекс.Танка для сравнения производительности двух аналогичных веб-сервисов

Схема тестовых стендов

Выявленные ограничения

Метрики и критерии сравнения

  • http_rps_out — значение http-rps отправляемое с Яндекс.Танка на веб-приложение,
  • http_rps_in — значение http-rps принимаемое на Яндекс.Танке со стороны веб-приложения,
  • http_request_size — размер http-запроса в байтах,
  • send_requests — количество отправленных http-запросов,
  • bs_out — bytes per seconds, байт в секунду — параметр определяет скорость отправки данных с Яндекс.Танка,
  • bs_in — значение bs отправляемое с веб-приложения в сторону Яндекс.Танка,
  • test_time — время теста в секундах,
  • response_time_med — среднее время в которое укладывается 90% всех ответов.

  1. За всё время теста значение параметра «время, в которое укладывается 90% ответов» у Второго веб-сервиса должно быть не больше, чем у Первого веб-сервиса.
  2. На отрезке возрастания нагрузки на очередные 1000 http-rps значение параметра «время, в которое укладывается 90% ответов» у Второго веб-сервиса должно быть не больше, чем у Первого веб-сервиса.
  3. За всё время теста общее количество правильно обработанных запросов у Второго веб-сервиса должно быть не меньше, чем у Первого веб-сервиса.

Тестовые http-запросы

GET /loadtest/index.php?id=1&login=user&pwd=password HTTP/1.1 X-Sniffer-Forwarded-For: yandex-tank-example-domain.ptsecurity.ru Host: backend-example-domain.ptsecurity.ru User-Agent: Mozilla/5.0 (compatible; Googlebot/2.1; +http://www.google.com/bot.html)   POST /loadtest/index.php HTTP/1.1 X-Sniffer-Forwarded-For: yandex-tank-example-domain.ptsecurity.ru Host: backend-example-domain.ptsecurity.ru User-Agent: Mozilla/5.0 (compatible; Googlebot/2.1; +http://www.google.com/bot.html) Content-Length: 32  id=1&login=user&pwd=password   POST /loadtest/index.php HTTP/1.1 X-Sniffer-Forwarded-For: yandex-tank-example-domain.ptsecurity.ru Content-Type: multipart/form-data; boundary=validFile Host: backend-example-domain.ptsecurity.ru User-Agent: Mozilla/5.0 (compatible; Googlebot/2.1; +http://www.google.com/bot.html) Content-Length: 150  --validFile Content-Disposition: form-data; name="login"; filename="validFile.txt" Content-Type: text/plain  Valid file content --validFile-- 


Сбор данных и анализ результатов

Результаты для Первого веб-сервиса

Результаты для Второго веб-сервиса

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

forworktests.blogspot.com

Яндекс танки

Иной раз и секундного взгляда на график времен отклика хватает, чтобы сказать: сервис не полетит. Еще пара секунд — и причина найдена: ядра процессора загружены неравномерно, слишком мало потоков запущено на сервере. Как создать удобную систему сбора и хранения результатов нагрузочных тестов? О том, какой опыт об этом мы накопили в Яндексе, сегодня мой рассказ.


Кстати, я буду рассказывать о Яндекс.Танке и Graphite на Тестовой Среде, регистрация на которую будет открыта ещё до 18:00 18 ноября. Там можно будет задать свои вопросы вживую.

Если вы читали статью doctornkz о том, как организовано нагрузочное тестирование в Яндексе, то знаете, что результаты стрельб у нас лежат в хранилище, которое умеет их показывать через веб-интерфейс. Называется оно Лунапарк. Это очень удобно — провести тест и отправить ссылку на него всем заинтересованным людям (да и самому увидеть все на одной страничке). Сервис представляет собой веб-приложение, которое заточено на внутренние процессы (там и геймификация, и провязка с другими внутренними ресурсами), выкладывать которое в открытый доступ мы не планируем. Поэтому я решил рассказать, как построить подобную систему, используя только open-source продукты.

Архитектура системы

Яндекс танки

Система автоматизации — это модуль, который управляет запуском тестов, позволяет их параметризовывать, выполнять дополнительные действия (скачать лог продакшн-сервера или поднять тестовую среду). Все это можно осуществить с помощью таких инструментов, как Jenkins, Maven, Rake. Об этом сегодня рассказывать не буду, это тема для отдельного большого поста.

Генератор нагрузки — это рабочая лошадка, модуль, который создает нагрузку на мишень (тестовый стенд). Рассказ будет о Яндекс.Танке — это модульная и расширяемая стрелялка, позволяющая использовать внутри разные генераторы, в частности, знакомый многим JMeter. Отмечу, что Танк — это open-source проект, опубликованный Яндексом в 2012 году. Он не для новичков, нужно быть на «привет, как дела?» с линуксом, а еще лучше уметь писать простые скрипты.


И наконец, хранилище результатов. Танк стреляет в сервис и замеряет времена отклика и другие параметры. Получаются временные ряды, которые необходимо где-то хранить, а потом отображать и анализировать. Мы будем использовать для этого Graphite.

Graphite — это высокопроизводительное и масштабируемое хранилище временных рядов, написанное на Python. Open-source. В него очень просто загружать данные (а еще для этого существует много разных способов на любой вкус) и потом их удобно крутить через Web-API (и для этого тоже есть куча фронтэндов). Подробно о том, как Graphite используется в Яндексе, о его архитектуре и производительности можно послушать тут.

Установка Яндекс.Танка

Если у вас Ubuntu — вы везунчик. Потому что вам всего-то нужно подключить репозиторий Танка и установить его также, как все другие пакеты — зависимости вытянутся сами (здесь и далее могут потребоваться права root — обеспечьте их):

# эти строки нужно добавить в sources.list: deb http://ppa.launchpad.net/yandex-load/main/ubuntu precise main deb-src http://ppa.launchpad.net/yandex-load/main/ubuntu precise main   

apt-get update && sudo apt-get install yandex-load-tank-base 

Если у вас не Ubuntu (я вот, например, хочу на MacOS попробовать), можете попробовать скачать .deb и сделать из него .rpm, но самый универсальный способ — это скачать исходники с github.

git clone https://github.com/yandex-load/yandex-tank.git 

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

Необходимые python-библиотеки устанавливаются так:

pip install ipaddr lxml progressbar psutil mysqldb sqlalchemy 

Кроме этого вам придется собрать из исходников Phantom. Не буду тут объяснять, как это сделать, кому нужно — пишите, расскажу.

Пришло время пострелять

Чтобы пострелять танком, нужно написать для него конфигурационный файл (я сегодня немного КО). Я не буду вдаваться в тонкости, которых много, приведу простейший пример:

[phantom] address=example.org rps_schedule=line(1, 100, 10m) headers = [Host: example.org] [Connection: close] [Bloody: yes] uris=/  /list  /img 

После создания файла — просто запускаем танк командой yandex-tank. По умолчанию он ищет конфиг с именем load.ini в текущей директории. Оно пошуршит-пошуршит, постреляет, на выходе будет текстовый файл phout*.log с данными, который обычно советуют запихнуть в gnuplot. Но мы ведь не такие, правда?

Ставим Graphite

К сожалению, официального deb-пакета для Graphite на данный момент нет, поэтому ставить будем из репозитория Python (pypi):

apt-get install python python-dev python-cairo pip install whisper carbon graphite-web django==1.5.1 Twisted==11.1.0 django-tagging 

После установки копируем дефолтную конфигурацию (*.conf.example -> *.conf), например, так:

for file in /opt/graphite/conf/*.example;  do cp $file ${file%.*}; done 

По умолчанию Graphite хранит данные с разрешением в 1 минуту. Нам этого, конечно, мало, в нагрузочных тестах важна каждая секунда. Настраиваем политики хранения данных:

[load] pattern = ^one_sec.yandex_tank. retentions = 1s:7d,5s:1y 

Что за древние письмена? Я попросил Graphite, чтобы все метрики, подпадающие под regexp, указанный в параметре pattern, он хранил в соответствии с политикой, указанной в параметре retentions:

1s:7d, 5s:1y 

Тут все просто: секундная точность — семь дней, потом пятисекундная — в течение года.

And one more thing. Нужно обязательно настроить временную зону на вашу локальную, иначе, указав локальное время, графиков вы не увидете — попросту промахнетесь мимо ваших данных. Временная зона указывается в файле local_settings.py, например, так (по умолчанию файла нет):

echo TIME_ZONE = "Europe/Moscow"  > /opt/graphite/webapp/graphite/local_settings.py 

Теперь создадим таблички в django:

cd /opt/graphite/webapp/graphite python manage.py syncdb 

Чтобы запустить Graphite, нужно стартовать хранилище carbon и веб-фронтенд:

/opt/graphite/bin/carbon-cache.py start /opt/graphite/bin/run-graphite-devel-server.py /opt/graphite/ 

Carbon по умолчанию ждет данных на 2003-м порту. Попробуем записать что-то в Graphite. Это очень просто, например:

echo my.favourite.metric 1 $(date +%s) | nc -q0 localhost 2003 

Тут мы просто отправляем значение 1 с текущим таймстемпом в метрику «my.favourite.metric». А теперь зальем в Graphite содержимое /proc/vmstat (это уже юзабельно):

while read -r metric;  do echo one_sec.vmstat.$metric $(date +%s);  done < /proc/vmstat  | nc -q0 localhost 2003 

И конечно же, для заливки данных о системных ресурсах уже придумали много инструментов. Взгляните, например, на проекты Diamondи CollectD.

Посмотреть на залитые данные можно через веб-интерфейс, который по умолчанию слушает на порту 8080. Поиграйтесь с ним немного, а потом продолжим.

Яндекс танки

Подключаем Танк к Графиту

Ну что же! Пришло время подружить наших новых знакомых. Это тоже просто. Добавляем к конфигурационному файлу Танка вот такую секцию:

[graphite] address=localhost 

Все, теперь снова можно стрелять и видеть наши результаты уже в Graphite. Кроме того, в папке с результатами теперь можно найти HTML-ку, которую Танк для нас заботливо сгенерил. В ней уже собраны графики и проставлены временные интервалы. Вот какие графики мы там видим:

Квантили и среднее время ответа

Яндекс танки

По графику квантилей можно видеть распределение времен ответа каждую секунду.

Число запросов в секунду с разбивкой по маркерам

Яндекс танки

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

Средние времена с разбивкой по маркерам

Яндекс танки

Как сервер реагирует на разные типы запросов — ответ тут.

Коды ответов

Яндекс танки

Если возникнут ошибки — вы увидите их на этом графике.

Кумулятивные квантили

Яндекс танки

В отличие от первого графика, тут квантили «копятся» с начала теста. Можно увидеть, когда они перестали меняться — это значит, вы настреляли достаточно для того, чтобы представлять, как в целом распределяются ответы.

Шаблон отчета

Все помнят, что в предыдущей секции мы обсуждали, как залить в Graphite данные о системных ресурсах? Как же увидеть и эти метрики тоже? Для генерации HTML-ки с картинками, Танк использует шаблон, который можно указать в опциях:

[graphite] template = ./my.tpl 

Шаблон — это просто HTML-ка с переменными, которые Танк подменяет. Например:

<h2>RPS by marker</h2> <img src="" />  <h2>Average response time by marker</h2> <img src="" />  <h2>HTTP codes</h2> <img src="" /> 

Одна ссылка на график в Graphite выглядит так:

http://{host}:{web_port}/render/? width={width}& height={height}& from={start_time}& until={end_time}& target=aliasByMetric({prefix}.overall.quantiles.25_0)& target=aliasByMetric({prefix}.overall.quantiles.50_0)& target=aliasByMetric({prefix}.overall.quantiles.75_0)& target=aliasByMetric({prefix}.overall.quantiles.90_0)& target=aliasByMetric({prefix}.overall.quantiles.95_0)& target=aliasByMetric({prefix}.overall.quantiles.99_0)& target=aliasByMetric({prefix}.overall.quantiles.100_0)& target=aliasByMetric({prefix}.overall.avg_response_time)& areaMode=all 

В фигурных скобках мы видим подменяемые поля, название которых говорит само за себя. Вместо {host} будет хост, указанный в настройках, вместо {start_time} и {end_time} — времена начала и конца стрельбы. Ну, вы поняли.

Что в итоге?

Итак, мы получили стрелялку, которая заливает данные в Graphite и генерит HTML-ку со ссылками на эти данные. Как теперь запускать стрельбы автоматически? По cron? Можно и так. Но удобнее использовать Jenkins. Об этом как-нибудь в следующий раз. Stay tuned!

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

habr.com

Яндекс танки

Добавить комментарий

Ваш e-mail не будет опубликован. Обязательные поля помечены *

Этот сайт использует Akismet для борьбы со спамом. Узнайте как обрабатываются ваши данные комментариев.