App Engine принимает Far Longer (> 1 сек) для обслуживания статического JS, чем статический CSS

(Вопрос отредактирован b/c Я понял, что он включает тип файла)

Этот файл равен 20kb. Он последовательно принимает > 1 секунду для подачи.

http://www.adrenalinemobility.com/js/ss-symbolicons.js

Вот тот же файл с .css как его расширение:

http://www.adrenalinemobility.com/js/ss-symbolicons.css

Он работает почти на целую секунду быстрее.

Вот мой app.yaml:

application: adrenaline-website
version: 1
api_version: 1
runtime: python27
threadsafe: true

libraries:
- name: jinja2
  version: latest

handlers:
- url: /favicon\.ico
  static_files: assets/favicon.ico
  upload: assets/favicon\.ico

- url: /css
  static_dir: assets/css

- url: /img
  static_dir: assets/img

- url: /js
  static_dir: assets/js

- url: /.*
  script: web.APP

Я также пробовал эту строку static_files (перед обработчиком /js ), и она тоже была медленной:

- url: /js/ss-symbolicons.js
  static_files: assets/js/ss-symbolicons.js
  upload: assets/js/ss-symbolicons.js

Как я это заметил:

  • Chrome, Firefox (как в Linux) - от DSL-соединения в Silicon Valley
  • wget, curl и т.д. с этой машины.
  • Удаленный wget и завиток с высокоскоростного сервера в Университете штата Иллинойс.
  • Службы удаленного веб-тестирования, такие как webpagetest (см. ниже):

Здесь показан график водопадов webpagetest, который иллюстрирует эту проблему: обратите внимание, что один файл имеет огромный TTFB: http://www.webpagetest.org/result/131101_ZQ_ZGQ/1/details/

Если я вручную установил mime_type на text, тогда он будет работать быстро. application/javascript, application/x-javascript, text/javascript все медленно. В настоящее время эти файлы обслуживаются без заданного вручную mime-типа, если вы хотите протестировать.

Дополнительная информация, как заметил jchu:

Медленная версия поддерживает: Content-Length: 19973, а быстрая версия: Transfer-Encoding: chunked

Еще подробности:

Я обычно получаю сервер 74.125.28.121. Кто-то из reddit получил сервер 173.194.71.121, и он, похоже, даже поддерживает скорость между ними. Возможно, это зависит от сервера/местоположения?

Еще одно сообщение об этой проблеме

Вот пастебин с полными локонными журналами запросов для обоих файлов

Вот еще один паштет с информацией о времени из десяти запросов по каждому файлу в узком цикле

Ответ 1

Добавьте mime_type: текст в ваш статический ресурс JavaScript.

Нужно будет посмотреть, что предполагается mime_type, какой умный трюк выполняется для текста и других типов mime...

Ответ 2

Я видел такое же поведение.

У GAE есть странное поведение кэширования кэша для этих файлов javascript. После 4-го или пятого последовательного запроса время отклика значительно улучшается (некоторый тип кэширования краев содержимого gzipped-контента). В моих экспериментах он перешел от 1.2s → 190ms

Я смог воспроизвести это последовательно в трех приложениях GAE. Если вы используете Chrome, вы можете перейти к настройкам DevTools и отключить кеш (в то время как DevTools открыт). Перезагрузив страницу несколько раз, вы получите время передачи javascript до разумных чисел.

Крайний кэш Google, вероятно, имеет некоторую логику, где он определяет, что он не будет пытаться кэшировать gzipped js файлы, пока они не будут запрошены достаточно часто. Это, по-видимому, побудит вас написать script, который постоянно загружает ваши js файлы, чтобы обеспечить их загрузку на несколько сотен миллисекунд быстрее. Я подозреваю, что кэш кэша достаточно умен, чтобы кэшировать только один регион за раз.