Linux에서 TCP RTO 값 변경

Linux에서 TCP RTO 값 변경

TCP RTO를 변경하고 싶습니다.(재전송 시간 초과)연결의 가치, 내가 읽은 일부 내용에 따르면 이 작업을 수행할 수 있다고 제안하지만 이를 변경할 위치와 방법을 밝히지는 않습니다.

변수를 살펴보니 /proc/sys/net/ipv4RTO와 관련된 변수는 하나도 없었습니다. 누구든지 이 값을 변경하는 방법을 알려주시면 매우 감사하겠습니다.

답변1

RTO를 구체적으로 변경할 수 없는 이유는 RTO가 고정된 값이 아니기 때문입니다. 대신(당연히 초기 SYN 제외) 각 연결의 RTT(왕복 시간)를 기반으로 합니다. 실제로 이는 평활화된 RTT 버전과 RTT 분산 및 일부 상수의 혼합을 기반으로 합니다. 따라서 각 TCP 연결에 대해 동적으로 계산된 값이므로 적극 권장합니다.이 기사계산 및 일반 RTO에 대해 자세히 설명합니다.

또한 관련성이 있는 것은RFC 6298(다른 많은 것 중에서) 어떤 내용이 있습니까?

RTO를 계산할 때마다 1초 미만인 경우 RTO를 1초로 반올림해야 합니다.

그렇다면 커널은 항상 RTO를 1초로 설정합니까? Linux에서는 다음 명령을 실행하여 열린 연결의 현재 RTO 값을 표시할 수 있습니다 ss -i.

State       Recv-Q Send-Q                                                  Local Address:Port     Peer Address:Port
ESTAB       0      0                                                           10.0.2.15:52861   216.58.219.46:http
     cubic rto:204 rtt:4/2 cwnd:10 send 29.2Mbps rcv_space:14600
ESTAB       0      0                                                           10.0.2.15:ssh          10.0.2.2:52586
     cubic rto:201 rtt:1.5/0.75 ato:40 cwnd:10 send 77.9Mbps rcv_space:14600
ESTAB       0      0                                                           10.0.2.15:52864   216.58.219.46:http
     cubic rto:204 rtt:4.5/4.5 cwnd:10 send 26.0Mbps rcv_space:14600

위는 SSH를 사용하여 로그인하고 google.com에 대한 여러 연결이 열려 있는 가상 머신의 출력입니다. 보시다시피 RTO는 실제로 약 200(밀리초)으로 설정되어 있습니다. 이 값은 RFC에서 1초 값으로 반올림되지 않으며 약간 높다고 생각할 수도 있습니다. 이는 Linux의 RTO에 대한 최소(200밀리초) 및 최대(120초) 제한이 있기 때문입니다(위에 링크한 문서에 이에 대한 좋은 설명이 있습니다).

따라서 RTO 값을 직접 변경할 수는 없지만 손실이 많은 네트워크(예: 무선)의 경우 조정을 시도해 볼 수 있습니다.빠른 RTO(배포판에 따라 이미 활성화되어 있을 수도 있습니다). 실제로 조정할 수 있는 두 가지 F-RTO 관련 옵션이 있습니다(좋은 요약여기):

net.ipv4.tcp_frto
net.ipv4.tcp_frto_response

최적화하려는 대상에 따라 유용할 수도 있고 그렇지 않을 수도 있습니다.

편집: 주석을 기반으로 TCP의 rto_min/max 값을 조정하는 기능을 추적합니다.

TCP에 대한 전역 최소 RTO는 변경할 수 없습니다(그런데 SCTP에 대해서는 이 작업을 수행할 수 있습니다. 이는 sysctl에 표시됨). 그러나 좋은 소식은 경로별로 최소 RTO를 조정할 수 있다는 것입니다. 내 CentOS 가상 머신의 라우팅 테이블은 다음과 같습니다.

ip route
10.0.2.0/24 dev eth0  proto kernel  scope link  src 10.0.2.15 
169.254.0.0/16 dev eth0  scope link  metric 1002 
default via 10.0.2.2 dev eth0

다음과 같이 기본 경로에서 rto_min 값을 변경할 수 있습니다.

ip route change default via 10.0.2.2 dev eth0 rto_min 5ms

이제 내 라우팅 테이블은 다음과 같습니다.

ip route
10.0.2.0/24 dev eth0  proto kernel  scope link  src 10.0.2.15 
169.254.0.0/16 dev eth0  scope link  metric 1002 
default via 10.0.2.2 dev eth0  rto_min lock 5ms

마지막으로 연결을 시작하고 ss -i이것이 관찰되었는지 확인하겠습니다.

ss -i
State       Recv-Q Send-Q                                               Local Address:Port                                                   Peer Address:Port   
ESTAB       0      0                                                        10.0.2.15:ssh                                                        10.0.2.2:50714   
     cubic rto:201 rtt:1.5/0.75 ato:40 cwnd:10 send 77.9Mbps rcv_space:14600
ESTAB       0      0                                                        10.0.2.15:39042                                                 216.58.216.14:http    
     cubic rto:15 rtt:5/2.5 cwnd:10 send 23.4Mbps rcv_space:14600

성공! HTTP 연결의 rto(변경 후)는 15ms인 반면 SSH 연결의 rto(변경 전)는 이전과 동일하게 200+입니다.

저는 실제로 이 접근 방식을 좋아합니다. 이를 통해 다른 트래픽을 망칠 수 있는 전체적으로 낮은 값을 설정하는 대신 적절한 경로에 더 낮은 값을 설정할 수 있습니다. 마찬가지로 (참조IP 매뉴얼 페이지) 경로의 초기 rtt 추정치와 초기 rttvar(동적 RTO를 계산할 때 사용됨)를 조정할 수 있습니다. 튜닝 측면에서 완전한 솔루션은 아니지만 중요한 부분은 대부분 있다고 생각합니다. 최대 설정을 조정할 수는 없지만 일반적으로 어떤 경우에도 그다지 유용하지는 않다고 생각합니다.

관련 정보