Форум программистов, компьютерный форум, киберфорум
C/С++ под Linux
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.63/8: Рейтинг темы: голосов - 8, средняя оценка - 4.63
0 / 0 / 0
Регистрация: 15.10.2012
Сообщений: 10

Тестирование производительности udp

25.02.2016, 14:00. Показов 1909. Ответов 4
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Есть два компьютера, один "медленный" (одноядерный х86 процессор Intel Quark X1000 с частотой 400 МГц), второй "быстрый" - (Intel core 2 duo, около 2.2 ГГц). Понимаю, что дело не только в процессорах, но упрощенно говоря можно считать что один быстрее другого (я могу ошибаться, но пока считаю так).

Есть клиент-серверное приложение (UDP). UDP сервер расположен на медленном компьютере, UDP клиент на быстром.
Клиент шлет дейтаграммы в цикле, сервер принимает их, и считает количество полученных дейтаграмм (а так же количество полученных байт). После того как клиент заканчивает передачу, можно сигналом прервать работу сервера, и он выведет количество полученных дейтаграмм.

Так как клиент быстрее сервера, то часть дейтаграмм теряется(отбрасывается), т.к. не успевает быть принятой.
Часть кода сервера:
просто бесконечный цикл для чтения дейтаграмм, и возможность прервать программу по сигналу.

C
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
static void recvfrom_int(int);
static long count;
unsigned long long received = 0;     
 
static void recvfrom_int(int signo) {
    printf("\nreceived %d datagrams\n", count);
    printf("\nreceived bytes: %d\n", received);
    exit(0);
} 
 
int main () {  
    signal(SIGINT, recvfrom_int);        
    int sockfd;
    struct sockaddr_in servaddr, cliaddr;    
    char mesg[MAXLINE];        
    ...
    ...
    sockfd = socket (AF_INET, SOCK_DGRAM, 0); 
    ...
    ...
    count = 0;     
    for ( ; ; ) {    
        received += recvfrom(sockfd, mesg, MAXLINE, 0, (struct sockaddr *)&cliaddr, &len);
        count++;        
    }        
}
Часть кода клиента:
Отсылается NDG UDP-дейтаграмм (а конкретно - 50000 дейтаграмм), каждая размером DGLEN байт.

Ф-ция connect используется для большей производительности (в UDP также можно создавать присоединенные сокеты, правда при этом никакого "рукопожатия" не происходит, а делается это только с целью увеличения производительности программы, подробности в Стивенсе есть).

C
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
#define MAXLINE 90000
#define NDG 50000 /* datagrams to send */    
#define DGLEN 3100 /* datagrams size*/
 
int main () {
    int sockfd;
    struct sockaddr_in servaddr;
    char sendline[MAXLINE];   
    int i;
    int n = 0;
    ...
    ...
    sockfd = socket(AF_INET, SOCK_DGRAM, 0);
    connect(sockfd, (struct sockaddr *)&servaddr, sizeof(servaddr));
    ...
    //SENDING DATAGRAMS
    for (i = 0; i < NDG; i++) {
        n = write(sockfd, sendline, DGLEN);
    }
 
}
Похожий код можно увидеть в главе 8.13 (или 9.13, зависит от версии книги) , Стивенса http://www.amazon.com/dp/01394... verfl08-20

Результаты передачи
C
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
DGLEN (размер одной дейтаграммы)     COUNT (количество дейтаграмм, полученных на сервере)
   10                                                                              67
   50                                                                              67
   100                                                                             67
   200                                                                             68
   300                                                                             68
   400                                                                             69
   500                                                                             94
   600                                                                           1067
   700                                                                          12799  
   800                                                                          25884
   900                                                                          35542
  1000                                                                          49957
  1200                                                                     near 50000
  1300                                                                     near 50000
  1400                                                                     near 50000
  1472                                                                          48338
  1473                                                                             71
Результат выглядит странно, сначала при малых размерах дейтаграмм на сервере принимается малое количество дейтаграмм. Затем при приближении размера дейтаграммы к 1472 происходит рост числа принятых дейтаграмм.
И при размере дейтаграммы 1473 опять количество принятых очень мало.

У меня есть идея почему при 1473 начинает приниматься так мало дейтаграмм.

Максимальный размер канального кадра Ethernet (MTU) - 1500 байт(возможно он плавает и не так детерменирован, это я не знаю).
Соответственно максимальный размер пользовательских данных UDP дейтаграммы без фрагментации -
1500 - заголовок UDP (8) - заголовок IP (20) = 1472
Это значит, что дейтаграммы размера 1473 уже будут подвергнуты фрагментации при передачи, и, возможно, т.к. фрагментация на клиенте будет проходить быстрее, чем обратная операция на сервере, то количество принятых дейтаграмм так мало.

Для пакетов малого размера (10 байт) возможна достройка до какого-то фикс. размера ,может это тоже приведет к потерям при передаче.

Но в общем случае мне непонятно, почему так прыгает результат принятых дейтаграмм.

P.S.
вот еще немного принятых данных (для больших размеров дейтаграмм)

C
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
DGLEN (размер одной дейтаграммы)     COUNT (количество дейтаграмм, полученных на сервере)
1600                                                    70
2000                                                    72
2100                                                    1125
2200                                                    6021
2300                                                   10404
2500                                                   20370
2800                                                   30046
2900                                                   37729
2944                                                   39052
2950                                                   39610
2952                                                   42907
2953                                                   15540
3000                                                   15587
3100                                                   21373
0
IT_Exp
Эксперт
34794 / 4073 / 2104
Регистрация: 17.06.2006
Сообщений: 32,602
Блог
25.02.2016, 14:00
Ответы с готовыми решениями:

Тестирование производительности движка
Какие существуют способы тестирования производительности движка? Есть ли какие-нибудь способы выявления стандартных уязвимостей?

Тестирование производительности сервиса
Есть небольшой RESTful веб сервис оформленный в виде сервлета и запущенный на glassfish. Сервис обрабатывает запросы клиентов и отдаёт...

Тестирование производительности. Замеры времени выполнения кода
Подскажите пожалуйста, есть ли способы (простые) что бы протестировать код на производительность, допустим в C# есть специальный класс -...

4
1267 / 980 / 385
Регистрация: 02.09.2012
Сообщений: 3,027
25.02.2016, 17:21
Мне кажется в статистике не хватает вывода и анализа полученных received байт. Вы выводите не сколько дейтаграмм полученно, а сколько раз вызывался recvfrom. При этом нигде не сказано, сколько байт было принято в каждом recvfrom.
0
0 / 0 / 0
Регистрация: 15.10.2012
Сообщений: 10
25.02.2016, 17:27  [ТС]
Я еще раз проверю, но у меня получалось, что
количество байт = (количество полученных дейтаграмм) * (размер дейтаграммы)
, то есть дейтаграммы приходили "полностью", если я не ошибаюсь.
(Можно еще утилиткой netstat посмотреть, сколько дейтаграмм отвалилось кстати)

Кстати меня еще интересует, возможно ли навинтить поверх сокетов SSL? У меня получалось создавать SSL сокет поверх обычного сокета, но это в случае TCP(я создавал самоподписанный сертификат, и создавал SSL сокеты "в коде") . А вот насколько это реально в случае UDP...
Я не нашел примера кода ни одного пока что.
0
1267 / 980 / 385
Регистрация: 02.09.2012
Сообщений: 3,027
26.02.2016, 14:37
Я не уверен, что прав, но может быть это наведет вас на верное решение.
0
0 / 0 / 0
Регистрация: 15.10.2012
Сообщений: 10
26.02.2016, 15:38  [ТС]
Да я уже нашел, что теоретически это можно использовать. Хотя надо еще почитать, проблема в том что если код про использование ssl поверх TCP сокетов найти можно, вот например:
http://www.informit.com/articl... px?p=22078
То про использование SSL поверх UDP пока ничего простого и понятного не найти, обычно это означает, что копание инфы в неверном направлении происходит.., хотя и не факт

Я нашел про dtls вот такую штуку, но это какая-то сторонняя библиотека
https://github.com/wolfSSL/wol... dp-dtls.md
Есть еще что-то такое
https://gist.github.com/roxlu/9841988

Но простого примера с DTLS + SOCK_DGRAM не нахожу (и мне желательно использовать OpenSSL).
Можно конечно тупо шифровать opensslем пакет, а затем передавать его, и опять дешифровать, но мне кажется это неверное решение, хочется какой-то протокол поверх транспортного (UDP) использовать
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
BasicMan
Эксперт
29316 / 5623 / 2384
Регистрация: 17.02.2009
Сообщений: 30,364
Блог
26.02.2016, 15:38
Помогаю со студенческими работами здесь

Тестирование производительности программы написанной с использованием CUDA Runtime API
Уважаемые форумчане. У меня возник один вопрос: имеется программа меняющая местами сектора двух матриц больших размеров около 4 * 10^8, 4...

Передача с микрофона в udp и прием из udp на динамик
Собственно каким образом осуществить передачу данных с микрофона в сеть и прием из сети данных вывести на звуковое устройство. проект...

Удаленное тестирование приложение/Пересылка на тестирование
Если кто-то написал приложение под андроид и захочет показать другому человеку, то достаточно отослать apk. А как обстоит с этим дело в...

Unit -тестирование или автоматизированное тестирование
Доброго времени суток. Я программирую «для себя» второй год, на выходе получаются разного рода приложения от постоянно подающих с...

Тестирование (или Юнит тестирование)
Доброго времени суток, возник такой вопрос, раньше встречался на фронтенде с js тестированием, сейчас задался вопросом по поводу...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
5
Ответ Создать тему
Новые блоги и статьи
модель ЗдравоСохранения 8. Подготовка к разному выполнению заданий
anaschu 08.04.2026
https:/ / github. com/ shumilovas/ med2. git main ветка * содержимое блока дэлэй из старой модели теперь внутри зайца новой модели 8ATzM_2aurI
Блокировка документа от изменений, если он открыт у другого пользователя
Maks 08.04.2026
Алгоритм из решения ниже реализован на примере нетипового документа, разработанного в конфигурации КА2. Задача: запретить редактирование документа, если он открыт у другого пользователя. / / . . .
Система безопасности+живучести для сервера-слоя интернета (сети). Двойная привязка.
Hrethgir 08.04.2026
Далее были размышления о системе безопасности. Сообщения с наклонным текстом - мои. А как нам будет можно проверить, что ссылка наша, а не подделана хулиганами, которая выбросит на другую ветку и. . .
Модель ЗдрввоСохранения 7: больше работников, больше ресурсов.
anaschu 08.04.2026
работников и заданий может быть сколько угодно, но настроено всё так, что используется пока что только 20% kYBz3eJf3jQ
Дальние перспективы сервера - слоя сети с космологическим дизайном интефейса карты и логики.
Hrethgir 07.04.2026
Дальнейшее ближайшее планирование вывело к размышлениям над дальними перспективами. И вот тут может быть даже будут нужны оценки специалистов, так как в дальних перспективах всё может очень сильно. . .
Горе от ума
kumehtar 07.04.2026
Эта мне ментальная установка, что вот прямо сейчас, мол, мне для полного счастья не хватает (нужное вписать), и когда я этого достигну - тогда и полный кайф. Одна из самых сильных ловушек на пути. . . .
Использование значений реквизитов справочника в документе, с определенными условиями и правами
Maks 07.04.2026
1. Контроль срока действия договора Алгоритм из решения ниже реализован на примере нетипового документа "ЗаявкаНаРаботу", разработанного в конфигурации КА2. Задача: уведомлять пользователя, если. . .
Доступность команды формы по условию
Maks 07.04.2026
Алгоритм из решения ниже реализован на примере нетипового документа "СписаниеМатериалов", разработанного в конфигурации КА2. Задача: сделать доступной кнопку (команда формы "ЗавершитьСписание") при. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru