【问题标题】:Why are ruby processes at 100% CPU on passenger为什么乘客的 ruby​​ 进程使用 100% CPU
【发布时间】:2010-06-21 13:10:51
【问题描述】:

我有一个运行在具有 4 核 @2 GHz 和 4GB 内存的 VPS 上的 rails 应用程序 (2.3.5)。我在 Ruby Enterprise (1.8.7-2010.01) 上运行 nginx (0.7.61) 和 phusion Passenger(2.2.14),最大池大小设置为 30。我的问题是,似乎每个正在执行的 ruby​​ 进程rails 请求以接近 100% 的 cpu 运行。如果我运行 TOP,它们会在每次显示刷新时下降,因此它们不会挂起,但它们仍以 100% 运行。

有什么办法可以解决这个问题吗?或者至少弄清楚代码的哪一部分是 CPU 的峰值?这是正常现象吗?

这是 TOP 输出:

PID USER      PR  NI  VIRT  RES  SHR S %CPU %MEM    TIME+  COMMAND                                                                                                                                     
 2427 psadmin   25   0 91904  76m 2696 R  100  1.9 739:05.96 Rails: /var/www/apps/main_rails_app/current                                                                                                  
 3457 psadmin   25   0 98180  82m 2532 R  100  2.0 711:21.91 Rails: /var/www/apps/main_rails_app/current                                                                                                  
 2415 psadmin   25   0 93952  77m 2708 R   99  1.9 727:49.31 Rails: /var/www/apps/main_rails_app/current                                                                                                  
 3455 psadmin   25   0 99204  83m 2528 R   69  2.0 726:04.70 Rails: /var/www/apps/main_rails_app/current                                                                                                  
 2791 psadmin   16   0 98044  81m 2492 S   31  2.0   0:10.16 Rails: /var/www/apps/main_rails_app/current                                                                                                  
 8034 psadmin   15   0  8160 3656 1772 S    1  0.1   0:35.39 nginx: worker process                                                                                                                        
 8035 psadmin   15   0  8324 3696 1732 S    0  0.1   0:31.34 nginx: worker process                                                                                                                        
 2588 psadmin   15   0  197m 183m 2712 S    0  4.5   1:02.16 Rails: /var/www/apps/main_rails_app/current      

谢谢!

编辑:如下所述,尝试使用跟随叉的 strace。这是一遍又一遍地转储的输出:

sudo strace -f -p 3455

clock_gettime(CLOCK_MONOTONIC, {394577, 508326476}) = 0
select(0, [], [], [], {0, 0})           = 0 (Timeout)
--- SIGVTALRM (Virtual timer expired) @ 0 (0) ---
sigreturn()   

【问题讨论】:

  • 我在两个不同的服务器上遇到了同样的问题:Rails 2.3.5 乘客 2.2.5 ruby​​ 1.8.7 (2009-12-24 patchlevel 248) [x86_64-linux], MBARI 0x6770 , Ruby 企业版 2010.01
  • 我看到了类似的问题,并且我的代码中有一些错误会在循环中调用 DateTime.now,这解释了 strace 输出。 stat("/etc/localtime", {st_mode=S_IFREG|0644, st_size=3543, ...}) = 0 计划推送修复程序以停止重复调用,看看它是否有所作为。
  • Ruby 使用SIGVTALRM 在线程之间进行上下文切换。这没什么不正常的。当然,除非这是 strace 的唯一输出,而且它经常重复出现。

标签: ruby-on-rails ruby passenger


【解决方案1】:

检查您的日志中是否存在可疑行为。一般来说,rails 确实会占用大量 CPU……您也可以尝试将 strace 指向有问题的 pid。

【讨论】:

  • 我试过 strace 但它从来没有显示任何输出,只是它绑定到那个 PID。我认为这可能是因为 pid 存在的时间不长,但它存在时是 100%。
  • 确保您正在关注分叉(-f 或 -F 之类的)。或者尝试不同的 pid :)
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2011-12-25
  • 1970-01-01
  • 2019-01-31
  • 2010-10-12
  • 2012-12-23
  • 2018-08-21
  • 2023-03-06
相关资源
最近更新 更多