2025 год начался с короткого затишья текущих проектов, возникла идея поковырять тему нагрузочного испытания радиоподсистемы Wi-Fi. Основная сложность и основной вопрос всех нагрузочных тестов - Чем нагрузить? Вот этот вопрос попробуем разобрать в этой статье ...
Собираем стенд

Стенд состоит из:
испытуемой точки доступа;
контроллер (в нашем случае виртуальный);
ПК с развернутым сервером LibreSpeetTest;
20 обычных офисных ноутбуков.
Ноутбуки раскладываем по столам для максимального приближения к реальным условиям. Измерения планируем на выходной день для минимизации влияния существующих беспроводных сетей, в пустом офисе активность их минимальна, хотя утилизация радиочастотного спектра в пустом офисе не нулевая:

Для минимизации вероятности организации «бутылочного горлышка» точку доступа подключаем непосредственно к серверу через мультигигабитный (1/2.5/10 Gbps) медный интерфейс. Перечень тестовых устройств:
№ | Model | Adapter | Driver | IP |
1 | Lenovo ThinkPad E14 | Intel(R) Wi-Fi 6 AX201 160MHz | 22.40.0.7 (larEnabled=0) | 192.168.1.101 |
2 | Lenovo ThinkBook 13s | Intel(R) Wi-Fi 6 AX201 160MHz | 22.40.0.7 (larEnabled=0) | 192.168.1.102 |
3 | Lenovo ThinkBook 13s | Intel(R) Wi-Fi 6 AX201 160MHz | 22.40.0.7 (larEnabled=0) | 192.168.1.103 |
4 | Lenovo ThinkBook 13s | Intel(R) Wi-Fi 6 AX201 160MHz | 22.40.0.7 (larEnabled=0) | 192.168.1.104 |
5 | Lenovo ThinkBook 13s | Intel(R) Wi-Fi 6 AX201 160MHz | 22.40.0.7 (larEnabled=0) | 192.168.1.105 |
6 | Lenovo ThinkBook 13s | Intel(R) Wi-Fi 6 AX201 160MHz | 22.40.0.7 (larEnabled=0) | 192.168.1.106 |
7 | Lenovo ThinkBook 13s | Intel(R) Wi-Fi 6 AX201 160MHz | 22.40.0.7 (larEnabled=0) | 192.168.1.107 |
8 | Lenovo ThinkBook 13s | Intel(R) Wi-Fi 6 AX201 160MHz | 22.40.0.7 (larEnabled=0) | 192.168.1.108 |
9 | Lenovo ThinkBook 13s | Intel(R) Wi-Fi 6 AX201 160MHz | 22.40.0.7 (larEnabled=0) | 192.168.1.109 |
10 | Lenovo ThinkBook 13s | Intel(R) Wi-Fi 6 AX201 160MHz | 22.40.0.7 (larEnabled=0) | 192.168.1.110 |
11 | Lenovo ThinkBook 13s | Intel(R) Wi-Fi 6 AX201 160MHz | 22.40.0.7 (larEnabled=0) | 192.168.1.111 |
12 | Lenovo ThinkBook 13s | Intel(R) Wi-Fi 6 AX201 160MHz | 22.40.0.7 (larEnabled=0) | 192.168.1.112 |
13 | Lenovo ThinkBook 13s | Intel(R) Wi-Fi 6 AX201 160MHz | 22.40.0.7 (larEnabled=0) | 192.168.1.113 |
14 | Lenovo ThinkPad E13 | Intel(R) Wi-Fi 6 AX201 160MHz | 22.40.0.7 (larEnabled=0) | 192.168.1.114 |
15 | Lenovo ThinkPad E14 | Intel(R) Wi-Fi 6 AX201 160MHz | 22.40.0.7 (larEnabled=0) | 192.168.1.115 |
16 | Lenovo ThinkPad E14 | Intel(R) Wi-Fi 6 AX201 160MHz | 22.40.0.7 (larEnabled=0) | 192.168.1.116 |
17 | Lenovo ThinkPad E14 | Intel(R) Wi-Fi 6 AX201 160MHz | 22.40.0.7 (larEnabled=0) | 192.168.1.117 |
18 | Lenovo ThinkPad E14 | Intel(R) Wi-Fi 6 AX201 160MHz | 22.40.0.7 (larEnabled=0) | 192.168.1.118 |
19 | Lenovo ThinkPad E14 | Intel(R) Wi-Fi 6 AX201 160MHz | 22.40.0.7 (larEnabled=0) | 192.168.1.119 |
20 | Lenovo ThinkPad E14 | Intel(R) Wi-Fi 6 AX201 160MHz | 22.40.0.7 (larEnabled=0) | 192.168.1.120 |
21 | Xiaomi 13 (2211133G) | Qualcomm Snapdragon 8 Gen 2 | - | - |
Тест точка - несколько клиентов
Сложность в том чтобы организовать запуск теста скорости на всех клиентах одновременно, для этого используем librespeed/speedtest-cli, на всякий случай выложу уже готовый скомпилированный файл librespeed-cli-windows-amd64.7z.
Для того чтобы программа не искала сервер самостоятельно, есть возможность указать ему конкретный URL в файле server.json. В нашем случае содержимое файла выглядит так:
[
{
"id": 1,
"name": "PHP Backend",
"server": "http://192.168.1.254/backend",
"dlURL": "garbage.php",
"ulURL": "empty.php",
"pingURL": "empty.php",
"getIpURL": "getIP.php"
}
]При этом запустить программу из консоли следует конструкцией вида:
librespeed-cli-windows-amd64.exe --local-json server.jsonОсталось придумать как же запустить эту конструкцию на всех клиентах одновременно?
Возможно, кто-то придумает более изящное решение, мне показалось наиболее простым способом будет запуск скрипта на сервере, который по SSH подключается к хостам по списку из файла HOSTS_FILE="hosts.txt" и запускает описанную выше конструкцию. Перед запуском скрипта необходимо в папки с учетной записью admin на все тестовые устройства раскидать ssh ключ, для того чтобы не запрашивались учетные данные. Собственно, вот и сам скрипт:
#!/bin/bash
# Файл с адресами ПК
HOSTS_FILE="hosts.txt"
# Файл для сохранения результатов
OUTPUT_FILE="results.txt"
# Очищаем файл с результатами перед запуском
> $OUTPUT_FILE
# Функция для выполнения команды на удаленном ПК
run_command() {
local host=$1
echo "Подключение к $host..."
# Выполняем команду и фильтруем вывод
ssh admin@$host 'librespeed-cli-windows-amd64.exe --local-json server.json' >> $OUTPUT_FILE
if [ $? -eq 0 ]; then
echo "Команда выполнена успешно на $host"
else
echo "Ошибка при выполнении команды на $host"
fi
}
# Проходим по каждому хосту из файла
while IFS= read -r host; do
run_command "$host" &
done < "$HOSTS_FILE"
# Ждем завершения всех фоновых процессов
wait
echo "Все команды выполнены. Результаты сохранены в $OUTPUT_FILE."Итак, пробуем измерить …
Убедимся, что клиенты подключены:
Тип | MAC | Частота | Канал | RSSI |
Беспроводной | 34:CF:F6:89:FF:99 | 2.4 | 1/20 | -43 |
Беспроводной | 38:FC:98:6F:DA:51 | 2.4 | 1/20 | -35 |
Беспроводной | 38:FC:98:73:C4:77 | 2.4 | 1/20 | -55 |
Беспроводной | 38:FC:98:73:ED:F3 | 2.4 | 1/20 | -52 |
Беспроводной | 5E:E1:1F:29:E4:48 | 2.4 | 1/20 | -44 |
Беспроводной | 64:79:F0:A4:82:7E | 2.4 | 1/20 | -40 |
Беспроводной | 64:79:F0:A6:B1:D9 | 2.4 | 1/20 | -48 |
Беспроводной | 64:79:F0:A6:BA:6C | 2.4 | 1/20 | -52 |
Беспроводной | 64:79:F0:A6:BA:DF | 2.4 | 1/20 | -45 |
Беспроводной | 64:79:F0:A7:1C:A0 | 2.4 | 1/20 | -56 |
Беспроводной | 7C:50:79:4E:AE:E9 | 2.4 | 1/20 | -45 |
Беспроводной | 8C:C6:81:F8:57:41 | 2.4 | 1/20 | -55 |
Беспроводной | C0:B8:83:C2:CA:DB | 2.4 | 1/20 | -48 |
Беспроводной | D8:3B:BF:12:9F:B2 | 2.4 | 1/20 | -44 |
Беспроводной | D8:3B:BF:17:32:57 | 2.4 | 1/20 | -44 |
Беспроводной | D8:3B:BF:17:7F:46 | 2.4 | 1/20 | -41 |
Беспроводной | D8:3B:BF:18:23:DD | 2.4 | 1/20 | -47 |
Беспроводной | D8:3B:BF:18:36:9D | 2.4 | 1/20 | -42 |
Беспроводной | D8:F8:83:7B:3F:68 | 2.4 | 1/20 | -47 |
Беспроводной | D8:F8:83:7D:5E:DD | 2.4 | 1/20 | -36 |
Беспроводной | DC:21:5C:E0:2D:65 | 2.4 | 1/20 | -47 |
Беспроводной | FC:B3:BC:FD:DD:97 | 2.4 | 1/20 | -37 |
Запускаем скрипт, ждем завершения испытаний (около 30-40 секунд), смотрим что получилось:
Download rate: 12.39 Mbps
Upload rate: 17.03 Mbps
Download rate: 9.91 Mbps
Upload rate: 2.58 Mbps
Download rate: 7.21 Mbps
Upload rate: 0.58 Mbps
Download rate: 15.24 Mbps
Upload rate: 30.93 Mbps
Download rate: 12.05 Mbps
Upload rate: 0.82 Mbps
Download rate: 9.71 Mbps
Upload rate: 1.53 Mbps
Download rate: 9.96 Mbps
Upload rate: 6.82 Mbps
Download rate: 6.43 Mbps
Upload rate: 1.07 Mbps
Download rate: 2.81 Mbps
Upload rate: 7.60 Mbps
Download rate: 9.63 Mbps
Upload rate: 0.48 Mbps
Download rate: 8.76 Mbps
Upload rate: 1.18 Mbps
Download rate: 5.38 Mbps
Upload rate: 5.68 Mbps
Download rate: 6.65 Mbps
Upload rate: 1.17 Mbps
Download rate: 7.50 Mbps
Upload rate: 0.80 Mbps
Download rate: 3.45 Mbps
Upload rate: 0.53 Mbps
Download rate: 6.36 Mbps
Upload rate: 0.90 Mbps
Download rate: 9.59 Mbps
Upload rate: 46.40 Mbps
Download rate: 4.97 Mbps
Upload rate: 1.05 Mbps
Download rate: 7.77 Mbps
Upload rate: 3.27 Mbps
Download rate: 8.88 Mbps
Upload rate: 40.00 Mbps
Как видно полученные значения от устройства к устройству сильно отличаются, однако если просуммировать строки получаем:
суммарный Download rate = 164,65 Mbps,
суммарный Upload rate = 130,42 Mbps.
Свою оценку корректности такого подхода к суммированию скорости таким образом и насколько близок к истине такой результат пишите в комментариях. Было бы интересно услышать аргументированную критику, куда же без нее…
Стоит отметить, что подход не требует покупки дорогостоящего софта и лицензий, и может быть повторен любым желающим.
В таблице ниже результаты измерений для различных диапазонов и различной ширине каналов точки доступа:
Bandwidth, MHz | Download rate SUM, Mbps | Upload rate SUM, Mbps |
ch1 - 20MHz | 164,65 | 130,42 |
ch1 - 40MHz | 199,33 | 133,52 |
ch36 - 20MHz | 221,69 | 211,08 |
ch36 ch40 - 40MHz | 346,13 | 277,17 |
ch36 ch40 ch44 ch48 - 80MHz | 417,41 | 513,34 |
ch149 ch153 ch157 ch161 - 80MHz | 479,67 | 450,45 |
Таким образом констатируем неплохую производительность тестируемой точки доступа Wi-Fi .
Пишите в комментариях насколько интересны полученные результаты, испытания какого вендора хотелось бы увидеть в следующей статье?
