Rails app Sidekiq高内存使用率

时间:2017-04-18 15:11:42

标签: ruby-on-rails ruby memory-management sidekiq

我使用Ubuntu 14.04.5 LTS在Digital Ocean上部署了一个Rails 4应用程序。该应用程序似乎运行良好,但系统始终以95%的内存运行。我甚至将液滴升级到RAM的两倍,它仍然是95%。

这是我的最高输出:

top - 11:03:54 up  8:37,  1 user,  load average: 0.00, 0.03, 0.05
Tasks: 118 total,   1 running, 117 sleeping,   0 stopped,   0 zombie
%Cpu(s):  0.2 us,  0.2 sy,  0.0 ni, 99.7 id,  0.0 wa,  0.0 hi,  0.0 si,  0.0 st
KiB Mem:   2049956 total,  1980616 used,    69340 free,     8708 buffers
KiB Swap:  1048572 total,  1036928 used,    11644 free.    47864 cached Mem

  PID USER      PR  NI    VIRT    RES    SHR S  %CPU %MEM     TIME+ COMMAND                                                                                                                                                               
 7510 ubuntu    20   0  780436 274428   2540 S   0.0 13.4   0:27.66 ruby                                                                                                                                                                  
 1313 root      20   0 1921472 250948   2700 S   0.0 12.2   1:42.70 bundle                                                                                                                                                                
 1315 root      20   0 1876992 246204   2664 S   0.0 12.0   1:44.10 bundle                                                                                                                                                                
 1359 root      20   0 1928636 236168   2692 S   0.0 11.5   1:42.58 bundle                                                                                                                                                                
 6408 ubuntu    20   0  781764 175368   2244 S   0.3  8.6   1:10.81 ruby                                                                                                                                                                  
 8681 ubuntu    20   0  984140 156708   1884 S   0.3  7.6   1:37.95 ruby                                                                                                                                                                  
 8810 ubuntu    20   0  646824 117356   2548 S   0.0  5.7   0:11.07 ruby                                                                                                                                                                  
 8821 ubuntu    20   0  646920 112728   2532 S   0.0  5.5   0:11.48 ruby                                                                                                                                                                  
 8797 ubuntu    20   0  646728  82372   2960 S   0.0  4.0   0:14.33 ruby                                                                                                                                                                  
 1932 ubuntu    20   0  332292  56948   1552 S   0.0  2.8   0:04.88 ruby

我知道有很多关于Rail app内存优化的博客文章等。 3捆绑过程令我感到困惑。我的应用程序(实际上是2个应用程序 - 一个生产和一个分期)使用Redis / Sidekiq作为捆绑进程。所以我的问题是:

1)这是'正常'

2)如果没有办法开始排除故障?

更新

以下是最高输出:

ubuntu@rails-01:~$ ps aux --sort=-%mem
USER       PID %CPU %MEM    VSZ   RSS TTY      STAT START   TIME COMMAND
root      1291  8.8  9.4 846856 194624 ?       Sl   18:04   0:23 sidekiq 4.2.10 production [0 of 3 busy]                                                                                  
root      1411  8.9  9.4 846824 194532 ?       Sl   18:04   0:24 sidekiq 4.2.10 production [0 of 3 busy]                                                                                  
root      1272  9.1  9.4 712752 193516 ?       Sl   18:04   0:24 sidekiq 4.2.10 staging [0 of 1 busy]                                                                                  
ubuntu    2254  0.6  9.3 645792 192648 ?       Sl   18:05   0:01 Passenger RubyApp: /home/ubuntu/production/current/public (production)
ubuntu    1986  0.6  9.3 645048 192064 ?       Sl   18:05   0:01 Passenger RubyApp: /home/ubuntu/staging/current/public (staging)
ubuntu    1762  9.8  9.2 375520 190264 ?       Sl   18:04   0:24 Passenger AppPreloader: /home/ubuntu/production/current   
ubuntu    1678  9.5  9.2 374872 189588 ?       Sl   18:04   0:25 Passenger AppPreloader: /home/ubuntu/staging/current      
ubuntu    2082  0.2  9.1 645144 187524 ?       Sl   18:05   0:00 Passenger RubyApp: /home/ubuntu/staging/current/public (staging)
ubuntu    1839  2.9  3.9 197300 79976 ?        Sl   18:04   0:06 Passenger AppPreloader: /home/ubuntu/landing/current      
ubuntu    1962  0.1  3.8 332292 78720 ?        Sl   18:05   0:00 Passenger RubyApp: /home/ubuntu/landing/current/public (production)
ubuntu    1969  0.0  3.7 332388 76044 ?        Sl   18:05   0:00 Passenger RubyApp: /home/ubuntu/landing/current/public (production)

我忘记了服务器上有2个生产工人和1个分期。我有5和2的并发性,但我把它降低到3和1.所有Sidekiq正在做的是一些低级上传图像处理和批量记录创建,更新和删除我不希望用户坐等用于加载页面。

我现在看到它达到80%的水平。更好但仍然看起来很高。我认为下一步将是大量的代码优化等。我相信我有很多东西可以在这里找到。

2 个答案:

答案 0 :(得分:1)

密切关注您运行的Sidekiq进程数,配置的并发性,轮询以及您使用的队列数。其中任何一个都可能导致高内存使用率。您可以在sidekiq.yml中调整这些值并测试它们对环境的影响。

了解更多信息:https://github.com/mperham/sidekiq/wiki/Advanced-Options

答案 1 :(得分:0)

你的Ruby进程可能会占用太多内存的原因很多。任何宝石或应用程序代码都可以分配任何数量的内存,所以一般来说,SO不可能告诉你原因。这是一个可能的原因:

https://github.com/rails/rails/issues/27002#issuecomment-260086170