2010-06-15 3 views
1

Tomcat 서버 앞에 앉아서 니스를 설정했습니다. 내가 알아 차 렸던 점은 Varnish가 브라우저에 응답을 보내기 전에 전체 페이지가로드 될 때까지 기다리는 것처럼 보입니다 (모든 CSS, JS 등).Varnish는 브라우저에 응답을 보내기 전에 전체 페이지로드를 대기합니다.

사용자가보기 전에 거대한 지연이 발생합니다. 내가 바니시를 우회하여 사이트로 직접 가면 즉시 대응합니다.

총 페이지로드 시간은 비슷하지만 사이트가 느린 것으로 인식됩니다.

누구에게도이 문제가 발생 했습니까?

답변

0

(전체 CSS, js 등)을로드하는 페이지은 js 및 CSS 리소스 만 포함한다는 의미입니까? 맞습니까? Varnish는 응답을 클라이언트에 보내기 전에 전체 응답을 버퍼링 (및 저장)합니다. 백엔드가 점차적으로 응답을 보내면 (예 : 청크) 백엔드에서 마지막 부분을 보낸 후에만 바니쉬로 전달되기 때문에 캐시되지 않은 페이지의 속도가 느려질 수 있습니다.

문제가 발생하면 응용 프로그램의 기술 설계를 변경하십시오. 캐시에서 대부분의 요청을 처리 할 수 ​​있는지 확인하십시오 (이 페이지는 매우 빠름). js & CSS 리소스를 외부화합니다 (브라우저 캐시는 요청을 전혀하지 않습니다). 느리고 캐시하기 어려운 페이지의 일부만 비동기 적으로로드하십시오 (예 : Ajax).

점진적 렌더링 (더 많은 리소스를 사용할 수있게 브라우저가 페이지를 다시 렌더링 함)의 개념도 있지만 바니시가이 동작을 어떻게 변경하는지는 알 수 없습니다.

2

HTML에 JS 및 CSS 인라인이 없으면 기술적으로 설명하는 동작이 단순히 불가능합니다. 브라우저가 <script><link> 태그를 추출하고 별도의 HTTP 요청을 보내려면 HTML을 받아서 구문 분석해야합니다. 동일한 Varnish 서버를 사용하더라도 동일한 "페이지"에 속해 있다는 것을 알 수 없습니다.

바니시로 이동하지 않는 다른 호스트 이름에서 정적 (JS, CSS 및 이미지)을로드하도록 HTML을 변경하십시오. 더 쉽게 디버깅 할 수 있어야합니다. 명령 줄 HTTP 클라이언트를 사용하여 동일한 결과를 얻을 수 있습니다. curl. 이 시나리오에서 여전히 느린 성능이 나타나는 경우, 광택 로그를 살펴보면 더 많은 내용을 확인할 수있는 아이디어가 많을 것입니다. 의견을 자유롭게 추가하면보다 효과적으로 도움을받을 수 있습니다.

0

당신은 바니시의 반응 버퍼링으로 혼란스러워하고 있다고 생각합니다. 가장 빠른 백엔드가 주어진 요청에 대해 100k 페이지로 응답 할 수 있다고 가정 할 때 매초마다 10k를 보내는 10 초입니다. 스택에 바니시가 없으면 클라이언트 연결은 백엔드로 직접 터널링되고 브라우저는 1 초 안에 데이터를 수신하기 시작합니다 (첫 번째 10k, 구문 분석, 렌더링, <link> 태그 따르기 등).

스택에 바니시가있는 경우 첫 번째 바이트를 클라이언트에 보내기 전에 백 엔드가 전체 페이지를 보낼 때까지 기다립니다. 따라서 클라이언트는 페이지 렌더링을 시작할 수있을 때까지 10 초를 기다린 후 <link> 태그 등을 따라야합니다. 믿거 나 말거나, 이것은 두 가지 주된 이유 때문에 좋습니다. 하나는 응답이 캐시 가능하면 다음 클라이언트는 백엔드가 응답을 생성 할 때까지 10 초를 기다릴 필요가 없으므로 바니시는 매우 빨리 처리합니다 (ms, s가 아님). 적중률이 높은 경우 (최적화해야하는 경우) 응답의 첫 번째 바이트를 기다리는 데 드는 초기 비용은 향후 캐시 히트에 많은 배당금을 지불합니다.두 번째, 반점이있는 셀 신호를 사용하는 휴대 전화가 동일한 100k 페이지를 요청한다고 가정 해 봅시다. 그러나 백엔드가 생성 할 수있는만큼 빨리 페이지를 다운로드 할 수는 없으며 100k 페이지를 수신하려면 1 분이 필요합니다. 제자리에 바니시가 있으면 클라이언트가 천천히 데이터를 클라이언트로 전송하는 동안 아파치가 연결과 스레드를 낭비 할 필요가 없습니다. 가능한 한 빨리 데이터를 보내고 바니시가 데이터를 클라이언트에 천천히 보내는 동안 다음 요청으로 이동합니다.

캐시 할 수없는 것으로 알려진 요청의 경우, VCL을 통해 원하는 경우, 응답 버퍼링을 초래하지 않는 return (pipe)으로 바니시를 구성 할 수 있습니다. 데이터를 수신하자마자 백엔드에서 클라이언트로 직접 데이터를 보냅니다. 그러나 default.vcl 파이프는 사용되지 않습니다.

관련 문제