TCP RTO를 변경하고 싶습니다.(재전송 시간 초과)연결의 가치, 내가 읽은 일부 내용에 따르면 이 작업을 수행할 수 있다고 제안하지만 이를 변경할 위치와 방법을 밝히지는 않습니다.
변수를 살펴보니 /proc/sys/net/ipv4
RTO와 관련된 변수는 하나도 없었습니다. 누구든지 이 값을 변경하는 방법을 알려주시면 매우 감사하겠습니다.
답변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를 계산할 때 사용됨)를 조정할 수 있습니다. 튜닝 측면에서 완전한 솔루션은 아니지만 중요한 부분은 대부분 있다고 생각합니다. 최대 설정을 조정할 수는 없지만 일반적으로 어떤 경우에도 그다지 유용하지는 않다고 생각합니다.