Каков размер буфера сокета по умолчанию для linux? Есть ли команда, чтобы увидеть это?
Как найти размер буфера сокета linux
Ответ 1
Если вы хотите увидеть размер вашего буфера в терминале, вы можете посмотреть:
-
/proc/sys/net/ipv4/tcp_rmem
(для чтения) -
/proc/sys/net/ipv4/tcp_wmem
(для записи)
Они содержат три числа, которые являются минимальными, стандартными и максимальными значениями размера памяти (в байтах) соответственно.
Ответ 2
Для получения размера буфера в программе c/С++ следующим является поток
int n;
unsigned int m = sizeof(n);
int fdsocket;
fdsocket = socket(AF_INET,SOCK_DGRAM,IPPROTO_UDP); // example
getsockopt(fdsocket,SOL_SOCKET,SO_RCVBUF,(void *)&n, &m);
// now the variable n will have the socket size
Ответ 3
Хотя, как было указано, в /proc
можно увидеть текущие размеры буфера сокетов по умолчанию, но также можно проверить их с помощью sysctl
(Примечание: хотя имя включает ipv4, эти размеры также применяются к сокетам ipv6 - код ipv6 tcp_v6_init_sock() просто вызывает функцию ipv4 tcp_init_sock()):
sysctl net.ipv4.tcp_rmem
sysctl net.ipv4.tcp_wmem
Однако буферы сокетов по умолчанию просто устанавливаются при инициализации sock, а затем ядро динамически изменяет их размеры (если не установлено с помощью setsockopt() с SO_SNDBUF). Фактический размер буферов для открытых в данный момент сокетов может быть проверен с помощью команды ss
(часть пакета iproute
), которая также может предоставить гораздо больше информации о сокетах, таких как параметр управления перегрузкой и т.д. Например. Чтобы просмотреть список открытых в настоящее время сокетов TCP (опция t
) и связанную с ними память (m
):
ss -tm
Вот пример вывода:
State Recv-Q Send-Q Local Address:Port Peer Address:Port
ESTAB 0 0 192.168.56.102:ssh 192.168.56.1:56328
skmem:(r0,rb369280,t0,tb87040,f0,w0,o0,bl0,d0)
Вот краткое объяснение skmem (памяти сокетов) - для получения дополнительной информации вам нужно взглянуть на исходные коды ядра (например, sock.h):
r:sk_rmem_alloc rb:sk_rcvbuf # current receive buffer size t:sk_wmem_alloc tb:sk_sndbuf # current transmit buffer size f:sk_forward_alloc w:sk_wmem_queued # persistent transmit queue size o:sk_omem_alloc bl:sk_backlog d:sk_drops
Ответ 4
Хотя, как уже было отмечено, в /proc можно увидеть текущие размеры буфера сокетов по умолчанию, но также можно проверить их с помощью sysctl
(Примечание. Хотя имя включает ipv4, эти размеры также применяются к сокетам ipv6 - ipv6). Код tcp_v6_init_sock() просто вызывает функцию ipv4 tcp_init_sock()):
sysctl net.ipv4.tcp_rmem
sysctl net.ipv4.tcp_wmem
Однако буферы сокетов по умолчанию просто устанавливаются при инициализации sock, а затем ядро динамически изменяет их размеры (если не установлено с помощью setsockopt() с SO_SNDBUF). Фактический размер буферов для открытых в данный момент сокетов можно проверить с помощью команды ss
(часть пакета iproute
). Например, для просмотра списка открытых в настоящее время сокетов TCP (t
option) и информации о связанной памяти (m
):
ss -tm
Вот пример вывода:
State Recv-Q Send-Q Local Address:Port Peer Address:Port
ESTAB 0 0 192.168.56.102:ssh 192.168.56.1:56328
skmem:(r0,rb369280,t0,tb87040,f0,w0,o0,bl0,d0)
Вот краткое объяснение skmem (сокет памяти) - для получения дополнительной информации вам нужно взглянуть на исходные коды ядра (например, sock.h):
r:sk_rmem_alloc rb:sk_rcvbuf - current receive buffer size t:sk_wmem_alloc tb:sk_sndbuf - current transmit buffer size f:sk_forward_alloc w:sk_wmem_queued - persistent transmit queue size o:sk_omem_alloc bl:sk_backlog d:sk_drops
Ответ 5
Атомный размер - 4096 байт, максимальный размер - 65536 байт. Sendfile использует 16 каналов размером 4096 байт. cmd: ioctl (fd, FIONREAD, & buff_size).