2010-06-15 6 views
1

Я установил лак, чтобы сидеть перед сервером tomcat. Я заметил, что Varnish, кажется, ждет полной загрузки страницы (все css, js и т. Д.), Прежде чем он отправит любой ответ браузеру.Varnish ждет полной загрузки страницы перед отправкой ответа браузеру

Это вызывает огромную задержку перед тем, как пользователь видит что-либо. Если я обгоняю лак и перехожу непосредственно на сайт, он немедленно отвечает.

В то время как общее время загрузки страницы может быть схожим, считается, что сайт работает медленно.

Неужели кто-нибудь сталкивался с этим?

ответ

0

С полная страница для загрузки (все css, js и т. Д.) вы имеете в виду только встроенные ресурсы js и css, правильно? Лак будет хранить (и, надеюсь, хранить) ответ в целом, перед отправкой его клиенту. Если ваш back-end посылает ответ постепенно (например, chunked), не кэшированная страница может появиться медленнее, потому что она доставляется только лаком после того, как back-end отправил свой последний фрагмент.

Если это проблема, измените технический дизайн приложения. Удостоверьтесь, что большинство запросов можно обслуживать из кеша (эти страницы будут очень быстрыми) и экстернализировать js & ресурсов css (кеш браузера избегает выполнения запросов вообще). Если есть небольшая часть вашей страницы, которая медленная и плохо кэшируемая, загрузите ее асинхронно (например, Ajax).

Существует также концепция инкрементного рендеринга (страницы повторного рендеринга браузера с появлением большего количества ресурсов), но я не вижу, как Varnish изменит это поведение.

2

Если у вас нет встроенных JS и CSS в вашем HTML, описанное вами поведение просто технически невозможно. Вашему браузеру необходимо будет получать и анализировать HTML-код для извлечения и <link> тегов и отправки отдельных HTTP-запросов; даже если они дойдут до одного и того же Varnish-сервера, не будет понятия, что они являются частью одной и той же «страницы».

Попробуйте изменить HTML-код для загрузки статических (JS, CSS и изображений) из другого имени хоста, которое не переходит в лак; что должно облегчить процесс отладки. Вы можете получить тот же результат, используя HTTP-клиент командной строки, например. curl. Если вы все еще видите такую ​​же медленную производительность в этом сценарии, посмотрите на журналы Varnish, это, скорее всего, даст вам довольно много идей для проверки всего материала. Не стесняйтесь добавлять это как комментарий, таким образом мы сможем помочь вам лучше.

0

Я думаю, что вы сбились с толку от буферизации ответа лака. Предположим, что самый быстрый ваш сервер может ответить 100-страничной страницей для данного запроса - 10 секунд, отправляя по 10 тысяч в секунду. Без лака в вашем стеке клиентское соединение туннелируется непосредственно на задний конец, и браузер начинает получать данные за 1 секунду (первые 10k и начинает анализировать, отображать, следовать за <link> тегами и т. Д.).

С лаком в вашем стеке он ожидает, что задний конец отправит всю страницу перед отправкой первого байта клиенту. Таким образом, клиент должен ждать 10 секунд, пока он не сможет начать рендеринг страницы, следуя <link> тегам и т. Д. Верьте или нет, это хорошо для двух основных причин. Во-первых, если этот ответ кэшируемый, следующий клиент не должен ждать 10 секунд, чтобы задний конец сгенерировал ответ, лак будет обслуживать его довольно быстро (мс, а не s). Если ваш рейтинг попадания высок, и вы должны его оптимизировать, первоначальная стоимость ожидания первого байта ответа платит много дивидендов в будущих хитах кэша.Двое, скажем, мобильный телефон по пятнистому сотовому сигналу запрашивает эту же страницу на 100 тыс. Страниц, но он не может загрузить страницу так быстро, как может ее создать бэкенд, ей нужна полная минута, чтобы получить страницу 100 тыс. Страниц. При использовании лака apache не должен тратить время на соединение и нить на целую минуту (в основном, простаивайте, заметьте), пока он медленно передает данные клиенту. Он отправляет данные так быстро, как можно лакировать, а затем переходит к следующему запросу, а лак медленно посылает данные клиенту.

Для запросов, которые, как известно, не подлежат кешированию, вы можете настроить лак через VCL, если хотите, return (pipe), что не приведет к буферизации ответа. Он отправит данные непосредственно с вашего конца клиенту, как только он его получит. Но в канале default.vcl не используется.

Смежные вопросы