본문 바로가기

Infra/네트워크

1. TCP 네트워크 성능을 결정짓는 커널 파라미터 (네트워크 대역폭 관련)

명령어 정리

설명 명령어
커널 파라미터 설정값 전체 열람 sysctl -a
설정값 변경 sysctl -w net.core.wmem_max="16777216"
시스템 부팅시 설정 /etc/sysctl.conf 파일에 명령어 기입
TCP Window Scaling 활성화 sysctl -w net.ipv4.tcp_window_saling="1"
TCP 소켓관련 Parameter sysctl -w net.core.rmem_default="253952"
sysctl -w net.core.wmem_default="253952"
sysctl -w net.core.rmem_max="16777216"
sysctl -w net.core.wmem_max="16777216"
sysctl -w net.ipv4.tcp_rmem="253952 253952 16777216"
sysctl -w net.ipv4.tcp_wmem="253952 253952 16777216"
Congestion Window Size 관련 명령어 ip route show //현재설정 보기
ip route change default via 192.168.1.1 dev eth0 proto static initcwnd 10 // 설정변경
Idle 상태의 Slow Start에 대한 Parameter net.ipv4.tcp_slow_start_after_idle (0라면 CWND 지속 1이라면 Initial CWND부터 다시 계산)

대개, TCP와 관련된 커널 파라미터는 net.core, net.ipv4, net.ipv6 등의 접두사를 붙인다.

시작하기 전에 알아야되는 TCP 작동 방식

TCP는 작은 패킷을 보낼때 마다 Ack전송을 하지 않는다. 정확히는 Window Size를 받아 Window Size만큼의 패킷을 전송하고 다시 Ack를 전송한다. 해당 프로세스는 모든 패킷이 전송 될 때 까지 반복된다. Window Size는 운영체제마다 다르다.

 

E.g. Window Size가 8192이며 다음 패킷의 Sequence Number가 4381이라면 남은 보낼 수 있는 데이터 양은 (8192-4380) 이다

 

참고 : https://m.blog.naver.com/PostView.nhn?blogId=goduck2&logNo=220076011565&proxyReferer=https:%2F%2Fwww.google.com%2F

TCP Bandwidth 관련 파라미터

BDP (Bandwidth Delay Product)

  • 어느 네트워크 경로에 전달중인 데이터(패킷)의 양을 나타낸다
  • 아래의 그림과 같은 경우에는 (100Mb/s * 2s)/8 = 25MB가 BDP이다

BDP를 역으로 이용하여 아래와 같이 대역폭을 구할 수 있다

Bandwidth = BDP / RTT

 

하지만 실제 인터넷의 BDP는 Receiver Window Size를 모두 커버 가능할 만큼 크기 때문에

아래와 같이 나타낼 수 있다

Bandwidth = (receiver window size) / RTT

 

결론적으로 인터넷의 대역폭을 높이기 위해서는 RTT를 낮추거나 receiver window size를 늘리면 된다.

하지만 RTT는 물리적 거리에 종속적 이므로 결국 Receiver Window Size를 증가시는 방법이 가장 좋다.

 

Receiver Window Size 증가 시키기

Field or Command 설명 비고
Receiver Window Size 0~65,535(64KB) 지금 인터넷 환경에선 작은 값이다. 
그러므로 TCP Window Scale값을 이용하여 늘려준다
TCP Window Scaling 0~14 실제 Receiver Window Size = 
Window Size * (2^Window Scale)

sysctl -w net.ipv4.tcp_window_saling="1" 명령어로 TCP Window Scaling을 활성화 시킨다.

 

TCP Socket Buffer Size 증가 시키기

TCP Window Sacling을 아무리 늘려봐야 TCP Socket Buffer Size를 증가시킬 수 없기에 TCP Socket Buffer Size를 증가 시켜줘야 한다.

  • net.core.rmem_default
    • TCP를 포함한 모든 종류의 소켓에 기본적으로 설정되는 Read 버퍼크기
  • net.core.wmem_default
    • TCP를 포함한 모든 종류의 소켓에 기본적으로 설정되는 Write 버퍼크기
  • net.core.rmem_max
    • TCP를 포함한 모든 종류의 소켓에 최대치로 설정되는 Read 버퍼크기
  • net.core.wmem_max
    • TCP를 포함한 모든 종류의 소켓에 최대치로 설정되는 Write 버퍼크기
  • net.ipv4.tcp_rmem
    • TCP 소켓에 대한 Read 버퍼 크기 (순서대로 min / default / max로 삽입)
  • net.ipv4.tcp_wmem
    • TCP 소켓에 대한 Write 버퍼 크기 (순서대로 min / default / max로 삽입)
  • net.ipv4.tcp_mem (왠만하면 수정 하지 말자)
    • 소켓 전체에서 사용되는 메모리 버퍼 크기 (순서대로 min / pressure /max로 삽입)

 

$ sysctl -w net.core.rmem_default="253952"
$ sysctl -w net.core.wmem_default="253952"
$ sysctl -w net.core.rmem_max="16777216"
$ sysctl -w net.core.wmem_max="16777216"
$ sysctl -w net.ipv4.tcp_rmem="253952 253952 16777216"
$ sysctl -w net.ipv4.tcp_wmem="253952 253952 16777216"

 

Congestion Window 증가 시키기

Congestion Window = 한번에 보낼 수 있는 데이터 양의 최대치

// 소켓별 Congestion Window 크기 확인
$ ss -n -i

Netid State      Recv-Q Send-Q                                Local Address:Port                                                         Peer Address:Port
tcp    ESTAB      0      0                                                                10.77.57.57:33000                                                           10.77.57.57:47142
     cubic wscale:7,7 rto:208 rtt:5.236/10.107 ato:40 mss:65483 cwnd:10 send 1000.5Mbps rcv_rtt:4 rcv_space:43690

이 Congestion Window Size는 TCP의 혼잡 제어 전략에 따라 slow start방법으로 최초 연결시 정해진 'Initial Congestion Window Size(CWND)'부터 어느 정도 선까지 지속적으로 증가하게 된다.

 

자세한 Congestion Control에 관한 내용은 아래의 링크를 참고하자

https://operatingsystems.tistory.com/entry/NW-Congestion-Control

 

// ip route 현재 설정
$ ip route show
192.168.1.0/24 dev eth0  proto kernel  scope link  src 192.168.1.100  metric 1 
169.254.0.0/16 dev eth0  scope link  metric 1000 
default via 192.168.1.1 dev eth0  proto static

// 변경, 한번에 보낼 수 있는 패킷 갯수 10
$ ip route change default via 192.168.1.1 dev eth0  proto static initcwnd 10

$ ip route show
192.168.1.0/24 dev eth0  proto kernel  scope link  src 192.168.1.100  metric 1 
169.254.0.0/16 dev eth0  scope link  metric 1000 
default via 192.168.1.1 dev eth0  proto static  initcwnd 10


net.ipv4.tcp_slow_start_after_idle 값은 0 또는 1 로 가능하다

  • 1 = Idle(통신이 없는)상태가 지속되면 다시 Initial Congestion Window Size에서 Congestion Size까지 계산한다
  • 0 = 만약 Idle상태가 지속 된다고 하더래도 Congestion Window Size가 유지된다

 

 

 

출처 : https://meetup.toast.com/posts/53