Как узнать, какой ReceiveBufferSize установить? - PullRequest
3 голосов
/ 23 марта 2012

Я понял, что по умолчанию ReceiveBufferSize (8192) у меня не работает - я теряю пакет Сокеты: иногда (редко) пакеты теряются при получении

Однако в msdn есть предупреждение об увеличении BufferSize:

http://msdn.microsoft.com/ru-ru/library/system.net.sockets.socket.receivebuffersize.aspx Больший размер буфера потенциально уменьшает количество пустых подтверждений (TCP-пакетов без порции данных), но может также задержать распознавание трудностей подключения. Рассмотрите возможность увеличения размера буфера, если вы передаете большие файлы или используете соединение с высокой пропускной способностью и высокой задержкой (например, широкополосный спутниковый провайдер).

Я знаю, что мне нужно получать ~ 2000 пакетов в секунду, и каждая дейтаграмма содержит около 50-100 байт данных. Я использую соединение с низкой задержкой (все в локальной сети). Я получаю данные биржи от многоадресной рассылки udp, поэтому иногда трафик мой значительно скачок (банкротство братьев Леман и т. Д.), Но давайте предположим, что я не буду получать более 20 000 пакетов в секунду.

Как рассчитать ReceiveBufferSize, который будет соответствовать моим потребностям?

Я абсолютно не согласен терять пакеты, но я не теряю производительности, надежности или чего-либо еще.

1 Ответ

4 голосов
/ 23 марта 2012

Нет ideal figure, который вы можете предоставить для ReceiveBufferSize на основании предоставленной вами информации.
Помимо вашего worse-case incoming data rate, это зависит от rate at which you process messages и от того, можете ли вы продолжать делать это, когда вас засыпают сообщениями.

Как уже упоминалось в комментарии к вашему вопросу, вы должны профиль ваше заявление в стрессовых условиях, чтобы найти лучшее значение, которое работает all the time для вас.

В качестве альтернативы, вы можете начать со значения по умолчанию ReceiveBufferSize и увеличивать его, когда вы пересекаете порог, когда вы ожидаете потерять пакеты, и снова снижаете его, когда ситуация нормализуется. Этот подход требует много работы.

РЕДАКТИРОВАНИЕ:

В среднем вы будете обрабатывать данные быстрее, чем вы их получите. Но могут быть ситуации, когда вы , возможно, не сможете process data at all (например, вам, возможно, придется записывать в базу данных синхронно или последовательно каждые 100 полученных вами сообщений). В этом случае вы должны убедиться, что ваш буфер может обрабатывать данные, поступающие в at that moment.

Поскольку в худшем случае вы можете получать до 20 тыс. Пакетов в секунду, каждый из которых имеет размер 100 байт, если вы установите размер буфера в 2 МБ (20 тыс. * 100 байт), вы сможете работать примерно секунду without processing any data из дальнего конца.

Аналогично, если вы ожидаете, что ваш поток будет работать без чтения из буфера, дольше x секунд, тогда размер буфера должен быть x * 2 MB + (expected size of buffer at such a time)

Надеюсь, это поможет.

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