2013-09-29 1 views
1

Я получаю странное поведение - когда приложение запускает новый экземпляр в первый раз, я получаю DeadlineExceededError. Когда я нажимаю обновление в браузере, он работает нормально. И неважно, на какой странице я пытаюсь. Странная вещь, я могу видеть весь мой код отладки просто отлично. Фактически, я пишу в журнал непосредственно перед вызовом self.response, и он отображается в журнале консоли. Это довольно трудно устранить, так как я не имею никаких проблем загрузки страницы в среде разработки, а отслеживающий немного непрозрачным для меня:DeadlineExceededError только при запуске нового экземпляра (с использованием webapp2)

E 2013-09-29 00:10:03.975 
Traceback (most recent call last): 
    File "/base/data/home/runtimes/python27/python27_lib/versions/1/google/appengine/runtime/wsgi.py", line 267, in Handle 
    for chunk in result: 
    File "/base/data/home/runtimes/python27/python27_lib/versions/1/google/appengine/ext/appstats/recording.py", line 1286, in appstats_wsgi_wrapper 
    end_recording(status) 
    File "/base/data/home/runtimes/python27/python27_lib/versions/1/google/appengine/ext/appstats/recording.py", line 1410, in end_recording 
    rec.save() 
    File "/base/data/home/runtimes/python27/python27_lib/versions/1/google/appengine/ext/appstats/recording.py", line 654, in save 
    key, len_part, len_full = self._save() 
    File "/base/data/home/runtimes/python27/python27_lib/versions/1/google/appengine/ext/appstats/recording.py", line 678, in _save 
    namespace=config.KEY_NAMESPACE) 
    File "/base/data/home/runtimes/python27/python27_lib/versions/1/google/appengine/api/memcache/__init__.py", line 1008, in set_multi 
    namespace=namespace) 
    File "/base/data/home/runtimes/python27/python27_lib/versions/1/google/appengine/api/memcache/__init__.py", line 907, in _set_multi_with_policy 
    status_dict = rpc.get_result() 
    File "/base/data/home/runtimes/python27/python27_lib/versions/1/google/appengine/api/apiproxy_stub_map.py", line 612, in get_result 
    return self.__get_result_hook(self) 
    File "/base/data/home/runtimes/python27/python27_lib/versions/1/google/appengine/api/memcache/__init__.py", line 974, in __set_with_policy_hook 
    rpc.check_success() 
    File "/base/data/home/runtimes/python27/python27_lib/versions/1/google/appengine/api/apiproxy_stub_map.py", line 578, in check_success 
    self.__rpc.CheckSuccess() 
    File "/base/data/home/runtimes/python27/python27_lib/versions/1/google/appengine/api/apiproxy_rpc.py", line 133, in CheckSuccess 
    raise self.exception 
DeadlineExceededError 

I 2013-09-29 00:10:03.988 
This request caused a new process to be started for your application, and thus caused your application code to be loaded for the first time. This request may thus take longer and use more CPU than a typical request for your application. 

Я не знаю, как даже идти об отладке это, поскольку ошибка, кажется, после моего кода уже запущена.

Edit: Я хотел бы добавить следующее:

I 2013-09-29 00:09:06.919 
    DEBUG: Writing output! 
E 2013-09-29 00:10:03.975 

Вы можете увидеть там почти целую минуту между протоколирования «Дать выход!» как раз перед вызовом self.response и при возникновении ошибки.

ответ

0

Deadlineexceedederror происходит в движке приложения, если какой-либо запрос экземпляра интерфейса не получает ответа в течение 60 секунд. Итак, что происходит в вашем случае, должно быть, что, когда нет исполняемого экземпляра, и ваше приложение получает новый пользовательский запрос, для обработки запускается новый экземпляр. Это приведет к общему response time = instance startup time like library loading and initial data access + the time for processing the user request, и это приведет к превышению конечной ошибки. Затем, когда вы сразу обращаетесь к своему приложению, есть уже запущенный экземпляр и поэтому response time = the time for processing the user request, и вы не получите никаких ошибок.

Просьба ознакомиться с предлагаемыми подходами для handling deadlineexceedederror, включая запросы на разогрев, которые напоминают сохранение экземпляра перед прибытием запроса на живой запрос.

+0

Я прочитал это, но я не уверен, что это применимо. Я не импортирую много модулей, и я не уверен, что здесь будут полезны запросы на разминку, так как это происходит, когда есть нулевые экземпляры. (В настоящее время я тестирую своих пользователей и пока еще не так много трафика.) Также есть тот факт, что он умеет писать в журнал только отлично, и в этот момент все мои библиотеки загружены. Если максимальное время составляет 60 секунд, я могу сделать вывод, что мой код занимает всего 3 секунды для запуска, а затем истекает после того, как был вызван запрос self.response. –

+0

Хорошо, думаю, я понял. Я включил запросы на разминку, что позволило мне установить минимальное количество незанятых экземпляров. Я установил его в 1, что теперь позволяет загрузке страницы просто отлично. Я все еще думаю, что это немного странно, нужно делать это, потому что из того, что я могу сказать, мой код занимает всего 3 секунды, когда он запускается. –

+0

Включение мини-холостых экземпляров маскирует проблему, так как вы не разворачиваете экземпляр. Вы по-прежнему будете сталкиваться с этой проблемой время от времени, когда нагрузка повышается, и вам нужно развернуть новый isntance. По крайней мере, вы загружаете модуль appstats. Попробуйте отключить это для запуска. Также возможно, что несколько модулей, которые вы импортируете, косвенно импортируют многие другие модули. – dragonx

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

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