이러한 Linux TCP 기본 설정은 어떻게 결정 되었습니까?


13

데이터베이스 서버가 사라지면 poll()연결된 클라이언트에 대해 최대 2 시간 ( libpq 클라이언트 라이브러리에서 호출 대기 시간 이 길어짐) 이 발생하는 프로덕션 문제를 추적하는 데 꽤 오랜 시간을 보냈습니다 . 문제를 파고 들어, 끊어진 TCP 연결을 적시에 알 수 있도록 이러한 커널 매개 변수를 조정해야한다는 것을 깨달았습니다.

net.ipv4.tcp_keepalive_time = 7200 net.ipv4.tcp_keepalive_probes = 9 net.ipv4.tcp_keepalive_intvl = 75 net.ipv4.tcp_retries2 = 15

위의 4 가지 값은 Ubuntu 12.04 시스템의 값이며 이러한 기본값은 현재 Linux 커널 기본값 과 동일하지 않은 것 같습니다 .

이러한 설정은 기존 연결을 유지하고 keepalive 프로브에 매우 찌그러지는 경향이 있습니다. AIUI (기본값 tcp_keepalive_time2 시간)는 원격 호스트에 대한 응답을 기다리는 경우 연결이 유효한지 확인하기 위해 keepalive 프로브를 시작하기 전에 2 시간 동안 참을성있게 기다립니다. 그런 다음 원격 호스트가 keepalive 프로브에 응답하지 않으면 해당 keepalive 프로브를 9 tcp_keepalive_probes초 ( tcp_keepalive_intvl) 간격으로 75 초 간격으로 재 시도 하므로 연결이 실제로 종료되기까지 11 분이 더 걸립니다.

예를 들어, psql원격 PostgreSQL 인스턴스에 연결된 세션을 시작하고 일부 쿼리가 응답을 기다리는 경우와 같이이 필드에서 본 것과 일치합니다.

SELECT pg_sleep(30);

그런 다음 원격 서버가 끔찍한 죽음 (예 : 해당 시스템으로 트래픽을 떨어 뜨림)으로 죽게하면 psql 세션이 연결이 끊어지기 전에 최대 2 시간 11 분 동안 대기하는 것을 볼 수 있습니다. 아시다시피, 이러한 기본 설정은 데이터베이스 장애 조치 이벤트와 같이 데이터베이스와 통신하는 코드에 심각한 문제를 일으 킵니다. 이 노브를 낮추면 많은 도움이되었습니다! 그리고 나는 이 기본값을 조정하는 것이 혼자아니라는 것을 알았습니다 .

그래서 내 질문은 :

  • 기본값은 얼마입니까?
  • 이러한 TCP 설정을 기본값으로 설정 한 원래의 근거는 무엇입니까?
  • Linux 배포판에서 이러한 기본값을 변경합니까?

그리고 이러한 설정에 대한 이론적 근거에 대한 다른 역사나 관점은 높이 평가 될 것입니다.


여기에 관련된 정보가 있습니다 ... tldp.org/HOWTO/TCP-Keepalive-HOWTO/usingkeepalive.html
Drav Sloan

당신은 소켓 옵션을 클라이언트 코드의 처음 세 당 연결을 변경할 수 있습니다 TCP_KEEPIDLE, TCP_KEEPCNT하고 TCP_KEEPINTVL.
nono

1
@wnoise 실제로 Linux 2.6.37부터 시스템 전체 TCP_USER_TIMEOUT를 설정하는 대신 소켓 옵션을 지정할 수도 있습니다 net.ipv4.tcp_retries2. 물론 많은 애플리케이션 (예 : PostgreSQL)은 TCP_USER_TIMEOUT아직 지원하지 않습니다 .
Josh Kupershmidt

답변:


6

RFC 1122 는 섹션 4.2.3.6에서 연결 유지 기간이 기본적으로 2 시간 이상이 아니어야한다고 지정합니다.


1
좋아, 파고 들어 줘서 고마워 나는 tcp_keepalive_time다른 세 가지 관련 설정에 대한 선례 / 설명에 여전히 관심이 있지만 대부분 왜 기본값이 7200 으로 설정되는지에 대한 질문에 대답한다고 생각합니다 .
Josh Kupershmidt

이 질문에 대한 답변으로 내 답변을 제거 (적어도 하나의 값에 해당)
coteyr

1
@coteyr 어쨌든 감사합니다, 노력에 감사드립니다. IIRC는 초기 리눅스 커널에서 기본값은 15 분이라는 제안에 대한 흥미로운 의견이있었습니다. 나는 그것이 왜 2 시간으로 바뀌 었는지 또는 왜 15 분으로 설정되었는지에 관심이 있습니다.
Josh Kupershmidt
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.