1.2 - это именно скорость отсылки без учета потерь (удп не...26.12.04 12:22 Число просмотров: 2576 Автор: Killer{R} <Dmitry> Статус: Elderman Отредактировано 26.12.04 12:29 Количество правок: 1
1.2 - это именно скорость отсылки без учета потерь (удп не гарантирует доставку пакетов)?
Возможно дело тут и в самой винде - всетаки если слать через тсп то совершается меньше вызовов юзер-кернел т.к. можно засунуть в единичный сенд большой блок данных который затем нарежеться по пакетам непосредственно в ядре (в tcpip.sys). Да и в буфер сетевухи они могут передаваться за одну транзакцию по шине. Вобщем разные тонкости тут могут быть). Как кстати дело обстоит с загрузкой процессора при посылке по УДП с максимальной скоростью?
Написал прогу для многоадресной рассылки файла, точнее две - "отправителя" и "приемника". Проверить в сети на нескольких машинах нет пока возможности, поэтому тестил локально. Так вот, скорость отсылки составляет всего ~700-800 Kbps. На холостом ходу, т.е. без "приемника" - 1.2 Mbps.
Такая же байда и с broadcast.
Даные передаю по 1469 Байт - размер полезных данных кадра Ethernet - наибольшая эффективность.
Для сравнения написал клиент и сервер на TCP. Тестил локально - 5-6 Mbps.
В чем причина? Как с этим бороться?
UDP vs TCP - source code26.12.04 12:55 Автор: Gorynich Статус: Незарегистрированный пользователь Отредактировано 26.12.04 12:58 Количество правок: 2
> > while (nLeft > 0) > { > ReadFile(hFile, SendBuf, nBytesToRead, > &nBytesRead, NULL) ; > ret = sendto(SendSocket, > SendBuf, > BufLen, > 0, > (SOCKADDR *) &RecvAddr, > sizeof(RecvAddr)); > nLeft -= ret; > } Помоему лучше считывать данные в большой буфер и его скармливать в sendto далее смещать адрдес буфера на размер переданных данных. Это вопервых сократит вызовы ReadFile на порядок и позволит стеку самому выбирать размер отправляемого в сеть сегмента.
ReadFile-памаметр nBytesToRead равен 4. Т.е. у тя читаецца...26.12.04 13:14 Автор: Killer{R} <Dmitry> Статус: Elderman Отредактировано 26.12.04 13:19 Количество правок: 1
> nLeft = GetFileSize(hFile, NULL); > nBytesRead = htonl(nLeft); > nBytesToRead = 4; > ret = sendto(SendSocket, > (char*)&nBytesRead, > nBytesToRead, > 0, > (SOCKADDR *) &RecvAddr, > sizeof(RecvAddr)); > > while (nLeft > 0) > { > ReadFile(hFile, SendBuf, nBytesToRead, > &nBytesRead, NULL) ; > ret = sendto(SendSocket, > SendBuf, > BufLen, > 0, > (SOCKADDR *) &RecvAddr, > sizeof(RecvAddr)); > nLeft -= ret; > } > CloseHandle(hFile); ReadFile-памаметр nBytesToRead равен 4. Т.е. у тя читаецца по 4 байта с файла для каждой посылкой. А шлеться в сеть мусор.. Ну это ладно - на скорость не влияет, учитывая что мусор шлеться размер файла/размер буфера раз Ж)
Лучше бы добавить флаг FILE_FLAG_SEQUENTIAL_SCAN в создании файла..
Размер блока данных лучше определять через getsockopt(..SO_MAX_MSG_SIZE..)
А какая скорость при посылке на на мультикаст а на существующий в сети ип?
С nBytesToRead провтыкал - оптимизировал :D.26.12.04 13:54 Автор: Gorynich Статус: Незарегистрированный пользователь Отредактировано 26.12.04 14:08 Количество правок: 1
> ReadFile-памаметр nBytesToRead равен 4. Т.е. у тя читаецца > по 4 байта с файла для каждой посылкой. А шлеться в сеть > мусор.. Ну это ладно - на скорость не влияет, учитывая что > мусор шлеться размер файла/размер буфера раз Ж)
С nBytesToRead провтыкал - оптимизировал :D.
> Размер блока данных лучше определять через > getsockopt(..SO_MAX_MSG_SIZE..)
65507. Но при таком размере скорость составляет 26 Kbps.
> А какая скорость при посылке не на мультикаст а на > существующий в сети ип?
~1.7 Mbps.
1.2 - это именно скорость отсылки без учета потерь (удп не...26.12.04 12:22 Автор: Killer{R} <Dmitry> Статус: Elderman Отредактировано 26.12.04 12:29 Количество правок: 1
1.2 - это именно скорость отсылки без учета потерь (удп не гарантирует доставку пакетов)?
Возможно дело тут и в самой винде - всетаки если слать через тсп то совершается меньше вызовов юзер-кернел т.к. можно засунуть в единичный сенд большой блок данных который затем нарежеться по пакетам непосредственно в ядре (в tcpip.sys). Да и в буфер сетевухи они могут передаваться за одну транзакцию по шине. Вобщем разные тонкости тут могут быть). Как кстати дело обстоит с загрузкой процессора при посылке по УДП с максимальной скоростью?
Если ты перед отправкой пакета каждый раз делаешь socket() -...26.12.04 11:55 Автор: YYY Статус: Незарегистрированный пользователь
> Скажите, пожалуйста, кто знает. > > Написал прогу для многоадресной рассылки файла, точнее две > - "отправителя" и "приемника". Проверить в сети на > нескольких машинах нет пока возможности, поэтому тестил > локально. Так вот, скорость отсылки составляет всего > ~700-800 Kbps. На холостом ходу, т.е. без "приемника" - 1.2 > Mbps. > Такая же байда и с broadcast.
Если ты перед отправкой пакета каждый раз делаешь socket() - то из-за этого (это довольно медленная операция), если нет, то не знаю.. код давай.
> Даные передаю по 1469 Байт - размер полезных данных кадра > Ethernet - наибольшая эффективность.
а вот и нет (см. ниже)
> Для сравнения написал клиент и сервер на TCP. Тестил > локально - 5-6 Mbps.
а у меня через сетку 11 :)
поигравшись я пришел к тому, что для (нашей, 100М) локалки буфер в 4К дает наибольшую скорось, дальнейишее увеличение не влияет
Не надо путать размер ethernet фрейма который влияет на...26.12.04 12:16 Автор: Killer{R} <Dmitry> Статус: Elderman
> а у меня через сетку 11 :) > поигравшись я пришел к тому, что для (нашей, 100М) локалки > буфер в 4К дает наибольшую скорось, дальнейишее увеличение > не влияет Не надо путать размер ethernet фрейма который влияет на максимальный размер датаграммы передаваемой через удп сокет и размер буфера передаваемого в единичный send потоко-ориентированного тсп сокета.