TCP_DEFER_ACCEPT의 실제 사용?


15

온라인 에서 Apache httpd 매뉴얼 을 숙독하고 이를 활성화하기위한 지시문을 발견했습니다. 매뉴얼 페이지에서 다음에 대한 설명을 찾았습니다 tcp.

   TCP_DEFER_ACCEPT (since Linux 2.4)
          Allow a listener to be awakened only when data arrives on the
          socket.  Takes an integer value (seconds), this can bound the
          maximum number of attempts TCP will make to complete the
          connection.  This option should not be used in code intended
          to be portable.

그런 다음 이 기사를 찾았 지만 여전히 어떤 종류의 워크로드가 유용한 지 확실하지 않습니다. 특별히이 httpd옵션이있는 경우 웹 서버와 관련이 있어야 한다고 가정 합니다. 또한 httpd네트워크 연결 방법뿐만 아니라 원하는 옵션과 원하지 않는 사용 사례가 있다는 것이 옵션이라는 사실을 전제로합니다 .

기사를 읽은 후에도 3 방향 핸드 셰이크가 완료되기를 기다리는 이점이 무엇인지 확실하지 않습니다. httpd핸드 셰이크가 계속 진행되는 동안 연결이 형성된 후 지연을 유발하는 대신 관련 인스턴스 를 교체하지 않아도되는 것이 유리할 것 입니다.

이 기사에서는 TCP_DEFER_ACCEPT소켓 의 상태에 관계없이 여전히 4 개의 패킷 (각각의 핸드 셰이크 및 데이터)이 필요한 것으로 보입니다 . 나는 그들이 어떻게 카운트를 3으로 줄이는 지, 그것이 어떻게 의미있는 향상을 제공하는지 모릅니다.

그래서 내 질문은 기본적으로 : 이것은 오래된 오래된 옵션입니까, 아니면이 옵션의 실제 사용 사례입니까?


나는 "세 가지 카운트를 세 어라"라는 말의 의미를 잘 모르겠다. 이것은 TCP "개방형 연결"트랜잭션이며 전송 된 총 3 개의 패킷으로 구성됩니다. 이 3 가지가 완료 될 때까지 데이터가 없으며 유효한 연결이 없습니다. 이러한 데이터는 핸드 셰이 킹 오버 헤드를 고려하지 않습니다. TCP_DEFER_ACCEPT에서 얻을 수있는 효율성 증가는 '수락'TCP 3 방향 핸드 셰이크 완료와 첫 번째 데이터 패킷 (주로 3 대 4 방향 핸드 셰이크에 대한 의견을 가정) 사이의 간격입니다.
iain

또한 '스와핑'을 피하는 것이 아니라 자원을 낭비하지 않는 것입니다. 스와핑이 HTTP 작업자를 활성화하는 요소가 되었다면 데이터가 준비되기 전에 수락 지점에서 작업자가 조기에 스왑하도록 강요하는 중입니다. 스와핑이 발생하면 다른 항목을 강제 실행하고 있음을 의미합니다 램 ... 어쩌면 뭔가를하고 있었고 수락 / 데이터 부분 사이에서 다시 교환되는 것 ... CPU, diskIO, in-ram 페이지, 데이터가 없으면 작업이 발생하지 않습니다.
iain

작업자 프로세스가 이미 메모리에 있다면 디스크로 갈 때보 다 대기 시간이 그렇게 짧지 않습니까? "3까지"는 클라이언트의 첫 번째 데이터 패킷이 세 번째 패킷에 놓 이도록 만드는 기사에 대한 참조입니다.
Bratchley

또한 이론적 인 스왑 인은 어쨌든 일어날 것입니다.이 TCP 옵션으로 변경되지는 않습니다. 나는 TCP 연결을 형성하고 데이터 전송에 넣는 것에서 갭을 얻는 것이 어떻게 유익한 지 알지 못합니다. 적어도 TCP 연결을 형성하는 동안 수행 할 때 두 가지가 동시에 발생할 수 있습니다 (시간을 줄임).
Bratchley

방금 답변을 작성해야합니다 ... 옵션과 관련하여 "일반적인"유닉스 표준이 작동하는 방식이 아닙니다 ... 특히 HTTP와 관련하여 중요한 점은 클라이언트 (웹 브라우저)가 클라이언트와 대화를 시작한다는 것입니다. GET line ... 따라서 서버는 실제 연결에 신경 쓰지 않고 첫 번째 데이터 만 신경 씁니다. 서버가 "220 환영 배너"메시지를 발행 할 때까지 클라이언트가 기다려야하는 SMTP와 달리. 즉, 해당 서버는 데이터가 아닌 연결시 알아야합니다.
iain

답변:


14

(OP에 대한 나의 의견을 요약하기 위해)

그들이 참조하고있는 3 방향 핸드 셰이크는 TCP 연결 설정의 일부이며, 해당 옵션은 특별히 관련이 없습니다. 또한 데이터 교환은 3 방향 핸드 셰이크의 일부가 아니며 열기 / 설정 상태에서 TCP 연결을 생성하기 만합니다.

이 옵션의 존재와 관련하여, 이것은 소켓의 전통적인 동작이 아니며, 일반적으로 소켓 핸들러의 스레드는 연결이 수락 될 때 (여전히 3 방향 핸드 셰이크가 완료된 후) 깨어 났으며, 일부 프로토콜 활동의 경우 여기에서 시작됩니다 ( 예를 들어 SMTP 서버는 220 인사말 라인을 전송하지만 HTTP의 경우 대화의 첫 번째 메시지는 웹 브라우저가 GET / POST / etc 라인을 전송하는 것이며,이 때까지 HTTP 서버는 연결에 관심이 없습니다 (타이밍 제외) 소켓이 완료되면 HTTP 프로세스를 깨우는 것은 프로세스가 즉시 다시 잠 들어 필요한 데이터를 기다리기 때문에 낭비 적 인 활동입니다.

유휴 프로세스를 깨우면 추가 처리를 위해 '준비'될 수 있다는 주장이 있지만 (특히 오래된 컴퓨터에서 로그인 터미널을 깨우고 스왑에서 제거하는 것을 기억합니다) 당신은 또한 스왑 아웃은 프로세스가 이미 리소스를 요구하고 있으며 불필요한 스레드를 추가로 사용하면 개별 스레드의 성능이 향상 되더라도 시스템 성능이 전반적으로 저하 될 수 있습니다. 교체 한 경우 다른 속도를 늦추고, 사용량이 많을 경우 즉시 수면으로 전환 할 수 있습니다. 도박 인 것 같습니다. 궁극적으로 '욕심쟁이'도박은 바쁜 기계에서 돈을 지불하지 않아도됩니다.

이러한 성능 조정 수준에 대한 나의 일반적인 조언은 어쨌든 가장 좋은 것에 대해 프로그래밍 방식으로 결정하는 것이 아니라 시스템 관리자와 운영 체제가 자원 관리 문제를 처리하기 위해 협력하도록하는 것입니다. 전체 시스템의 작업 부하를 이해하는 데 더 적합합니다. 옵션 및 구성 선택 사항을 제공하십시오.

질문에 구체적으로 대답하기 위해이 옵션은 HTTP 트래픽이 극심한 경우를 제외하고는 눈에 띄는 수준이 아니라 모든 구성에서 유리하지만 이론적으로는 "올바른"방법입니다. 모든 유닉스 (모든 리눅스는 아님) 맛이 그 기능을 가지고 있지 않기 때문에 옵션이므로 이식성을 위해 기울어지지 않도록 구성 할 수 있습니다.


요약 해 주셔서 감사합니다. 서버로드 및 스왑 / 깨우기 유휴 프로세스는 잠재적 이점 중 하나이지만 (앞서 언급 한대로 미묘한 차이가 있지만) 대기 시간이 길고 지연되는 클라이언트에 서비스를 제공하는 HTTP 서버를 보면 분명한 이점이 있습니다. 예를 들어, Apache 웹 서버를 실행할 때 고정 된 수의 서버 프로세스 / 스레드를 사용할 수 있습니다. 즉, 고정 된 수의 클라이언트를 언제든지 제공 할 수 있습니다. 따라서 클라이언트의 "데이터"패킷이 도착하지 않은 상태에서 서버 프로세스를 "사용하지"않으면 서버 프로세스가 다른 클라이언트에게 그 동안 서비스를 제공 할 수 있습니다.
Ram

-1

3 방향 핸드 셰이크가 완료되기를 기다리는 이점이 무엇인지 확실하지 않습니다.

3 방향 핸드 셰이크는 음성 전화 통신의 일반적인 프로토콜입니다.

  1. 서버 : "좋은 오후, Epiphyte Corp."
  2. 발신자 : "안녕하세요. 랜디입니다."
  3. 서버 : "예, 어떻게 도와 드릴까요?"
  4. 발신자 : 통화 본문이 농담을 요청하기 시작 함

채널이 설정되도록 TCP에서 중요합니다. 고객이 듣기 전에 전화를 받기 시작한 경우 (3) 서버가 듣지 않거나 준비가되지 않았을 가능성이 있습니다. 청각 (3)은 서버가 전송 후 즉시 자발적인 연소를 겪는 것을 보장하지는 않지만 서버가 수신 할 준비가되었음을 확신합니다.

핸드 셰이 킹 위키 백과에 언급 된대로 :

  1. Alice [Server]는 Bob [Client]이 수신하고 응답 할 필요가없는 수신 확인 번호 y + 1의 수신 확인 메시지 로 응답 합니다.

따라서 서버가 준비되었다는 확신을 조금 더 줄이려면 서버는 3 단계를 건너 뛸 수 있으며 클라이언트는 서버가 준비되었다고 가정합니다. 위의 프로토콜 교환은 다음과 같습니다.

  1. 서버 : "좋은 오후, Epiphyte Corp."
  2. 발신자 : "안녕하세요. 랜디입니다."
  3. 발신자 : "이멜다 마르코스에 대한 농담을 아십니까?"

3way가 완료되고 데이터가 비닝되기 전에 자신을 보내는 것이 아닙니다. 최신 OS 스택에서 TCP 연결이 설정되는 방식 연결의 세 번째 부분까지 실제로 테이블에 기록 된 연결 데이터가 없습니다. 자원을 사용하기 전에 세 번째 메시지의 요구 사항은 "Syn Cookies"를 사용하여 수행됩니다. "Syn Attacks"(위조 된 소스 IP 핸드 셰이크 패킷 1. 위조 된 소스 IP를 손상시키는 패킷 3)를 방지합니다. 따라서이 시점 이전에는 연결이나 항목이 없습니다.
iain

청각 (3)은 서버가 전송 후 즉시 자발적인 연소를 겪는 것을 보장하지는 않지만 서버가 수신 할 준비가되었음을 확신합니다.
msw

증가하다? 제로에서? 글쎄, 나는 문자 그대로 사실이라고 생각하지만, 대부분의 사람들은 패킷 3 전에 / some / 가능성이 있음을 암시 할 것입니다. 그리고 없습니다. 내가 싫어하는 "신뢰도 향상"이라는 문구 일 뿐이며, 0.001 %의 '실제 주요 문제'를 고려하면 문제를 명확하게 유지하는 데 도움이된다고 생각하지 않습니다. 물론, 서버가 패킷을 받기 전에 핵전쟁이 일어날 수 있으며, 많은 일이 일어날 수 있습니다.
iain

또한 마지막 단락에서 3 단계가 선택 사항임을 암시했습니다. 그렇지 않습니다. 단락 3을 다시 읽으십시오. 3 단계는 "승인으로 앨리스가 응답합니다"입니다. 그것은 선택 사항이 아닙니다. 그 답에 답하는 밥은 (이론적 인 4 단계)입니다.
iain
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.