이 인용문의 저자이기 때문에 응답하겠습니다 :-)
대규모 사이트에는 동시 연결과 대기 시간이라는 두 가지 큰 문제가 있습니다. 동시 연결은 콘텐츠를 다운로드하는 데 오래 걸리는 느린 클라이언트와 유휴 연결 상태로 인해 발생합니다. 이러한 유휴 연결 상태는 연결을 다시 사용하여 연결 유지 (keep-alive)라고하는 여러 개체를 가져 오기 때문에 발생하며 이는 대기 시간으로 인해 더욱 증가합니다. 클라이언트가 서버와 매우 가까우면 연결을 집중적으로 사용하고 거의 유휴 상태가되지 않도록 할 수 있습니다. 그러나 시퀀스가 종료되면 아무도 채널을 빠르게 닫는 데 신경 쓰지 않으며 연결은 오랫동안 열려 있고 사용되지 않습니다. 이것이 많은 사람들이 매우 낮은 연결 유지 시간 제한을 사용하도록 제안하는 이유입니다. Apache와 같은 일부 서버에서 설정할 수있는 가장 낮은 시간 제한은 1 초이며 높은로드를 유지하기에는 너무 많은 경우가 많습니다. 당신 앞에 20000 개의 클라이언트가 있고 그들이 평균적으로 매초마다 하나의 개체를 가져 오면 20000 개의 연결이 영구적으로 설정됩니다. Apache와 같은 범용 서버에서 20000 개의 동시 연결은 거대하고로드되는 모듈에 따라 32GB에서 64GB 사이의 RAM이 필요하며 RAM을 추가해도 훨씬 더 높이는 것을 기대할 수 없습니다. 실제로 20000 클라이언트의 경우 브라우저가 가져올 개체가 많은 경우 2 ~ 3 개의 연결을 설정하려고하기 때문에 서버에서 40000 ~ 60000 개의 동시 연결을 볼 수도 있습니다. RAM을 추가해도 훨씬 더 높이 올라가고 싶지 않을 것입니다. 실제로 20000 클라이언트의 경우 브라우저가 가져올 개체가 많은 경우 2 ~ 3 개의 연결을 설정하려고하기 때문에 서버에서 40000 ~ 60000 개의 동시 연결을 볼 수도 있습니다. RAM을 추가해도 훨씬 더 높이 올라가고 싶지 않을 것입니다. 실제로 20000 클라이언트의 경우 브라우저가 가져올 개체가 많은 경우 2 ~ 3 개의 연결을 설정하려고하기 때문에 서버에서 40000 ~ 60000 개의 동시 연결을 볼 수도 있습니다.
각 개체 이후에 연결을 닫으면 동시 연결 수가 크게 감소합니다. 실제로는 개체 사이의 시간에 따라 개체를 다운로드하는 데 걸리는 평균 시간에 해당하는 요소만큼 떨어집니다. 개체 (미니어처 사진, 버튼 등)를 다운로드하는 데 50ms가 필요하고 위와 같이 초당 평균 1 개 개체를 다운로드하면 클라이언트 당 0.05 개의 연결 만 가능합니다. 20000 개의 클라이언트에 대한 동시 연결.
이제 새로운 연결을 설정하는 시간이 중요 할 것입니다. 원거리 클라이언트는 불쾌한 대기 시간을 경험하게됩니다. 과거에 브라우저는 연결 유지가 비활성화되었을 때 많은 양의 동시 연결을 사용했습니다. MSIE에서 4, Netscape에서 8의 숫자를 기억합니다. 이것은 실제로 개체 당 평균 대기 시간을 그만큼 나눈 것입니다. 연결 유지가 모든 곳에 존재하므로 원격 서버에 대한 부하가 더욱 증가하고 브라우저가 인터넷 인프라를 보호하기 때문에 더 이상 그 수가 많지 않습니다.
즉, 오늘날의 브라우저에서는 연결 유지 서비스만큼 응답 성이없는 연결 유지 서비스를 얻는 것이 더 어렵습니다. 또한 일부 브라우저 (예 : Opera)는 휴리스틱을 사용하여 파이프 라이닝을 사용합니다. 파이프 라이닝은 응답을 기다리지 않고 여러 요청을 전송하여 대기 시간을 거의 없애기 때문에 연결 유지를 사용하는 효율적인 방법입니다. 100 장의 작은 사진이있는 페이지에서 시도해 보았고 첫 번째 액세스는 연결 유지가없는 것보다 약 2 배 빠르지 만 다음 액세스는 응답이 너무 작아서 지연 시간 만 계산되기 때문에 약 8 배 더 빠릅니다. "304"응답).
이상적으로는 브라우저에 몇 가지 튜너 블을 가져 와서 가져온 개체 간의 연결을 유지하고 페이지가 완료되면 즉시 삭제해야한다고 말하고 싶습니다. 그러나 불행히도 우리는 그것을 보지 못하고 있습니다.
이러한 이유로 Apache와 같은 범용 서버를 전면에 설치해야하고 많은 양의 클라이언트를 지원해야하는 일부 사이트는 일반적으로 연결 유지를 비활성화해야합니다. 또한 브라우저가 연결 수를 늘리도록 강제하기 위해 다운로드를 병렬화 할 수 있도록 여러 도메인 이름을 사용합니다. 한 번의 추가 왕복이 있으므로 연결 설정이 훨씬 더 높기 때문에 SSL을 집중적으로 사용하는 사이트에서 특히 문제가됩니다.
요즘 더 일반적으로 관찰되는 것은 그러한 사이트가 수만에서 수십만 개의 동시 연결을 처리하는 데 문제가없는 haproxy 또는 nginx와 같은 가벼운 프런트 엔드를 설치하는 것을 선호하고 클라이언트 측에서 연결 유지를 활성화하고 아파치 측. 이 측면에서 연결 설정 비용은 CPU 측면에서 거의 null이며 시간 측면에서 전혀 눈에 띄지 않습니다. 이렇게하면 클라이언트 측에서 매우 낮은 시간 초과로 연결 유지로 인한 짧은 대기 시간과 서버 측의 낮은 연결 수가 두 가지 장점을 모두 제공합니다. 모든 사람이 행복하다 :-)
일부 상용 제품은 프론트로드 밸런서와 서버 간의 연결을 재사용하고이를 통해 모든 클라이언트 연결을 멀티플렉싱하여이를 더욱 향상시킵니다. 서버가 LB에 가까울 때 이득은 이전 솔루션보다 그다지 높지 않지만 여러 사용자 간의 예기치 않은 연결 공유로 인해 사용자 간의 세션 교차 위험이 없도록 애플리케이션을 조정해야하는 경우가 많습니다. . 이론적으로 이것은 결코 일어나지 않아야합니다. 현실은 많이 다릅니다 :-)