Rails: срок выполнения истек на time_zone_select

Периодически возникает следующее исключение:

An ActionView::Template::Error occurred

execution expired
vendor/bundle/ruby/1.9.1/gems/activesupport-3.2.13/lib/active_support/dependencies.rb:251:in `require'

Это полный след:

vendor/bundle/ruby/1.9.1/gems/activesupport-3.2.13/lib/active_support/dependencies.rb:251:in `require'
vendor/bundle/ruby/1.9.1/gems/activesupport-3.2.13/lib/active_support/dependencies.rb:251:in `block in require'
vendor/bundle/ruby/1.9.1/gems/activesupport-3.2.13/lib/active_support/dependencies.rb:236:in `load_dependency'
vendor/bundle/ruby/1.9.1/gems/activesupport-3.2.13/lib/active_support/dependencies.rb:251:in `require'
vendor/bundle/ruby/1.9.1/gems/tzinfo-0.3.37/lib/tzinfo/timezone.rb:103:in `get'
vendor/bundle/ruby/1.9.1/gems/tzinfo-0.3.37/lib/tzinfo/timezone_proxy.rb:80:in `real_timezone'
vendor/bundle/ruby/1.9.1/gems/tzinfo-0.3.37/lib/tzinfo/timezone_proxy.rb:52:in `period_for_utc'
vendor/bundle/ruby/1.9.1/gems/tzinfo-0.3.37/lib/tzinfo/timezone.rb:458:in `current_period'
vendor/bundle/ruby/1.9.1/gems/activesupport-3.2.13/lib/active_support/core_ext/object/try.rb:36:in `try'
vendor/bundle/ruby/1.9.1/gems/activesupport-3.2.13/lib/active_support/values/time_zone.rb:212:in `utc_offset'
vendor/bundle/ruby/1.9.1/gems/activesupport-3.2.13/lib/active_support/values/time_zone.rb:226:in `<=>'
vendor/bundle/ruby/1.9.1/gems/activesupport-3.2.13/lib/active_support/values/time_zone.rb:334:in `sort'
vendor/bundle/ruby/1.9.1/gems/activesupport-3.2.13/lib/active_support/values/time_zone.rb:334:in `all'
vendor/bundle/ruby/1.9.1/gems/actionpack-3.2.13/lib/action_view/helpers/form_options_helper.rb:507:in `time_zone_options_for_select'
vendor/bundle/ruby/1.9.1/gems/actionpack-3.2.13/lib/action_view/helpers/form_options_helper.rb:612:in `to_time_zone_select_tag'
vendor/bundle/ruby/1.9.1/gems/actionpack-3.2.13/lib/action_view/helpers/form_options_helper.rb:277:in `time_zone_select'
vendor/bundle/ruby/1.9.1/gems/actionpack-3.2.13/lib/action_view/helpers/form_options_helper.rb:654:in `time_zone_select'

Когда я перехожу на страницу, о которой идет речь, она загружается нормально. Кажется, что для большинства людей он загружается нормально и только периодически (редко) дает сбой. Я заметил, что всякий раз, когда это происходит, пользовательский агент - это бот; самый последний - Mozilla/5.0 (compatible; Baiduspider/2.0; +http://www.baidu.com/search/spider.html). Но меня беспокоит, что однажды это может случиться с человеком, поэтому мне интересно, знает ли кто-нибудь что-нибудь, что я могу с этим поделать?

Обновлять

Это произошло сегодня, когда пользователь вошел в систему (к счастью, этим пользователем был я ... не смог воспроизвести это, хотя).

execution expired
vendor/bundle/ruby/1.9.1/gems/psych-1.3.4/lib/psych/visitors/visitor.rb:15:in `visit'

След:

vendor/bundle/ruby/1.9.1/gems/psych-1.3.4/lib/psych/visitors/visitor.rb:15:in `visit'
vendor/bundle/ruby/1.9.1/gems/psych-1.3.4/lib/psych/visitors/visitor.rb:5:in `accept'
vendor/bundle/ruby/1.9.1/gems/psych-1.3.4/lib/psych/visitors/emitter.rb:36:in `block in visit_Psych_Nodes_Sequence'
vendor/bundle/ruby/1.9.1/gems/psych-1.3.4/lib/psych/visitors/emitter.rb:36:in `each'
vendor/bundle/ruby/1.9.1/gems/psych-1.3.4/lib/psych/visitors/emitter.rb:36:in `visit_Psych_Nodes_Sequence'
vendor/bundle/ruby/1.9.1/gems/psych-1.3.4/lib/psych/visitors/visitor.rb:15:in `visit'
vendor/bundle/ruby/1.9.1/gems/psych-1.3.4/lib/psych/visitors/visitor.rb:5:in `accept'
vendor/bundle/ruby/1.9.1/gems/psych-1.3.4/lib/psych/visitors/emitter.rb:26:in `block in visit_Psych_Nodes_Document'
vendor/bundle/ruby/1.9.1/gems/psych-1.3.4/lib/psych/visitors/emitter.rb:26:in `each'
vendor/bundle/ruby/1.9.1/gems/psych-1.3.4/lib/psych/visitors/emitter.rb:26:in `visit_Psych_Nodes_Document'
vendor/bundle/ruby/1.9.1/gems/psych-1.3.4/lib/psych/visitors/visitor.rb:15:in `visit'
vendor/bundle/ruby/1.9.1/gems/psych-1.3.4/lib/psych/visitors/visitor.rb:5:in `accept'
vendor/bundle/ruby/1.9.1/gems/psych-1.3.4/lib/psych/visitors/emitter.rb:20:in `block in visit_Psych_Nodes_Stream'
vendor/bundle/ruby/1.9.1/gems/psych-1.3.4/lib/psych/visitors/emitter.rb:20:in `each'
vendor/bundle/ruby/1.9.1/gems/psych-1.3.4/lib/psych/visitors/emitter.rb:20:in `visit_Psych_Nodes_Stream'
vendor/bundle/ruby/1.9.1/gems/psych-1.3.4/lib/psych/visitors/visitor.rb:15:in `visit'
vendor/bundle/ruby/1.9.1/gems/psych-1.3.4/lib/psych/visitors/visitor.rb:5:in `accept'
vendor/bundle/ruby/1.9.1/gems/psych-1.3.4/lib/psych/nodes/node.rb:46:in `yaml'
vendor/bundle/ruby/1.9.1/gems/psych-1.3.4/lib/psych.rb:243:in `dump'
vendor/bundle/ruby/1.9.1/gems/psych-1.3.4/lib/psych/core_ext.rb:14:in `psych_to_yaml'
/usr/local/lib/ruby/1.9.1/syck/rubytypes.rb:110:in `to_yaml'
vendor/bundle/ruby/1.9.1/gems/dalli-delete-matched-1.1.0/lib/dalli-delete-matched.rb:13:in `write_entry'
vendor/bundle/ruby/1.9.1/gems/activesupport-3.2.13/lib/active_support/cache/strategy/local_cache.rb:140:in `write_entry'
vendor/bundle/ruby/1.9.1/gems/dalli-2.6.2/lib/active_support/cache/dalli_store.rb:102:in `block in write'
vendor/bundle/ruby/1.9.1/gems/dalli-2.6.2/lib/active_support/cache/dalli_store.rb:279:in `block in instrument'
vendor/bundle/ruby/1.9.1/gems/activesupport-3.2.13/lib/active_support/notifications.rb:125:in `instrument'
vendor/bundle/ruby/1.9.1/gems/dalli-2.6.2/lib/active_support/cache/dalli_store.rb:279:in `instrument'
vendor/bundle/ruby/1.9.1/gems/dalli-2.6.2/lib/active_support/cache/dalli_store.rb:101:in `write'
vendor/bundle/ruby/1.9.1/gems/dalli-2.6.2/lib/active_support/cache/dalli_store.rb:78:in `fetch'
app/models/concerns/roleable.rb:11:in `roles'

Опять же, приветствуются любые идеи!

Я размещаю это на Heroku и использую Unicorn, следуя инструкциям на https://blog.heroku.com/archives/2013/2/27/unicorn_rails


person Alex Ghiculescu    schedule 23.03.2013    source источник
comment
Это происходит при одном конкретном действии контроллера?   -  person fotanus    schedule 28.03.2013
comment
Нет, две трассировки стека взяты с разных контроллеров.   -  person Alex Ghiculescu    schedule 28.03.2013
comment
Вы разобрались в этой ошибке? Я вижу такую ​​же ошибку и на героку. Моя трассировка стека похожа на вашу первую трассировку стека.   -  person Clark    schedule 06.05.2013
comment
@Clark - Это очень прерывисто. Я не хочу говорить, что это исправлено, но это происходило реже, хотя я (сознательно) не сделал ничего, чтобы исправить эту конкретную проблему, за исключением настройки моих настроек тайм-аута Unicorn и добавления еще одного дино (что я планировал сделать так или иначе). Дайте мне знать / опубликуйте ответ, если вы что-нибудь поймете!   -  person Alex Ghiculescu    schedule 07.05.2013
comment
Я подозреваю, что это вызвано ожиданием файловой системы heroku. Я увеличил значение тайм-аута с рекомендованных 10 секунд на сайте heroku до 25 секунд ... будет мониторинг   -  person Clark    schedule 07.05.2013
comment
Какая это переменная тайм-аута / как вы ее установили?   -  person Alex Ghiculescu    schedule 08.05.2013
comment
@AlexGhiculescu Итак, вы в конце концов узнали, что случилось?   -  person fotanus    schedule 14.08.2013
comment
@fotanus no :( Есть еще один вопрос по теме в заголовке stackoverflow.com/questions/16741227/ - как я там сказал, в итоге мы перешли на Digital Ocean, и с тех пор это стало намного более плавным ходом.   -  person Alex Ghiculescu    schedule 15.08.2013


Ответы (3)


Отвечая на этот вопрос:

Я действительно очень хочу исправить это, но я действительно не знаю, с чего начать: /

Вы можете начать исправлять эту ошибку, зарегистрировать ее, отправить вам одно электронное письмо и, поскольку это происходит только несколько раз, повторить попытку (используя команду «retry»). После этого вы можете проверить последние действия, выполненные этим IP-адресом, и посмотреть, связаны ли они. Журнал также регистрирует переменные сеанса.

Возможно, у вас возникают тайм-ауты при высокой загрузке сервера - попробуйте использовать один инструмент Lime newrelic или даже записать использование памяти, использование процессора и использование диска вместе с другой информацией.

РЕДАКТИРОВАТЬ:

Поскольку это не только одно действие, вы можете получить каждую ошибку в ApplicationController следующим образом:

class ApplicationController < ActionController::Base
  rescue_from MyException, :with => :handle_my_exception

  def handle_my_exception
     grab_data
     send_mail
     retry
  end
 end

Я думал, что это связано с определенным действием, поэтому я не уверен, работает ли здесь повторная попытка. Но даже если вы не можете повторить попытку, вы все равно можете получить дополнительную информацию и отправить себе по электронной почте таким образом. Конечно, вы захотите добавить логику счетчика повторных попыток, иначе у вас будут проблемы.

ИЗМЕНИТЬ снова:

Подумав лучше, вы можете смоделировать повторную попытку оттуда с помощью redirect_to на основе параметров запроса. В этом ответе он объясняет, как его получить. Не забудьте также отправить параметры.

Как получить текущий абсолютный URL-адрес в Ruby на Rails?

person fotanus    schedule 28.03.2013
comment
Куда пропадет код восстановления / повторной попытки? В контроллере при вызове render или в представлении? - person Alex Ghiculescu; 28.03.2013
comment
Я добавил пример кода, показывающий, как делать то, что я предполагал. Пока не уверен, что повторная попытка сработает :( - person fotanus; 29.03.2013
comment
Об отправке почты: посмотрите github.com/smartinez87/exception_notification, он отправляет очень полезное электронное письмо. - person Gabor Garami; 30.03.2013
comment
Да, я использую exception_notification, чтобы получать электронные письма, которые предупреждают меня об этом :) - person Alex Ghiculescu; 31.03.2013

Поскольку две трассировки стека совершенно разные, я рискну предположить, что рендеринг страницы обычно занимает много времени и не связан с тем, что показано в конкретной трассировке стека: ActionView просто остановится, где бы он ни находился, когда произошел тайм-аут.

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

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

person milgner    schedule 25.03.2013

Эта проблема (по крайней мере, на Heroku) сводится к следующему коду:

ActiveSupport::TimeZone::MAPPING.each do |key,val|
  TZInfo::Timezone.get(val)
end

Вся информация о часовых поясах загружается из довольно большого набора файлов (по одному для каждого часового пояса), а затем анализируется. Почему-то эта операция очень тяжелая. Может быть, комбинация Ruby не очень эффективна при файловом вводе-выводе (?) И динамометрические станции Heroku имеют случайные проблемы при попадании в файловую систему.

Мое текущее исправление - это предварительная загрузка информации о часовом поясе (в основном с использованием приведенного выше кода) во всех рабочих Unicorn (after_fork). Теперь, по крайней мере, проблема детерминированная, а не случайная ...

person sebbarg    schedule 19.07.2013