Назад | Перейти на главную страницу

Как избежать зависания сервера из-за внешней проблемы с Javascript?

У меня возникла странная проблема с внешне связанными библиотеками Javascript, висящими на моем сервере балансировки нагрузки, на котором запущен HAProxy. Я недавно интегрировал скрипт мониторинга Quantcast, и он работал около 12 часов, а на следующее утро я обнаружил, что огромное количество сетевых подключений зависло, как показано на графике ниже. Все веб-серверы за моим балансировщиком нагрузки также были полностью перегружены соединениями. Я удалил скрипт Quantcast, и проблема исчезла.

У меня была эта проблема с некоторыми другими пакетами аналитики, но никогда не было этой проблемы с Google Analytics или AdSense (обе внешние библиотеки). Кто-нибудь когда-нибудь сталкивался с этим или есть предложения, как этого избежать?

График Netstat

Вы уверены, что это вызвано javascript?

Куда вы вставили тег Quantcast? Попробуйте его в конце страницы, чуть выше, чтобы не задерживать загрузку других ресурсов (img, css и т. Д.).

Браузеры «зависают», если им нужно ждать javascript, но только потому, что он должен приостановить поток рендеринга, чтобы дождаться document.write в скрипте. Он не может поддерживать TCP-соединение с портом 80 открытым, кроме случаев, когда у вас есть проблема с загрузкой ресурсов.

График больше похож на проблему нехватки памяти: если вы запустите mpm-prefork, убедитесь, что MaxClients не установлен слишком высоко, иначе вы столкнетесь с подкачкой, что приведет к множеству установленных соединений, но ничего не обслуживается. Также проверьте настройки http keepalive.

Попробуйте отложить запуск скрипта с помощью атрибута defer:

<script src="script.js" type="text/javascript" defer="defer"></script>

Он говорит браузеру даже не думать о скрипте, пока страница не загрузится. Если в скрипте нет document.write, его можно отложить.

Используя событие window.onload, вы можете добавить внешний Javascript (с простой конструкцией document.write или DOM) только тогда, когда страница полностью загружена (и соединение закрыто).

Обычно мы кэшируем внешние javascript-файлы локально. таким образом вам не нужно полагаться на стороннюю организацию, правильно обслуживающую JS. конечно, это может быть не вариант в зависимости от того, что делает js, или если он построен динамически. Но вы можете, например, разместить js-файлы Google Analytics локально.

Вы можете получить некоторые дополнительные преимущества, например

  1. Gzip - некоторые внешние файлы js не архивируются
  2. Заголовки кеша - вы можете настроить заголовки кеша на неограниченный срок действия (обработка обновлений с изменением имени файла)
  3. Больше контроля - конечно, большие парни обычно не собираются вносить критические изменения, но иметь внешний связанный javascript может быть рискованно.