Ruby延迟作业 - 堆栈级别太深

3

在使用延迟任务时,我经常遇到堆栈级别过深的错误。

在延迟任务中,我在很多地方都遇到了类似的错误,但是当我在控制台逐行运行相同的代码时,它可以正常工作...

Mon Dec 24 2012 01:21:39 stack level too deep
Mon Dec 24 2012 01:21:39 /usr/lib/ruby/1.8/date/format.rb:157
:in `emit'/usr/lib/ruby/1.8/date/format.rb:171
:in `emit_w'/usr/lib/ruby/1.8/date/format.rb:176
:in `emit_n'/usr/lib/ruby/1.8/date/format.rb:244
:in `strftime'/usr/lib/ruby/1.8/date/format.rb:218
:in `gsub'/usr/lib/ruby/1.8/date/format.rb:218
:in `strftime'/usr/lib64/ruby/gems/1.8/gems/activesupport-2.3.5/lib/active_support/core_ext/date/conversions.rb:58
:in `to_s'/usr/lib64/ruby/gems/1.8/gems/activerecord-2.3.5/lib/active_record/connection_adapters/abstract/quoting.rb:61
:in `quoted_date'/usr/lib64/ruby/gems/1.8/gems/activerecord-2.3.5/lib/active_record/connection_adapters/abstract/quoting.rb:29
:in `quote'/usr/lib64/ruby/gems/1.8/gems/activerecord-2.3.5/lib/active_record/connection_adapters/mysql_adapter.rb:236
:in `quote'/usr/lib64/ruby/gems/1.8/gems/activerecord-2.3.5/lib/active_record/base.rb:2392
:in `quote_bound_value'/usr/lib64/ruby/gems/1.8/gems/activerecord-2.3.5/lib/active_record/base.rb:2352
:in `replace_bind_variables'/usr/lib64/ruby/gems/1.8/gems/activerecord-2.3.5/lib/active_record/base.rb:2352
:in `gsub'/usr/lib64/ruby/gems/1.8/gems/activerecord-2.3.5/lib/active_record/base.rb:2352
:in `replace_bind_variables'/usr/lib64/ruby/gems/1.8/gems/activerecord-2.3.5/lib/active_record/base.rb:2320
:in `sanitize_sql_hash_for_conditions'/usr/lib64/ruby/gems/1.8/gems/activerecord-2.3.5/lib/active_record/base.rb:2231
:in `sanitize_sql'/usr/lib64/ruby/gems/1.8/gems/activerecord-2.3.5/lib/active_record/base.rb:1494
:in `merge_conditions'/usr/lib64/ruby/gems/1.8/gems/activerecord-2.3.5/lib/active_record/base.rb:1492
:in `each'/usr/lib64/ruby/gems/1.8/gems/activerecord-2.3.5/lib/active_record/base.rb:1492
:in `merge_conditions'/usr/lib64/ruby/gems/1.8/gems/activerecord-2.3.5/lib/active_record/base.rb:1804
:in `add_conditions!'/usr/lib64/ruby/gems/1.8/gems/activerecord-2.3.5/lib/active_record/base.rb:1687
:in `construct_finder_sql'/usr/lib64/ruby/gems/1.8/gems/activerecord-2.3.5/lib/active_record/base.rb:1548
:in `find_every'/usr/lib64/ruby/gems/1.8/gems/activerecord-2.3.5/lib/active_record/base.rb:1505
:in `find_initial'/usr/lib64/ruby/gems/1.8/gems/activerecord-2.3.5/lib/active_record/base.rb:613
:in `find'/home/myapp/apps/myapp/releases/20121130183323/app/models/api_call.rb:20
:in `log'/home/myapp/apps/myapp/releases/20121130183323/lib/twitter_logger.rb:258
:in `log_to_db'/home/myapp/apps/myapp/releases/20121130183323/lib/twitter_logger.rb:138
:in `old_user_timeline'/home/myapp/apps/myapp/releases/20121130183323/lib/twitter_logger.rb:130
:in `user_timeline'/home/myapp/apps/myapp/releases/20121130183323/lib/influencer_helper.rb:1349
:in `safely_get_user_timeline'/home/myapp/apps/myapp/releases/20121130183323/lib/twitter_helper.rb:711
:in `store_followers_tweets'/home/myapp/apps/myapp/releases/20121130183323/lib/delayed_store_follower_tweets.rb:30
:in `perform'/home/myapp/apps/myapp/releases/20121130183323/vendor/gems/delayed_job-1.8.4/lib/delayed/job.rb:215
:in `invoke_job'/home/myapp/apps/myapp/releases/20121130183323/vendor/gems/delayed_job-1.8.4/lib/delayed/job.rb:93
:in `run_with_lock'/usr/lib/ruby/1.8/timeout.rb:67
:in `timeout'/home/myapp/apps/myapp/releases/20121130183323/vendor/gems/delayed_job-1.8.4/lib/delayed/job.rb:93
:in `run_with_lock'/usr/lib/ruby/1.8/benchmark.rb:308
:in `realtime'/home/myapp/apps/myapp/releases/20121130183323/vendor/gems/delayed_job-1.8.4/lib/delayed/job.rb:92
:in `run_with_lock'/home/myapp/apps/myapp/releases/20121130183323/vendor/gems/delayed_job-1.8.4/lib/delayed/job.rb:153
:in `reserve_and_run_one_job'/home/myapp/apps/myapp/releases/20121130183323/vendor/gems/delayed_job-1.8.4/lib/delayed/job.rb:152
:in `each'/home/myapp/apps/myapp/releases/20121130183323/vendor/gems/delayed_job-1.8.4/lib/delayed/job.rb:152
:in `reserve_and_run_one_job'/home/myapp/apps/myapp/releases/20121130183323/vendor/gems/delayed_job-1.8.4/lib/delayed/job.rb:199
:in `work_off'/home/myapp/apps/myapp/releases/20121130183323/vendor/gems/delayed_job-1.8.4/lib/delayed/job.rb:198
:in `times'/home/myapp/apps/myapp/releases/20121130183323/vendor/gems/delayed_job-1.8.4/lib/delayed/job.rb:198
:in `work_off'/home/myapp/apps/myapp/releases/20121130183323/vendor/gems/delayed_job-1.8.4/lib/delayed/worker.rb:28
:in `start'/usr/lib/ruby/1.8/benchmark.rb:308
:in `realtime'/home/myapp/apps/myapp/releases/20121130183323/vendor/gems/delayed_job-1.8.4/lib/delayed/worker.rb:27
:in `start'/home/myapp/apps/myapp/releases/20121130183323/vendor/gems/delayed_job-1.8.4/lib/delayed/worker.rb:24
:in `loop'/home/myapp/apps/myapp/releases/20121130183323/vendor/gems/delayed_job-1.8.4/lib/delayed/worker.rb:24
:in `start'/home/myapp/apps/myapp/releases/20121130183323/vendor/gems/delayed_job-1.8.4/lib/delayed/command.rb:68
:in `run'/home/myapp/apps/myapp/releases/20121130183323/vendor/gems/delayed_job-1.8.4/lib/delayed/command.rb:46
:in `daemonize'/usr/lib64/ruby/gems/1.8/gems/daemons-1.1.4/lib/daemons/application.rb:249
:in `call'/usr/lib64/ruby/gems/1.8/gems/daemons-1.1.4/lib/daemons/application.rb:249
:in `start_proc'/usr/lib64/ruby/gems/1.8/gems/daemons-1.1.4/lib/daemons/daemonize.rb:197
:in `call'/usr/lib64/ruby/gems/1.8/gems/daemons-1.1.4/lib/daemons/daemonize.rb:197
:in `call_as_daemon'/usr/lib64/ruby/gems/1.8/gems/daemons-1.1.4/lib/daemons/application.rb:253
:in `start_proc'/usr/lib64/ruby/gems/1.8/gems/daemons-1.1.4/lib/daemons/application.rb:293
:in `start'/usr/lib64/ruby/gems/1.8/gems/daemons-1.1.4/lib/daemons/controller.rb:70
:in `run'/usr/lib64/ruby/gems/1.8/gems/daemons-1.1.4/lib/daemons.rb:195
:in `run_proc'/usr/lib64/ruby/gems/1.8/gems/daemons-1.1.4/lib/daemons/cmdline.rb:109
:in `call'/usr/lib64/ruby/gems/1.8/gems/daemons-1.1.4/lib/daemons/cmdline.rb:109
:in `catch_exceptions'/usr/lib64/ruby/gems/1.8/gems/daemons-1.1.4/lib/daemons.rb:194
:in `run_proc'/home/myapp/apps/myapp/releases/20121130183323/vendor/gems/delayed_job-1.8.4/lib/delayed/command.rb:45
:in `daemonize'/home/myapp/apps/myapp/releases/20121130183323/vendor/gems/delayed_job-1.8.4/lib/delayed/command.rb:43
:in `times'/home/myapp/apps/myapp/releases/20121130183323/vendor/gems/delayed_job-1.8.4/lib/delayed/command.rb:43
:in `daemonize'script/delayed_job:5

这段代码太长了,无法在这个论坛中包含。

所以我的问题很清楚:

1.) 经过研究,我怀疑我没有足够的堆栈空间。我发现我可以使用ulimit来增加它,但我不知道如何将这个ulimit应用到延迟作业中,我在我的shell(.bashrc)中提高了ulimit,但似乎没有帮助。有人能确认我是否已经用尽了堆栈空间,并且如何解决吗?(这是我得到这个想法的地方:http://dalibornasevic.com/posts/5-ruby-stack-level-too-deep-systemstackerror

2.) 如果不是ulimit,那么可能是什么,我该如何调试这个问题......我在这个堆栈中没有看到任何递归或循环。


那行代码在控制台中运行良好是什么? - Confusion
你要求我们从堆栈跟踪中重建您的程序,但是如果没有提供您正在使用的代码摘要,我们无法提供太多帮助。 - the Tin Man
我认为这是一个非常合理清晰的问题,没有必要在此展示代码。你们关闭这个问题是不公平的,我看到很多类似的问题都没有答案,这是一个关于Ruby栈系统如何与ulimit一起工作的非常有效的问题。 - Joelio
好的,我终于成功让SA提高了我的堆栈限制,这就是问题所在。他在limts.conf中添加了以下内容:* hard stack 65536 * soft stack 65536,问题已经解决了。 - Joelio
1个回答

0

如果你有某种无限循环的问题,增加堆栈空间是无法解决你的问题的。

上周我遇到了一个类似的堆栈层级过深的问题,与delayed_job有关。结果证明这是一种已知的问题,而且在我的情况下与psych gem(用于YAML序列化)有关。当delayed job排队一个作业时,它将给定的对象序列化为YAML并将其存储在数据库中,而我在那个点上得到了一个堆栈溢出。

你的问题可能有完全不同的潜在原因(从堆栈跟踪中无法判断),但检查一下https://github.com/collectiveidea/delayed_job/issues/349可能会有所帮助。

对我来说,解决方案在评论中:https://github.com/collectiveidea/delayed_job/issues/349#issuecomment-5391754(即将encode_with方法添加到正在序列化的对象的类中)。


谢谢Steve,这就是为什么我包含了堆栈的原因,我不认为我有一个无限循环,所以这是我在没有循环的情况下看到这个错误的第一次。希望能学到更多关于ulimit和ruby堆栈的知识... - Joelio

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接