powered by simpleCommunicator - 2.0.59     © 2025 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / C++ [игнор отключен] [закрыт для гостей] / Как выжать весь гигабит по UDP?
25 сообщений из 162, страница 2 из 7
Как выжать весь гигабит по UDP?
    #38894960
miksoft
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Basil A. SidorovВы плохо понимаете какой фигнёй мается автор.Возможно :)
Basil A. SidorovА DNS работает "на общих основаниях" - пакет на сервер отправляет "nat-ируемый" компьютер.Совсем "на общих" - сомневаюсь, иначе бы потери пакетов сильно мешали бы серфингу (на современных сайтов бывает используется по несколько десятков доменов сразу). Но, возможно, каким-то приоритетом обладают только DNS-пакеты к собственному операторскому серверу. Тут узнать можно только попробовав.
...
Рейтинг: 0 / 0
Как выжать весь гигабит по UDP?
    #38894968
Leonid Kudryavtsev
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
miksoft(на современных сайтов бывает используется по несколько десятков доменов сразу)
IMHO & AFAIK нормальный dns клиент запросы кеширует. Иначе dns сервера верхнего уровня банально бы легли.
...
Рейтинг: 0 / 0
Как выжать весь гигабит по UDP?
    #38895008
Basil A. Sidorov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
miksoftСовсем "на общих" - сомневаюсь, иначе бы потери пакетов сильно мешали бы серфингуЧто же за нашествие непуганных оптимистов???
Неужели весна так влияет???
...
Рейтинг: 0 / 0
Как выжать весь гигабит по UDP?
    #38895043
Dima T
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Что касаемо 53 порта, замечено: НАТам запутывание не нужно, они стараются дать внутреннему клиенту тот же порт на внешке, какой есть в локалке. Т.е. если я начну слушать 53 порт, то и за НАТом скорее всего будет 53. Но если в локалке будет две моих проги на 53 порту, то 100% одна будет не на 53 и это не решить никакими настройками НАТа.

Фиг с ними с GSM-свистками, у меня таких клиентов немного, 2-3% максимум.
...
Рейтинг: 0 / 0
Как выжать весь гигабит по UDP?
    #38895047
Dima T
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Basil A. SidorovВы плохо понимаете какой фигнёй мается автор.
Если хорошо понимаешь - поделился бы опытом, т.к. забег по граблям вынужденная необходимость.
...
Рейтинг: 0 / 0
Как выжать весь гигабит по UDP?
    #38895050
miksoft
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Dima TНо если в локалке будет две моих проги на 53 порту, то 100% одна будет не на 53 и это не решить никакими настройками НАТа.За все наты не поручусь, но приличные наты учитывают адрес другой стороны. Так что, думаю, не 100%.

Да и часто ли за свистком сидит целая локалка, а не одинокий комп?
...
Рейтинг: 0 / 0
Как выжать весь гигабит по UDP?
    #38895065
Dima T
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
miksoftДа и часто ли за свистком сидит целая локалка, а не одинокий комп?
Затупил, виноват. Дествительно надо попробовать свистки полечить сначала 53 портом на стороне свистка. Спасибо за идею.
...
Рейтинг: 0 / 0
Как выжать весь гигабит по UDP?
    #38895081
Фотография Anatoly Moskovsky
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Я думаю что если на DNS порте обнаружится существенный трафик, то его источник быстро придавят ))
...
Рейтинг: 0 / 0
Как выжать весь гигабит по UDP?
    #38895082
Dima T
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Не люблю быть ТС, т.к. очень много не по теме отвечать приходится. Всем ответил, хорошо/плохо, другой вопрос. Хватит глумиться, не для того топик заводил.
Давайте по теме. Есть какие-нибудь мысли как виндовс заставить отдать UDP гигабит в локалке? Меня устраивают 80 мбит, которые имею, но обидно что не 1000 :)
...
Рейтинг: 0 / 0
Как выжать весь гигабит по UDP?
    #38895088
Фотография mayton
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
...
Рейтинг: 0 / 0
Как выжать весь гигабит по UDP?
    #38895474
Dima T
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Код теста
Код: plaintext
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.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
44.
45.
46.
47.
48.
49.
50.
51.
52.
53.
54.
55.
56.
57.
58.
59.
#include <winsock2.h>
#include <Ws2tcpip.h>
#pragma comment(lib, "Ws2_32.lib")

#include <stdio.h>
#include <stdlib.h>
#include <time.h>

void send_udp_window(SOCKET sock, char* msg, int size, char* addr_str, int port, int window)
{
	sockaddr_in addr;
	addr.sin_family = AF_INET;
	addr.sin_port = htons(port);
	addr.sin_addr.s_addr = inet_addr(addr_str);
	printf("send %d packets %d byte ", window, size * window);
	clock_t start = clock();
	while(window--) {
		int send = sendto(sock, msg, size, 0, (SOCKADDR *) &addr, sizeof(sockaddr_in));
		if(send != size) {
			printf("failed %d\n", send);
		}
	}
	printf("OK time %d msec\n", clock() - start);
	Sleep(1000);
}

void main(int argc, char* argv[])
{
	WSADATA wsaData;
	if(WSAStartup(MAKEWORD(2, 2), &wsaData) != NO_ERROR) {
		printf("WSAStartup()\n");
		return;
	}

	sockaddr_in addr_in;
	addr_in.sin_family = AF_INET;
	addr_in.sin_port = htons(0);
	addr_in.sin_addr.s_addr = htonl(INADDR_ANY);
	SOCKET sock_udp = socket(AF_INET, SOCK_DGRAM, IPPROTO_UDP);
	DWORD size = 15000000;
	if (setsockopt(sock_udp, SOL_SOCKET, SO_SNDBUF, (char *) &size, sizeof(size)) == -1 ) {
		printf("setsockopt SO_SNDBUF failed\n");
	}

	if(bind(sock_udp, (SOCKADDR *) &addr_in, (socklen_t) sizeof(sockaddr_in)) != 0) {
		printf("bind()\n");
		return;
	}

	char msg[1472];
	char ip[] = "192.168.0.1";
	int port = 12345;
	send_udp_window(sock_udp, msg, 1472, ip, port, 10);
	send_udp_window(sock_udp, msg, 1472, ip, port, 100);
	send_udp_window(sock_udp, msg, 1472, ip, port, 1000);
	send_udp_window(sock_udp, msg, 1472, ip, port, 10000);

	system("pause");
}


Тупо вызов sendto() в цикле.

Результат на Win7
Код: plaintext
1.
2.
3.
4.
send 10 packets 14720 byte OK time 0 msec
send 100 packets 147200 byte OK time 15 msec
send 1000 packets 1472000 byte OK time 156 msec
send 10000 packets 14720000 byte OK time 1669 msec

Т.е. скорость отправки 14720000 / 1669 = 8680 кбайт/сек. или 86 мбит в гигабитной сетке :(

Вывод: тормозит sendto(), чем занимается непонятно, т.к. проц более 1-2% не грузит.


Адрес в тестах стоял реальный, там линукс, он принимал. Я линукс вырубил, стало так
Код: plaintext
1.
2.
send 10 packets 14720 byte OK time 29730 msec
send 100 packets 147200 byte OK time 300000 msec


Это же капец полный. Загрузка проца 0%. Чего виндовс делает? Пингует перед отправкой каждого пакета?
Потестил указывая несуществующие IP из своей локалки - такое же зависание.

Надо как-то лечить эту фигню. Пока мысль мерить время, все что подвисло - вносить в черный список и больше на них ничего не слать.

Поизучал что можно через setsockopt() понастраивать, ничего подходящего не нашел. Где еще можно покопаться? Что-то менять в реестре виндовса наихудший вариант, пока надеюсь без него обойтись.
...
Рейтинг: 0 / 0
Как выжать весь гигабит по UDP?
    #38895543
miksoft
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Dima TЯ линукс вырубил,ну а на arp-ы отвечать кто будет?
...
Рейтинг: 0 / 0
Как выжать весь гигабит по UDP?
    #38895715
Dima T
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
miksoftDima TЯ линукс вырубил,ну а на arp-ы отвечать кто будет?
Наверно из-за них. Добавил таймаут отправки 1 мс
Код: plaintext
1.
2.
3.
4.
	DWORD time = 1; // 1 мс
    if(setsockopt(sock_udp, SOL_SOCKET, SO_SNDTIMEO, (const char*)&time, sizeof(time)) == -1 ) {
		printf("setsockopt SO_SNDTIMEO failed\n");
	}


sendto() стал давать ошибку на несуществующих адресах, но все равно висит 3 сек, а не 1 мс. Придется время засекать и черный список заводить.

На тормоза отправки на реальный адрес это никак не влияет, т.к. существующий адрес уже есть в кэше ARP.

Затестил по 100 мбитной сетке - 2 мбита максимум. Похоже я не одинок в таких тестах . МС походу специально такую гадость сделали.

Решил вынести отправку в отдельный поток, пусть хотя бы там тормозит. Попробую слать сразу несколькими потоками, может один сокет переварит такое.
...
Рейтинг: 0 / 0
Как выжать весь гигабит по UDP?
    #38895722
miksoft
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Dima TПопробую слать сразу несколькими потоками, может один сокет переварит такое.по моей же ссылке вышеIssuing another blocking Winsock call inside an APC that interrupted an ongoing blocking Winsock call on the same thread will lead to undefined behavior, and must never be attempted by Winsock clients.
...
Рейтинг: 0 / 0
Как выжать весь гигабит по UDP?
    #38895911
Barlone
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Dima TПоизучал что можно через setsockopt() понастраивать, ничего подходящего не нашел. Где еще можно покопаться? Что-то менять в реестре виндовса наихудший вариант, пока надеюсь без него обойтись.SO_SNDBUF? А еще можно попробовать вместо sendto вызвать один раз connect (да, для udp тоже можно) и дальше слать send - вдруг оно по другому будет...
...
Рейтинг: 0 / 0
Как выжать весь гигабит по UDP?
    #38895922
Dima T
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Нашел лекарство
Код: plaintext
1.
2.
3.
4.
	u_long mode = 1;
	if (ioctlsocket(sock_udp, FIONBIO, &mode) != 0) {
		printf("ioctlsocket FIONBIO failed\n");
	}


Оказывается есть блокирующие UDP сокеты.

640 мбит виндовс-виндовс. УРА !!!
Не гигабит, но уже что-то. Чтобы еще ускорить наверно надо другие проблемы решать.

Линуксу от этой опции поплохело, в два раза медленнее стал.

PS МС оправдан, но все равно странно что так сильно тупило.
...
Рейтинг: 0 / 0
Как выжать весь гигабит по UDP?
    #38895949
Barlone
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Dima T, а оно до адресата доходит?
If no buffer space is available within the transport system to hold the data to be transmitted, send will block unless the socket has been placed in nonblocking mode. On nonblocking stream-oriented sockets, the number of bytes written can be between 1 and the requested length, depending on buffer availability on both client and server machines.
...
Рейтинг: 0 / 0
Как выжать весь гигабит по UDP?
    #38895974
Dima T
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
BarloneDima T, а оно до адресата доходит?
If no buffer space is available within the transport system to hold the data to be transmitted, send will block unless the socket has been placed in nonblocking mode. On nonblocking stream-oriented sockets, the number of bytes written can be between 1 and the requested length, depending on buffer availability on both client and server machines.
Доходит, потерь 0.

Вписал в рабочую прогу. Добавил 3 Мб буфера SO_SNDBUF, окно отправки 32 пакета, т.е. всего 48 кб.
...
Рейтинг: 0 / 0
Как выжать весь гигабит по UDP?
    #38896224
Basil A. Sidorov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Dima Tзабег по граблям вынужденная необходимость.Моё мнение вас не устроило, а добавить к уже сказанному мне нечего.
...
Рейтинг: 0 / 0
Как выжать весь гигабит по UDP?
    #38896257
Фотография mayton
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Дима IPerf пробовал?
...
Рейтинг: 0 / 0
Как выжать весь гигабит по UDP?
    #38896415
Dima T
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
maytonДима IPerf пробовал?
Если я правильно его понимаю, то 500 мбит он подтвердил, а когда прошу больше, он дает меньше 500.
результаты
Код: plaintext
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.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
44.
45.
46.
47.
48.
49.
50.
51.
52.
53.
54.
55.
56.
C:\Download\iperf-2.0.5-3-win32>iperf -c 192.168.0.1 -u -b 500m -w 3m
------------------------------------------------------------
Client connecting to 192.168.0.1, UDP port 5001
Sending 1470 byte datagrams
UDP buffer size: 3.00 MByte
------------------------------------------------------------
[  3] local 192.168.0.45 port 56435 connected with 192.168.0.1 port 5001
[ ID] Interval       Transfer     Bandwidth
[  3]  0.0-10.0 sec   610 MBytes   511 Mbits/sec
[  3] Sent 434768 datagrams
[  3] Server Report:
[  3]  0.0-10.0 sec   610 MBytes   511 Mbits/sec   0.446 ms 61133/434767 (14%)
[  3]  0.0-10.0 sec  61134 datagrams received out-of-order


C:\Download\iperf-2.0.5-3-win32>iperf -c 192.168.0.1 -u -b 600m -w 3m
------------------------------------------------------------
Client connecting to 192.168.0.1, UDP port 5001
Sending 1470 byte datagrams
UDP buffer size: 3.00 MByte
------------------------------------------------------------
[  3] local 192.168.100.45 port 58740 connected with 192.168.0.1 port 5001
[ ID] Interval       Transfer     Bandwidth
[  3]  0.0-10.0 sec   370 MBytes   310 Mbits/sec
[  3] Sent 263880 datagrams
[  3] Server Report:
[  3]  0.0-10.0 sec   370 MBytes   310 Mbits/sec   0.105 ms 33670/263879 (13%)
[  3]  0.0-10.0 sec  33671 datagrams received out-of-order


C:\Download\iperf-2.0.5-3-win32>iperf -c 192.168.0.1 -u -b 800m -w 3m
------------------------------------------------------------
Client connecting to 192.168.0.1, UDP port 5001
Sending 1470 byte datagrams
UDP buffer size: 3.00 MByte
------------------------------------------------------------
[  3] local 192.168.0.45 port 62350 connected with 192.168.0.1 port 5001
[ ID] Interval       Transfer     Bandwidth
[  3]  0.0-10.0 sec   513 MBytes   430 Mbits/sec
[  3] Sent 365801 datagrams
[  3] Server Report:
[  3]  0.0-10.0 sec   513 MBytes   430 Mbits/sec   0.269 ms 47710/365800 (13%)
[  3]  0.0-10.0 sec  47711 datagrams received out-of-order

C:\Download\iperf-2.0.5-3-win32>iperf -c 192.168.0.1 -u -b 1000m -w 3m
------------------------------------------------------------
Client connecting to 192.168.0.1, UDP port 5001
Sending 1470 byte datagrams
UDP buffer size: 3.00 MByte
------------------------------------------------------------
[  3] local 192.168.0.45 port 58409 connected with 192.168.0.1 port 5001
[ ID] Interval       Transfer     Bandwidth
[  3]  0.0-10.0 sec   430 MBytes   360 Mbits/sec
[  3] Sent 306732 datagrams
[  3] Server Report:
[  3]  0.0-10.0 sec   430 MBytes   361 Mbits/sec   0.504 ms 39963/306731 (13%)
[  3]  0.0-10.0 sec  39964 datagrams received out-of-order
...
Рейтинг: 0 / 0
Как выжать весь гигабит по UDP?
    #38896416
Фотография mayton
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
А попробуй дернуть вообще без ограничителя 500m
...
Рейтинг: 0 / 0
Как выжать весь гигабит по UDP?
    #38896421
Dima T
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
maytonА попробуй дернуть вообще без ограничителя 500m
А напиши как :)
Как я понял это не ограничитель, а требуемая скорость. Без -b он берет дефолтный 1 мбит.
...
Рейтинг: 0 / 0
Как выжать весь гигабит по UDP?
    #38896427
Фотография mayton
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Посмотри как тут.

http://openmaniak.com/iperf.php

Вообще минимум параметров.
...
Рейтинг: 0 / 0
Как выжать весь гигабит по UDP?
    #38896431
Dima T
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
вот какая фигня получается
Код: plaintext
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.
27.
28.
29.
30.
31.
32.
33.
C:\Download\iperf-2.0.5-3-win32>iperf -c 192.168.0.1 -u -b -w 3m
/iperf-2.0.5-3-win32/iperf: ignoring extra argument -- 3m
WARNING: delay too large, reducing from -------------------------------------------------------------2147.
5 to 1.0 seconds.
Client connecting to 192.168.0.1, UDP port 5001
Sending 1470 byte datagrams
nanosleepUDP buffer size: 63.0 KByte (default) failed: Invalid argument

------------------------------------------------------------
nanosleep[  3] local 192.168.0.45 port 60178 connected with 192.168.0.1 port 5001 failed: Invalid argument

nanosleep failed: Invalid argument
nanosleep failed: Invalid argument
[ ID] Interval       Transfer     Bandwidth
[  3]  0.0-11.7 sec  23.0 KBytes  16.1 Kbits/sec
[  3] Sent 16 datagrams
[  3] Server Report:
[  3]  0.0-11.7 sec  23.0 KBytes  16.1 Kbits/sec   0.513 ms    0/   16 (0%)



C:\Download\iperf-2.0.5-3-win32>iperf -c 192.168.0.1 -u -w 3m
------------------------------------------------------------
Client connecting to 192.168.0.1, UDP port 5001
Sending 1470 byte datagrams
UDP buffer size: 3.00 MByte
------------------------------------------------------------
[  3] local 192.168.0.45 port 57842 connected with 192.168.0.1 port 5001
[ ID] Interval       Transfer     Bandwidth
[  3]  0.0-10.0 sec  1.25 MBytes  1.05 Mbits/sec
[  3] Sent 893 datagrams
[  3] Server Report:
[  3]  0.0-10.0 sec  1.25 MBytes  1.05 Mbits/sec   0.403 ms    0/  892 (0%)
[  3]  0.0-10.0 sec  1 datagrams received out-of-order
...
Рейтинг: 0 / 0
25 сообщений из 162, страница 2 из 7
Форумы / C++ [игнор отключен] [закрыт для гостей] / Как выжать весь гигабит по UDP?
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]