![]() |
Модераторы: feodorv |
![]() ![]() ![]() |
|
IEHBR |
|
|||
Новичок Профиль Группа: Участник Сообщений: 16 Регистрация: 22.9.2004 Репутация: нет Всего: нет |
Мож кто нить знает способ передавать порядка тысячи сообщений в секунду.
Все чего смог добиться с помощью сокетов - 400 сообщений. Надо больше. ![]() |
|||
|
||||
azesmcar |
|
|||
![]() uploading... ![]() ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 6291 Регистрация: 12.11.2004 Где: Армения Репутация: 3 Всего: 211 |
Какие сокеты используешь?? попробуй АПИ функции сокетов...
socket() bind() accept() итд итп... кроме того используй потоки, а вообще какого размера сообщения??? Можешь попробовать запихнуть их сразу в одно сообщение с разделителем и отправить... а там уже при получении разбить на части... |
|||
|
||||
IEHBR |
|
|||
Новичок Профиль Группа: Участник Сообщений: 16 Регистрация: 22.9.2004 Репутация: нет Всего: нет |
использую апи, потоки (один на прием второй на посылку), очередь в оперативке.
сообщения длинной 100000 байт тк по моим подсчетам от длинны сообщения время на отправку/прием зависит не сильно - но все равно при любой обработке сообщения процесс тормозится на сотни - скорость падает до 100 сообщений в секунду. Никаких других способов нет? ![]() |
|||
|
||||
azesmcar |
|
|||
![]() uploading... ![]() ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 6291 Регистрация: 12.11.2004 Где: Армения Репутация: 3 Всего: 211 |
А если так...
берешь deque пихаешь туда все свои сообщения Начинаем отправку, два потока читают из очереди один pop_front, другой pop_back а третий после отправки этой заполняет очередь оба потока читают данные из deque и отправляют каждый до тех пор пока size()!=0 тут в принципе не помешало бы и провести общую оптимизацию кода, при стольких действиях каждая мелочь может повлиять на производительность... Это вариант, но не могу точно сказать, зависит от того какая у тебя конкретная задача? Отправить одно сообщение размером в 1000 * 100000 байт будет быстрее чем 1000 раз по 100000 байт...можно все же попробуешь отправить 1000 сообщений в одном... Несколько сообщений имеет смысл отправлять если на разных событиях..а если тебе в любом случае нужно отправить эти 1000 сообщений и все они тебе известны то какой смысл все равно при такой скорости они весьма быстро окажутся в одном буффере, ты даже может не успеешь прочитать одно а в буффере будет второе... |
|||
|
||||
Mad |
|
||||
Опытный ![]() ![]() Профиль Группа: Эксперт Сообщений: 656 Регистрация: 18.10.2004 Где: Одесса Репутация: 3 Всего: 19 |
Ты и так получил 10к/с, что для отдельных посылок неплохо. Вопрос успевает ли твоя прога столько обрабатывать на приеме ? код приведи. |
||||
|
|||||
IEHBR |
|
|||
Новичок Профиль Группа: Участник Сообщений: 16 Регистрация: 22.9.2004 Репутация: нет Всего: нет |
Делаю чтото вроде системы безопасности. Сообщений нужно минимум 24*25=600
в секунду. Сейчас тестим на максимуме - и поэтому длинна каждого 50000 байт. /*код упращенный ![]()
мож кто подскажет как улучшить.... ![]() заранее благодарен |
|||
|
||||
Mad |
|
|||
Опытный ![]() ![]() Профиль Группа: Эксперт Сообщений: 656 Регистрация: 18.10.2004 Где: Одесса Репутация: 3 Всего: 19 |
Во первых recv не гарантирует, что примен 50к одним махом ![]() |
|||
|
||||
n |
|
|||
Unregistered |
там вместо recv на самом деле ф-ция readn след. вида:
|
|||
|
||||
Fire-Plug |
|
||||||
![]() Шустрый ![]() Профиль Группа: Участник Сообщений: 102 Регистрация: 15.3.2005 Репутация: нет Всего: 0 |
Приведенный выше фрагмент кода уже неэффективен для критических операций, т.к. в отношении эффективности менеджеров динамической памяти для различных ОС хвалебные отзывы, как правило, не встречаются или же встречаются крайне редко. Размер сообщения заранее известен, поэтому естественней было бы выделить буфер для приема данных ВНЕ рабочего цикла:
У вас что, и в реальном коде память под сообщение выделяется каждый раз? Это может быть оправданно только тогда, когда приём и обработка сообщения происходит асинхронно, для чего сообщение требуется поместить в некую выходную очередь. Затем, на скорость передачи в реальных условиях влияет и топология вашей сети, и ее технические параметры, а также характеристики "железа" и OC на узловых PC, где вы запускаете вашу систему. Т.е. проблема может быть в области средств связи, а не программирования. У меня сейчас где-то подобная задача, только разница в том, что размер "сообщения" - переменный. Но обработка сообщения происходит в цикле приёма, поэтому память под приёмный буфер распределена заранее и только, если придет сообщение бОльшего размера, чем размер буфера, то последний перераспределяется. Загловок сообщения содержит его размер, поэтому длина передачи всегда известна. Так вот в секунду передаётся ~10K * 15[1/сек] * 60 каналов (в среднем, т.к. зависит от числа клиентов) = ~9000 К/сек. Серверное приложение сидит на P4 2 GHz, NIC - 100 Mbps интегрированная на маме, ОС - Win2000 Server SP4. Сеть - 100 Mbps с массой раутеров и сегментов. При этом загрузка сетевых ресурсов PC-сервера по результатам измерений находится в области 50%. Добавлено @ 08:22 Во, блин, не обратил внимания - тема-то уже не новая... ![]() --------------------
Объясни другому - поймешь сам (Народная примета) |
||||||
|
|||||||
knave |
|
|||
![]() Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 320 Регистрация: 6.3.2003 Где: Санкт-Питербург ( Россия) Репутация: 1 Всего: 5 |
Надо паковать твои данные. Не пакуя ты неполучиш бльшой скорости при передаче больших объемов. Игры обычно пакуют свои блоки данных, которыми они обмениваются по сети, иначе никак.
Да, не следует слать большие блоки заодин раз. Если в сокет запихать скжем 4кб то они на клиенте косо примутся или затрутся тем что пришло после. Вообщем бери свой блок котрый ты хочеш послать, пакуй, шли, на том конце распаковывай. Шли при этом небольшими порциями, скажем по 512 байт. Скорость при пковке существенно возрастет, так как уменьшится врмя передачи куска. Распаковка произойдт значительно быстрее чем передача непакованного блока. Для передачи сипользуй UDP - по приходу пакета распаковывай его, как закончиш сним работу шли ответ. Очередной кусок шли только по получении ответа от клиента. Можно не обрабатывать, а кэшировать и потом обрабатывать из кэша. НО очередной кусок данных шли толко после того как ты его считаеш и поместиш в очередь. Для этог север должен ждать от клиента ответ - блок принят. Если это не сделать то твои блоки затрутся в сокете (даже при TCP, так как он гарантирет доставку пакетов, а как они там дальше это уже доло сокетов.). -------------------- С наилучшими пожеланиями !!! |
|||
|
||||
Arush |
|
|||
Новичок Профиль Группа: Участник Сообщений: 20 Регистрация: 10.11.2003 Репутация: нет Всего: 1 |
На самом деле надо использовать OVERLAPPED режим передачи, как об этом написано у мелкософт.
Попробуй поискать в МСДН по OVERLAPPED или efficient network programming. Там должны быть примеры. Суть в том, что когда используется обычный send то возврат из функции происходит только после отправки данных, когда ты используеь асинхронный оежим - возврат происходит сразу, а после отправки данных система уведомляет твой код, что они отправлены. |
|||
|
||||
knave |
|
|||
![]() Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 320 Регистрация: 6.3.2003 Где: Санкт-Питербург ( Россия) Репутация: 1 Всего: 5 |
Так это реально то не увеличит количество отправляемых сообщений в еденицу времени. Ну наставиш ты очередь из миллиона мессаг и что, скорость передачи по сети всеравно будет прежней.
-------------------- С наилучшими пожеланиями !!! |
|||
|
||||
Arush |
|
|||
Новичок Профиль Группа: Участник Сообщений: 20 Регистрация: 10.11.2003 Репутация: нет Всего: 1 |
А ты проверял?
Мелкософт не спроста это все затеяла и неспроста пишет что производительные сетевые приложения надо писать именно так. |
|||
|
||||
![]() ![]() ![]() |
1 Пользователей читают эту тему (1 Гостей и 0 Скрытых Пользователей) | |
0 Пользователей: | |
« Предыдущая тема | C/C++: Сети | Следующая тема » |
|
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности Powered by Invision Power Board(R) 1.3 © 2003 IPS, Inc. |