Задача
Провести нагрузочное тестирование ядра Платформы Wi-Fi в режиме Радар (функционал МАС-сканер).
Для тестирования необходимо создать нагрузку, сопоставимую с нагрузкой одновременной работы нескольких (10-15) тысяч точек доступа WEP-2ac в режиме "Радар".
В этом режиме ТД сканирует эфир на предмет наличия пакетов от Wi-Fi клиентов, сохраняет полный список обнаруженных МАС-адресов во внутренний буфер и периодически высылает информацию в коллектор по протоколу HTTP методом POST. Список МАС-адресов и сопутствующие атрибуты помещаются в файл формата JSON.
Схема стенда
Схема 1. Схема взаимодействия элементов
Алгоритм прохождения данных при нагрузочном тесте (однохостовая инсталляция):
1. Яндекс.Tанк отправляет запросы на локальный интерфейс хоста по пути http://localhost/proxy
2. Сервис nginx принимает данные по протоколу HTTP (port=80) и отправляет по https (port=443) по адресу коллектора: https://api.hottwf.com/probes/eltex/parser
3. Коллектор принимает JSON внутри снаряда и отправляет '200 OK', в случае удачи и другой код возврата в случае неудачи (коды ответов WEB-сервиса можно посмотреть тут: https://en.wikipedia.org/wiki/List_of_HTTP_status_codes) в сторону proxy (nginx);
4. nginx пересылает ответ в Яндекс.Танк;
5. Яндекс.Танк анализирует ответ, считает метрики;
Конфигурация стенда
Стенд представляет собой один или два хоста на операционной системе Linux Ubuntu 16.04 x64 LTS.
Для проведения тестирования необходимо установить пакеты nginx, docker.
$ sudo apt install nginx $ sudo apt install docker
Конфигурация nginx
Для тестирования используется последняя версия nginx, доступная в ОС. При пилотном тестировании использовалась версия: "1.10.3-0ubuntu0.16.04.4".
# Default server configuration # server { listen 80 default_server; listen [::]:80 default_server; root /var/www/avp; index index.html index.htm; allow all; proxy_read_timeout 500; proxy_connect_timeout 500; proxy_ssl_verify off; # To allow POST on static pages error_page 405 =200 $uri; location /proxy/ { proxy_pass https://api.hottwf.com/probes/eltex/parser; } }
Конфигурация Yandex.Tank
Конфигурационный файл для запуска Танка
phantom: address: 127.0.0.1:80 # [Target's address]:[target's port] # uris: # setup in ammo # - / # setup in ammo load_profile: load_type: rps # schedule load by defining requests per second schedule: line(1, 2, 10s) # starting from 1rps growing linearly to 10rps during 10 minutes ammofile: /var/loadtest/working-ammo ammo_type: uripost console: enabled: true # enable console output telegraf: enabled: false # let's disable telegraf monitoring for the first time
Конфигурация "снаряда" (ammo)
[Host: localhost] [Connection: close] [User-Agent: Tank] [Content-Length: 417] [Content-Type: application/json] 417 /proxy/ {"ap_id": "00-04-56-F8-33-30","version": "1.0","ap_name":"rad_JN3PMROF","probe_requests":[{"dbi": -25,"packet_count": 12,"mac": "C0:B6:58:14:22:33","ch": 1,"rssi_min": -33,"ssid": "WIFI-guest","timestamp" : "1571391498","type_bitmask": 1,"bss_mac": ""},{"dbi": -44,"packet_count": 12,"mac": "C0:B6:58:14:22:34","ch": 6,"rssi_min": -50,"ssid": "WIFI-guest","timestamp": "1571392599","type_bitmask": 1,"bss_mac" : ""}]}
Примечание: файл конфигурации load.yaml - это имя файла конфигурации Танка по умолчанию, файл working-ammo присутствует в настройках файла конфигурации запуска Танка. При изменениях в названиях файлов нужно это учесть.
Файл ammo состоит из двух основных секций. В верхней обязательной секции находятся конфигурационные характеристики обмена в квадратных скобках.
Ниже находится блок 'payload' (данные) для выполнения HTTP POST. Формат данных должен удовлетворять обязательным условиям:
- На новой строке должен быть указан размер блока с данными, в байтах (417 в приложенном примере);
- После размера данных указывается путь, куда Танк будет посылать данные (/proxy/ в приложенном примере . Итоговый путь с учётом конфигурации будет: 'http://localhost:80/proxy/');
- Информация формата JSON должна быть помещена сразу после строки с размером. Полный размер данных должен до байта совпадать с указанным значением, иначе будут ошибки;
Запуск теста
Запуск теста производится из командной строки терминала командой:
docker run -v $(pwd):/var/loadtest -v $SSH_AUTH_SOCK:/ssh-agent -e SSH_AUTH_SOCK=/ssh-agent --net host -it direvius/yandex-tank
При этом, в текущем каталоге (где производится запуск) должны находиться файлы конфигурации: 'load.yaml' и 'working-ammo', в случае изменения имени файла (запуск с альтернативной конфигурацией), необходимо указать опцию: "-c custom-config-name.yaml
"
Результаты тестирования будут выведены в консоль.
В случае каких-то проблем рекомендуется воспользоваться утилитой Wireshark для получения копии сетевого обмена и анализа ситуации.
Увеличение нагрузки
Для увеличения нагрузки необходимо изменить строку
schedule: line(1, 2, 10s)
на
schedule: line(1, 10000, 600s)
В данном примере нагрузка последовательно растёт от 1 до 10 тыс. запросов в сек (rps) и общее время теста составляет 100 секунд.
Подробнее о настройках высоконагруженных тестов предлагается почитать на официальной странице продукта Yandex.Tank:
https://yandextank.readthedocs.io/en/latest/core_and_modules.html#id1
Анализ результатов
Ошибочный тест
. =========================================================- 100.0% Data delay: 4s, RPS: 2 ▃▃▃▇▃▇ . Duration: 0:00:10 ETA: 0:00:00 . Percentiles (all/last 1m/last), ms: . HTTP codes: . Hosts: lexx => 127.0.01:80 100.0% < 8.4 8.4 0.6 . 8 +2 100.00% : 404 Not Found . Ammo: working-ammo 99.5% < 8.4 8.4 0.6 . . Count: 15 99.0% < 8.4 8.4 0.6 . Net codes: . Load: line(1, 2, 10s) 95.0% < 8.4 8.4 0.6 . 8 +2 100.00% : 0 Success . 90.0% < 8.4 8.4 0.6 . . Active instances: 1 85.0% < 0.8 0.8 0.6 . Average Sizes (all/last), bytes: . Planned requests: 2.0 for 0:00:00 80.0% < 0.8 0.8 0.6 . Request: 549.0 / 549.0 ▇▇▇▇▇▇ . Actual responses: 2 75.0% < 0.8 0.8 0.6 . Response: 451.0 / 451.0 ▇▇▇▇▇▇ . Accuracy: 0.00% 70.0% < 0.8 0.8 0.6 . . Time lag: 0:00:00 60.0% < 0.7 0.7 0.6 . Average Times (all/last), ms: . 50.0% < 0.7 0.7 0.6 . Overall: 1.61 / 0.59 ▇_____ . 40.0% < 0.7 0.7 0.6 . Connect: 0.49 / 0.15 ▇_____ . 30.0% < 0.6 0.6 0.6 . Send: 0.06 / 0.07 ▅▇▆▇▃▇ . 20.0% < 0.6 0.6 0.6 . Latency: 0.97 / 0.25 ▇_____ . 10.0% < 0.3 0.3 0.6 . Receive: 0.10 / 0.11 ▃▅▇▇▂▇ . . . Cumulative Cases Info: . name count % last net_e http_e avg ms last ms . OVERALL: 8 100.00% +2 0 8 1.2 0.5 ▃▃▃▇▃▇ .
Пример ошибочной конфигурации. Страница, к которой обращается Tank не найдена, сервер возвращает код "404" для 100% результатов. Среднее время получения ответа = 1.2ms.
Успешный тест
. =========================================================\ 100.0% Data delay: 4s, RPS: 1 ▇▃▃▃▇▃ . Duration: 0:00:10 ETA: 0:00:00 . Percentiles (all/last 1m/last), ms: . HTTP codes: . Hosts: lexx => 127.0.01:80 100.0% < 223.0 223.0 129.2 . 8 +1 100.00% : 200 OK . Ammo: working-ammo 99.5% < 223.0 223.0 129.2 . . Count: 15 99.0% < 223.0 223.0 129.2 . Net codes: . Load: line(1, 2, 10s) 95.0% < 223.0 223.0 129.2 . 8 +1 100.00% : 0 Success . 90.0% < 223.0 223.0 129.2 . . Active instances: 1 85.0% < 135.0 135.0 129.2 . Average Sizes (all/last), bytes: . Planned requests: 2.0 for 0:00:00 80.0% < 135.0 135.0 129.2 . Request: 549.0 / 549.0 ▇▇▇▇▇▇ . Actual responses: 1 75.0% < 132.0 132.0 129.2 . Response: 415.0 / 415.0 ▇▇▇▇▇▇ . Accuracy: 0.00% 70.0% < 132.0 132.0 129.2 . . Time lag: 0:00:00 60.0% < 130.0 130.0 129.2 . Average Times (all/last), ms: . 50.0% < 129.0 129.0 129.2 . Overall: 139.19 / 129.16 ▇▅▅▅▅▅ . 40.0% < 129.0 129.0 129.2 . Connect: 0.75 / 0.17 ▇_____ . 30.0% < 124.0 124.0 129.2 . Send: 0.05 / 0.04 ▆▅▆▅▇▅ . 20.0% < 123.0 123.0 129.2 . Latency: 138.27 / 128.86 ▇▅▅▅▅▅ . 10.0% < 122.0 122.0 129.2 . Receive: 0.12 / 0.08 ▇▇▇▇▆▄ . . . Cumulative Cases Info: . name count % last net_e http_e avg ms last ms . OVERALL: 8 100.00% +1 0 0 139.0 129.0 ▇▃▃▃▇▃ .
Тест длился 10 сек.
Всего отправлено 15 запросов.
Получено 100% успешных ответов (200 ОК).
Среднее время ответа 129 ms.
Контроль корректной работы MAC коллектора HotWiFi
Для того, чтобы убедиться в корректной обработке списка принятых МАС-адресов на стороне МАС коллектора HotWiFi, необходимо сделать выгрузку списка МАС через личный кабинет.
Адрес личного кабинета:
http://lk-pro.wifi.rt.ru/radar
После получения выгрузки (например, через Email), необходимо убедиться, что в выгрузке присутствуют МАС-адреса, указанные в payload пакета. Также, необходимо сравнить количество выгруженных МАС-адресов (учесть период выгрузки) с тем количеством, которое было настроено в тестируемой схеме. Т.е. для указанного случая заявлено, что успешно прошло 15 обращений. В каждом обращении 2 МАС адреса, значит в выгрузке должно быть не менее 30 МАС-адресов.