programing

리눅스의 소켓 버퍼 크기를 찾는 방법

projobs 2021. 1. 18. 07:29
반응형

리눅스의 소켓 버퍼 크기를 찾는 방법


Linux의 기본 소켓 버퍼 크기는 얼마입니까? 그것을 보라는 명령이 있습니까?


터미널에서 버퍼 크기를 확인하려면 다음을 살펴볼 수 있습니다.

  • /proc/sys/net/ipv4/tcp_rmem (읽기 용)
  • /proc/sys/net/ipv4/tcp_wmem (쓰기 용)

여기에는 각각 최소, 기본 및 최대 메모리 크기 값 (바이트) 인 세 개의 숫자가 포함됩니다.


c / 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

지적했듯이에서 현재 기본 소켓 버퍼 크기 를 볼 /procsysctl있지만을 사용하여 확인할 수도 있습니다 . (참고 : 이름에 ipv4가 포함되어 있지만 이러한 크기는 ipv6 소켓에도 적용됩니다. 코드는 ipv4 tcp_init_sock () 함수를 호출합니다.)

 sysctl net.ipv4.tcp_rmem
 sysctl net.ipv4.tcp_wmem

그러나 기본 소켓 버퍼는 양말이 초기화 될 때 설정되지만 커널은 동적으로 크기를 조정합니다 (SO_SNDBUF와 함께 setsockopt ()를 사용하여 설정하지 않는 한). 현재 열려있는 소켓에 대한 버퍼의 실제 크기는 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

원자 크기는 4096 바이트, 최대 크기는 65536 바이트입니다. Sendfile은 각각 4096 바이트 크기의 16 개 파이프를 사용합니다. cmd : ioctl (fd, FIONREAD, & buff_size).

참조 URL : https://stackoverflow.com/questions/7865069/how-to-find-the-socket-buffer-size-of-linux

반응형