2014-12-22 4 views
0

Я использую инфраструктуру Cherrypy 3.6.0. У меня проблема с длительной загрузкой страниц (для статических файлов требуется много времени), когда я открываю страницу в нескольких браузерах. В этом случае, например, файл bootstrap.min.css, который имеет 120 КБ, может загружать 5-10 секунд. Что еще хуже, статические файлы никогда не кэшируются, поэтому при каждой загрузке страницы статические файлы снова загружаются и снова за несколько секунд до загрузки страницы. Когда сервер реагирует 304 Не изменяется, он также занимает столько же времени, что и клиентская сторона получает этот ответ (нет разницы во времени ответа независимо от того, загружен ли статический файл или ответ сервера 304). Моя порция статической конфигурации файлов:Cherrypy, обслуживающий статические файлы, занимает много времени, когда страница открыта более чем в одном браузере, файлы никогда не загружаются из кеша

cherrypy.tree.mount(None, '/static', config={ 
    '/': { 
     'tools.staticdir.on': True, 
     'tools.staticdir.dir': static_dir, 
     'tools.sessions.on': False, 
     'tools.caching.on': True, 
     'tools.caching.force' : True, 
     'tools.caching.delay' : 0, 
     'tools.expires.on' : True, 
     'tools.expires.secs' : 60*24*365 
     } 
    } 
) 

Я не могу понять, как это возможно, что извлечение файла 120KB может занять столько времени ... Может быть, кто-то может дать мне посоветовать, где я могу найти причину этой проблемы?

EDIT:

Заголовки:

Remote Address:192.168.100.100:80 
Request URL:http://192.168.100.100/static/css/bootstrap.min.css 
Request Method:GET 
Status Code:304 Not Modified 
Request Headersview source 
Accept:text/css,*/*;q=0.1 
Accept-Encoding:gzip, deflate, sdch 
Accept-Language:pl-PL,pl;q=0.8,en-US;q=0.6,en;q=0.4 
Cache-Control:max-age=0 
Connection:keep-alive 
Cookie:session_id=....................................... 
Host:192.168.100.100 
If-Modified-Since:Mon, 22 Dec 2014 12:30:51 GMT 
Referer:http://192.168.100.100/ 
User-Agent:Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/39.0.2171.95 Safari/537.36 
Response Headersview source 
Date:Fri, 14 Jan 2000 23:51:25 GMT 
Server:CherryPy/3.6.0 
Vary:Accept-Encoding 

В timining перекрытием у меня есть:

Stalled: 9.619ms 
Request sent: 0.171ms 
Waiting (TTFB): 5.02s 
Content download: 1.000ms 

Я проверил, что TTFB и это продолжительность от виртуального пользователя, делающего запрос HTTP на первый байт страницы, получаемой браузером. Так что-то не так с сервером отзывчивость ...

EDIT2:

Я создал минимальное приложение, которое загружает только статические файлы и проблема все еще происходит. Это приложение код:

сервер:

import cherrypy 

def start(): 

    import app 

    app.application() 

    cherrypy.config.update({'server.socket_host': '0.0.0.0', 'server.socket_port': 9061 }) 

    engine = cherrypy.engine 

    engine.autoreload.unsubscribe() 

    try: 

     engine.start() 

    except: 

     sys.exit(1) 

    else: 

     engine.block() 


if __name__ == '__main__':  

    start() 

приложение:

import cherrypy 

from jinja2 import Environment, FileSystemLoader 

env = Environment(loader=FileSystemLoader('/tmp/cherry/')) 


static_dir = '/media/vbox_shared/new_web/app/static' 

class Test(object): 

    @cherrypy.expose 

    def index(self): 

     template = env.get_template('test.html') 

     return template.render() 


def application(): 

    cherrypy.tree.mount(Test(), '/', config = {}) 

    cherrypy.tree.mount(None, '/static', config={ 

     '/': { 

      'tools.staticdir.on': True, 

      'tools.staticdir.dir': static_dir 
     } 

    }) 

HTML:

<html> 

<head> 

    <meta http-equiv="X-UA-Compatible" content="IE=9"/> 

    <link rel="stylesheet" href="/static/css/style.min.css"/> 

    <link rel="stylesheet" type="text/css" href="/static/css/bootstrap.min.css"/> 

    <link rel="stylesheet" type="text/css" href="/static/css/chosen.min.css"/> 

    <link rel="stylesheet" type="text/css" href="/static/css/jquery.jgrowl.min.css"/> 

    <link rel="stylesheet" href="/static/css/m-buttons.min.css"/> 

    <title>Streams</title> 

    <title>test</title> 

</head> 

<body> 

<h1>test</h1> 

<script src="/static/js/jquery-1.11.1.min.js"></script> 

    <script src="/static/js/jstree.min.js"></script> 

    <script src="/static/js/functions.js"></script> 

    <script src="/static/js/stream.js"></script> 

    <script src="/static/js/chosen.jquery.min.js"></script> 

    <script src="/static/js/chosen.proto.min.js"></script> 

    <script src="/static/js/jquery.jgrowl.min.js"></script> 

    <script src="/static/js/bootstrap.min.js"></script> 

</body> 

</html> 

ссылки на скриншоты:

http://i58.tinypic.com/21m8ar5.png http://i60.tinypic.com/euh6p0.png

EDIT3:

я сократил мое приложение:

import cherrypy 
class HelloWorld(object): 
    def index(self): 
     return """ 
      <html> 
      <head> 
       <link rel="stylesheet" href="/static/css/style.min.css"/> 
       <link rel="stylesheet" type="text/css" href="/static/css/bootstrap.min.css"/> 
       <link rel="stylesheet" type="text/css" href="/static/css/chosen.min.css"/> 
       <link rel="stylesheet" type="text/css" href="/static/css/jquery.jgrowl.min.css"/> 
       <link rel="stylesheet" href="/static/css/m-buttons.min.css"/> 
       <title>Streams</title> 
       <title>test</title> 
      </head> 
      <body> 
      <h1>test</h1> 
       <script src="/static/js/jquery-1.11.1.min.js"></script> 
       <script src="/static/js/jstree.min.js"></script> 
       <script src="/static/js/chosen.jquery.min.js"></script> 
       <script src="/static/js/chosen.proto.min.js"></script> 
       <script src="/static/js/jquery.jgrowl.min.js"></script> 
       <script src="/static/js/bootstrap.min.js"></script> 
      </body> 
      </html>""" 

    index.exposed = True 

conf = { 
     '/static': 
     { 
     'tools.staticdir.on': True, 
     'tools.staticdir.dir':'/media/vbox_shared/new_web/app/static'} 

     } 

cherrypy.config.update({'server.socket_host': '0.0.0.0', 'server.socket_port': 9066 }) 
cherrypy.quickstart(HelloWorld(), config=conf) 

И проблема все еще происходит. Когда я открываю главную страницу в IE, FF, Safari и Chrome - некоторые статические файлы загружаются более 10 секунд ...

+0

Недавно я ответил на аналогичный вопрос (http://stackoverflow.com/a/27486666/2072035) и пришел к выводу, что CherryPy кэширует файлы по умолчанию. «Кэши» в смысле отправки заголовков, которые позволяют браузеру кэшировать контент. 'tools.caching' для кэширования в процессе работы, я не думаю, что это хорошая идея для статического контента. Можете ли вы показать нам заголовки в оба конца для вашего 'bootstrap.min.css'. – saaj

ответ

1

Вы должны были опустить некоторые заголовки и некоторую конфигурацию. CherryPy отправляет Vary: Accept-Encoding только для ответов gzipped. Обычно он отправляет Last-Modified, Content-Type, Content-Length и некоторые другие. Также обратите внимание, что Cache-Control: max-age=0 означает, что вы выполняете запрос обновления, запрашивающий сервер для проверки ресурса.

В the answer Я связала в комментарии я показал, что обычно 304 Not Modified только стоит CherryPy на os.stat вызов, который является мгновенным, если ваш диск не поврежден.

Что я предлагаю вам сделать, это запустить отдельное приложение CherryPy в том же статическом каталоге, что и только tools.staticdir, чтобы избежать возможных неправильных настроек, проблем с блокировкой сеансов и т. Д. Затем постепенно добавьте конфигурацию и измерьте время отклика, например. с Apache's ab -c 10 -n 1000 http://192.168.100.100/static/css/bootstrap.min.css.

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

  • Нет связанных вопросов^_^