Задача
При запуске сервиса вещания, который должен отдавать видео-потоки по HTTP, рано или поздно возникает вопрос: а сколько клиентов потянет данное конкретное железо и как спрогнозировать нагрузку?
Есть несколько вариантов, чтобы попробовать провести тестирование, например:
- ab - утилита для тестирования производительности веб-серверов. Она замечательно справляется с созданием множества конкурентных подключений, однако главное её предназначение - забирать текстовые данные, а отнюдь не файлы. Для её использования придется писать скриптовую обвязку.
- JMeter - нужно сказать об этом инструменте, что он может практически всё. Планы тестирования покрывают 99% реальных задач. Но главный его недостаток в том, что для того, чтобы нагрузить более-менее серьезный сервер нужно иметь десяток более мощных клиентских машин, т.к. процессор он съедает просто как не в себя.
Пожалуй главный недостаток всех существующих утилит в том, что все они пытаются сохранить получаемый файл, что создает нагрузку на клиент. В нашем же случае нужна минимальная нагрузка, а файл не нужен вообще.
Требования к тестированию можно свести к нескольким пунктам:
- ПО на входе должно получать список URL файлов, ведь в реальных условиях все клиенты будут запрашивать разные файлы
- Обращение к файлам должно происходить со случайной позиции, ведь в реальных условиях все клиенты будут использовать перемотку по файлу
- Создаваемая на клиент нагрузка должна быть минимальная
Решение
Перепробовав разные варианты, было решено написать свой костыль. Как известно для таких задач идеально подходит Delphi - подобное приложение можно сделать за пару часов совершенно не напрягаясь.
Пользоваться утилитой очень просто: задаем количество одновременных потоков, лимит скорости одного потока (чуть выше предполагаемого битрейта) и вводим список файлов, которые нужно пытаться загрузить. Принимаются HTTP-ссылки, по одному адресу на строку:
http://example.com/download/file-0000000022.bin
http://example.com/download/file-0000000023.bin
http://example.com/download/file-0000000024.bin
...
Дальше - запускаем и наблюдаем за I/O на сервере, пытаясь выйти в полку. Когда по I/O получили максимальную нагрузку - смотрим на исходящий сетевой поток, делим его на предполагаемый битрейт и получаем максимально допустимое количество клиентов.
После того, как файл скачан - программа переходит к следующей ссылке, а если список закончился - то возвращается к началу списка. Одно из ограничений - изначальеный список ссылок должен быть больше, чем количество одновременных потоков. Чтение файла всегда начинается со случайной позиции (HTTP partical content).