3 апреля 2011 г. 22:10
Написал soar

HTTP Stream Benchmark

Содержание

Задача

При запуске сервиса вещания, который должен отдавать видео-потоки по 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).

Комментарии