2015-08-31 2 views
4

Я использую следующий код в Centos, чтобы изменить размер буфера сокета до 400 КБ, однако я получил тот же результат, что и размер буфера до 256 КБ. Ничего плохого? или это ограничение уровня сокета? Версия ядра - 2.6.34. Благодаря!Имеет ли размер буфера raw raw-носителя Linux верхний предел 256 К?

int  rawsock; 
socklen_t socklen; 
int  optval; 
int  bufsize = 400 * 1024; 

rawsock = socket(PF_PACKET, SOCK_RAW, htons(ETH_P_ALL)); 
if (rawsock < 0) { 
    my_log(LOG_ERR, "error creating raw socket"); 
    return rawsock; 
} 

optval = 0; 
socklen = 4; 
err = getsockopt(rawsock, SOL_SOCKET, SO_RCVBUF, &optval, &socklen); 
bail_error(err); 
my_log("socket RX original buffer size = %d", optval); 

optval = 0; 
socklen = 4; 
err = getsockopt(rawsock, SOL_SOCKET, SO_SNDBUF, &optval, &socklen); 
bail_error(err); 
my_log("socket TX original buffer size = %d", optval); 

err = setsockopt(rawsock, SOL_SOCKET, SO_RCVBUF, &bufsize, sizeof(bufsize)); 
bail_error(err); 

err = setsockopt(rawsock, SOL_SOCKET, SO_SNDBUF, &bufsize, sizeof(bufsize)); 
bail_error(err); 

optval = 0; 
socklen = 4; 
err = getsockopt(rawsock, SOL_SOCKET, SO_RCVBUF, &optval, &socklen); 
bail_error(err); 
my_log("socket RX new buffer size = %d", optval); 

optval = 0; 
socklen = 4; 
err = getsockopt(rawsock, SOL_SOCKET, SO_SNDBUF, &optval, &socklen); 
bail_error(err); 
my_log("socket TX new buffer size = %d", optval); 

После запуска, результат:

socket RX original buffer size = 110592 
socket TX original buffer size = 110592 
socket RX new buffer size = 524288 
socket TX new buffer size = 524288 

ответ

1

Согласно documentation

SO_RCVBUF: максимально допустимое значение устанавливается в файле /proc/sys/net/core/rmem_max

SO_SNDBUF: максимально допустимая значение устанавливается файлом /proc/sys/net/core/wmem_max.

Таким образом, ограничения могут зависеть от того, как настроена ваша система.

2

Вы просто нажимаете на текущие лимиты sysctl системы net.core.wmem_max и net.core.rmem_max.

Если у процесса есть привилегии суперпользователя, он может использовать SO_SNDBUFFORCE и SO_RCVBUFFORCE ioctls для переопределения ограничений. Если есть реальная причина, почему ваш сервис действительно требует больших буферов, то есть любой другой причины, кроме плохих вариантов разработки или дизайна, то я рекомендую этот способ. Обычно нет такой причины, и в этом случае я рекомендую вам исправить код приложения/службы.

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

Чтобы сделать это временно (до следующей загрузки), запустите sysctl -w net.core.wmem_max=bytes и sysctl -w net.core.rmem_max=bytes как root (где bytes - это новый предел как десятичное число, в байтах).

Чтобы сделать изменения постоянными, добавьте

net.core.rmem_max=bytes 
net.core.wmem_max=bytes 

вашего /etc/sysctl.conf файла или новый файл в /etc/sysctl.d/ каталоге, если ваш дистрибутив Linux обеспечивает один. Последний подход лучше, потому что он не остановит обновления ваших файлов конфигурации по умолчанию.

Если вы хотите углубиться в эти и другие сокеты ioctls, вы можете посмотреть файл ядра net/core/sock.c и функцию sock_setsockopt().