C # получить максимальное значение для Socket.ReceiveBufferSize и Socket.SendBufferSize в системе - PullRequest
13 голосов
/ 09 июня 2011

Наше приложение с высокой пропускной способностью (~ 1 Гбит / с) значительно выигрывает от больших ReceiveBufferSize и SendBufferSize.

Я заметил, что на моей машине я могу без проблем иметь размер буфера 100 МБ, но на некоторых клиентских и тестовых компьютерахМаксимальное значение составляет чуть более 10 МБ и кажется переменным.

Существуют ли какие-либо методы для запроса системы о том, каким может быть максимальный размер буфера tx / rx.

Ответы [ 2 ]

6 голосов
/ 10 июня 2011

На самом деле для высокопроизводительных сетей параметры SO_RCVBUF и SO_SNDBUF должны быть установлены на 0, чтобы избежать буферных копий, согласно KB181611 :

Если вы используете SO_RCVBUF и SO_SNDBUF возможность установить нулевой прием стека TCP и отправить буфер, вы в принципе поручить стеку TCP напрямую выполнить ввод / вывод, используя предоставленный буфер в вашем вызове ввода / вывода. Поэтому в дополнение к неблокирующему преимуществу перекрывающихся сокетов ввода / вывода, Другое преимущество - лучшая производительность потому что вы сохраняете буферную копию между буфер стека TCP и пользователь буфер для каждого вызова ввода / вывода . Но у тебя есть чтобы убедиться, что у вас нет доступа к пользователю буфер, как только он передан для перекрытая операция и перед Завершенная операция завершена.

Максимальные значения, которые вы можете установить для этих опций (которые являются реальными настройками для управляемых Socket.ReceiveBufferSize), зависят от реализации. Другие параметры TCP задокументированы в Настройки реестра TCP / IP .

3 голосов
/ 10 июня 2011

Эти два свойства внутренне играют с опциями сокетов (через SetSocketOption, в конце концов к нативному setsockopt). Если память будет обслуживаться, это будет зависеть от доступной памяти невыгружаемого пула (которая меняет машину на машину) и, возможно, какой сетевой драйвер находится на каждой машине.

Несмотря на это, вы на самом деле не гарантированы, что запрошенный вами размер буфера используется, вам придется получить текущий размер буфера после факта, чтобы убедиться, что он был использован. Более того, на компьютерах с Windows 7 и 2008 я понимаю, что ваши буферы могут динамически увеличиваться / уменьшаться .

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

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