Описан разработанный автором программный комплекс, позволяющий автоматизировать поиск оптимальных параметров сетевого соединения с учётом влияния следующих параметров: размер буфера сокетов, скорость передачи пакетов, закон распределения размера пакетов, закон распределения межпакетных интервалов, количество потоков (тредов). Приведены и проанализированы результаты экспериментов.
Ключевые слова: многопоточное программирование, Java, UDP, сетевое программирование, автоматизация.
Объектом исследования в статье являются многопоточные сетевые Java-приложения, передающие с высокой скоростью UDP-трафик по локальной сети, в которой практически отсутствуют потери пакетов в промежуточных сетевых узлах. Данный объект исследования актуален, так как в современном мире все больше требуется удаленное взаимодействие. Например: оплата услуг различного рода, заказ билетов и т. д. При разработке таких приложений разработчики должны учитывать, что они должны обслуживать большое число пользователей одновременно и делать это качественно. С помощью разработанного автором приложения, можно найти оптимальные параметры при создании многопоточных сетевых приложений. Протокол UDP был выбран, т. к. чаще всего в локальной сети не требуется использовать сложные механизмы повторной передачи ТСР из-за низкого уровня потерь пакетов в промежуточных узлах локальной сети.
Предметом исследования является эффективность передачи трафика по компьютерной сети при использовании различных способов конфигурации многопоточного сетевого приложения. Первый показатель эффективности — процент потерь в результате переполнения выходного буфера на передающем узле. Второй показатель эффективности — скорость передачи трафика. В качестве критерия эффективности используется отсутствие потерь пакетов при максимизации скорости передачи.
Цель исследования — экспериментальным способом выявить, как влияет многопоточная архитектура передающего приложения на эффективность передачи трафика по компьютерной сети. Для достижения цели были решены следующие задачи:
1. Создать программный экспериментальный комплекс на языке программирования Java [1] для измерения производительности, включающий в себя многопоточный генератор трафика и конфигурируемое серверное приложение.
2. Исследовать эффективность передачи трафика при различных конфигурациях экспериментального комплекса.
3. Описать, какие параметры конфигурации многопоточного сетевого приложения наиболее существенно влияют на эффективность передачи трафика.
4. На основе анализа полученных результатов сформулировать рекомендации для проектирования многопоточных сетевых приложений.
При исследовании эффективности передачи трафика использовались методы организации и планирования машинного эксперимента [2]; при анализе результатов экспериментов использовались методы математической статистики. Так как каких-либо начальных или заданных параметров на проведение экспериментов не было, сначала проводились опорные эксперименты, в которых параметры изменялись в широком диапазоне и с большим шагом, а затем по полученным результатам проводилась оценка значений параметров, которые в дальнейшем будут использоваться в рабочих экспериментах.
Так как с помощью разработанного программного комплекса программ нужно было проводить эксперименты, имитирующие многопоточный сетевой трафик, нужно было решить, какие параметры требуется контролировать и менять в процессе проведения экспериментов. На рис. 1 представлен интерфейс разработанной программы, на котором присутствуют вышеописанные параметры:
1. Количество пакетов — в этом поле указывается количество отсылаемых пакетов для каждого эксперимента.
2. Количество искусственных ошибок — с помощью этого параметра можно искусственно генерировать количество ошибок (был введен для проверки отладки программы).
3. Количество прогонов каждого эксперимента — в это поле вводится общее число экспериментов.
4. Скорость передачи пакетов — задается в Мбитах в секунду (максимальное ограничение 100 Мбит/с).
5. Шаг — поля отвечающие зато на сколько будут увеличиваться соответствующие поля.
6. Размер пакета — в этом параметре указывается заброс размера пакета.
7. Количество потоков (начальное и конечное) — в них указывается количество потоков, с которого надо начать работу программы, и на каком количестве её закончить.
Рис. 1
Так же присутствует динамически изменяющаяся панель информации, в которой отображаются текущие данные по эксперименту. При запуске программы, поля которые не были заполнены, заполняются значениями по умолчанию. Например, пусть максимальный размер пакета будет 1000 байт а, минимальный 40 байт, тогда средний размер пакета будет рассчитываться как ((1000+40)/2), значение этого выражения будет равно 520 байт. После этого идет расчет среднего межпакетного интервала, он определяется как, средний размер пакета, в битах, деленный на скорость передачи. Пусть скорость будет равна 25 Мегабит в секунду, для правильности расчетов данную скорость, как и средний размер пакета, надо перевести в биты т. е. (25 * 1000000) а, (520 * 8) и получаем соответственно 25000000 бит в секунду и 4160 бит и в результате получаем (4160/25000000) 0,0001664. Так как секунда для машины это довольно большой промежуток времени то полученный результат нужно умножить на количество миллисекунд в секунде, что приводит нас к числу (0,1664) это количество миллисекунд и таков будет межпакетный интервал при данных параметрах. С введение в эксперименты числа потоков больше одного точность данного межпакетного интервала стала не удовлетворительной. В связи с этим было принято решение о введении пересчета в наносекунды, для этого полученное количество секунд нужно умножить на 1000000. Далее производится подсчет межпакетного интервала для каждого потока в мили и наносекунды.
Для начала проведения экспериментов нужно запустить серверную часть. Это делается из консоли, указывая при этом номер порта, который будет прослушиваться. Потом запускается клиентская часть приложения, и задаются параметры экспериментов. Задача сервера сводится к максимально быстрому приёму данных и записи их в удобном формате в файл. После сбора статистики, данные обрабатываются для расчёта процента ошибок с учётом доверительного интервала по Стьюденту с доверительной вероятностью 0.99.
В работе использовался лишь протокол передачи UDP. Указанный протокол выбран, так как чаще всего в локальной сети не требуется использовать сложные механизмы повторной передачи ТСР из-за низкого уровня потерь пакетов в промежуточных узлах локальной сети. При написании серверной части возникла проблема на клиентской части: клиент в процессе проведения серии экспериментов менял параметры и после чего формировал полноразмерный пакет для сообщения об этом серверу и после этого сразу начинал передачу. Сервер получал этот пакет и обрабатывал его, но так как значимая информация находилась лишь в начале пакета, а остальное было «мусором», на который сервер тратил много времени, и не успевал принимать следующие пакеты, вследствие чего происходила их фрагментация. Данная проблема была решена путем явного указания серверу, о том, что при получении такого пакета он должен обрабатывать только первые 100 байт, а остальную часть пакета игнорировать.
Для определения параметров проведения дальнейших более детальных исследований были проведены тестовые эксперименты. Параметрами тестовых экспериментов были таковы: количество пакетов, на которых проводились тесты, начиналось от 1000 до 10000 с шагом 1000 пакетов, скорость от 1 до 100 Мегабит в секунду, средний размер пакета был 700 байт, разброс колебался от 40 до 1400 байт, количество каждых под экспериментов от 1 до 100. Размер буфера получателя выставлялся по умолчанию системой. Для тестирования использовалась 32-х разрядная операционная система Microsoft Windows 7 Ultimate, четырех ядерный процессор Intel Corei5 с частотой работы 2,3 Гигагерца, сетевой интерфейс с максимальной пропускной способностью 100 Мегабит в секунду.
После проведения серии тестовых экспериментов на основе полученных данных для исследования были взяты следующие величины. Количество пакетов 10000, так как потери наблюдались на скоростях, близких к максимальным скоростям. Для тестирования была взята максимальная возможная скорость в 100 Мегабит в секунду. Дальнейшие эксперименты проводились с целью выявить закономерность: как размер буфера получателя, количество потоков, а так же разброс пакетов влияет на процент потерь. Размер буфера отправителя был выставлен с запасом в размере 2000 байт, чтобы гарантированно вмещать один пакет с максимальной длиной.
На рис. 2 отражены результаты экспериментов, в которых исследовалось влияние размера буфера, отправляющего сокета на вероятность потерь пакетов. Во всех экспериментах оставались неизменными следующие параметры: размер пакета задавался случайной равномерно распределенной величиной от 40 до 1360 байт; межпакетный интервал задавался детерминированной величиной так, чтобы скорость передачи была равна 100 Мбит/с; количество потоков (thread) равно 1.
По оси абсцисс на рис.2 указан размер буфера отправляющего сокета, выраженный в байтах. По оси ординат указана доля потерянных пакетов, выраженная в процентах. Большая и меньшая кривые на графике означают верхнюю и нижнюю границу доверительного интервала [3] (по Стьюденту) с доверительной вероятностью 0,999. Многочисленные точки вне кривых доверительного интервала означают значения, измеренные в индивидуальных прогонах эксперимента, которые затем усредняются и обобщаются с помощью доверительного интервала.
Рис. 2
При проведении экспериментов размер буфера варьировался от 1000 до 10000 байт с шагом 1000 байт. При этом на каждом шаге проводилось по 50 экспериментальных прогонов.
Анализируя данные на рис.2, можно сделать вывод, что с увеличением размера буфера передающего сокета доля потерь пакетов становится меньше. Этот результат можно считать очевидным и не требующим экспериментального подтверждения. Существенно больший интерес представляет характер исследуемой зависимости, например, при размере буфера 1000 байт можно было ожидать, что все пакеты размером более 1000 байт будут отброшены, что должно привести к потере 29 % пакетов. Эксперименты опровергают это предположение: доля потерь не превышает 2 %.
Отметим, что при проведении экспериментов на других операционных системах (например, Windows XP) доля потерь могла превышать 29 %. Из сказанного следует, что при выборе размера буфера программисту не следует ориентироваться на прямые расчёты возможных потерь. По всей видимости, операционная система вольна интерпретировать заданный размер буфера достаточно свободно, не гарантируя, что будут установлены указанные пользователем ограничения.
Литература:
1. Ноутон.П. Java 2. Наиболее полное руководство./П.Ноутон.Г.Шилдт:БХВ-Петербург,2006.-1050с.
2. Власов К. П. Методы научных исследований и организации эксперимента. — Санкт-Петербург, РИЦ СПГГИ, 2000. 116 с.
3. Гмурман В. Е. Теория вероятностей и математическая статистика: Учебное пособие для вузов. — 9-е изд. — М.: Высшая школа, 2003. — 479 с..