Имеет ли размер буфера сокета в Linux верхний предел 256 КБ?

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

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
4 голоса | спросил Mycheese 31 AM00000060000002731 2015, 06:30:27

3 ответа


0

Вы просто превышаете текущие ограничения 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, вы можете взглянуть на ядро .git /tree /net /core /sock.c" rel =" nofollow "> net/core/sock.c и файл ---- +: = 11 =: + ----.

ответил Nominal Animal 31 AM00000070000002631 2015, 07:12:26
0

Согласно документации

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

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

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

ответил dvhh 31 AM00000070000000231 2015, 07:12:02
0

Интересная заметка. Я кодировал программу AF_ALG, которая принимает входной файл (будет выбран случайным образом), шифрует его, расшифровывает его, затем сравнивает дешифрованный открытый текст с исходным вводом (используя cbc (aes)). Казалось, что «тестовая» программа зависла на 212992 байта. Прервите программу с помощью ctrl-z и поместите в фоновом режиме, и они сообщили о чтении 212992 байта (что, как я знаю, неправильно для тестовых данных, в данном случае это было /bin /zip, 215792 байта).

Проверено net.core. [rmem_max, wmem_max, rmem_default, wmem_default], и они были 212992. Обновлен до 2M, и тесты, которые ранее не давали результатов, начали работать. Поэтому может показаться, что эти ограничения также влияют на программы AF_ALG (я пытаюсь раскрыть крипто-ускоритель и подвергнуть его некоторому стрессу из пользовательского пространства с помощью AF_ALG).

ответил devoz 30 +03002018-10-30T20:55:21+03:00312018bEurope/MoscowTue, 30 Oct 2018 20:55:21 +0300 2018, 20:55:21

Похожие вопросы

Популярные теги

security × 330linux × 316macos × 2827 × 268performance × 244command-line × 241sql-server × 235joomla-3.x × 222java × 189c++ × 186windows × 180cisco × 168bash × 158c# × 142gmail × 139arduino-uno × 139javascript × 134ssh × 133seo × 132mysql × 132