Ruby on rails Rails应用程序Sidekiq内存使用率高
我在Digital Ocean上部署了一个Rails 4应用程序,使用Ubuntu 14.04.5 LTS。该应用程序似乎运行良好,但系统始终以95%的内存运行。我甚至将液滴升级到RAM的两倍,仍然是95% 以下是我的主要输出:Ruby on rails Rails应用程序Sidekiq内存使用率高,ruby-on-rails,ruby,memory-management,sidekiq,Ruby On Rails,Ruby,Memory Management,Sidekiq,我在Digital Ocean上部署了一个Rails 4应用程序,使用Ubuntu 14.04.5 LTS。该应用程序似乎运行良好,但系统始终以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
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
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)
我知道有很多关于Rail应用程序内存优化的博客帖子等。这3个捆绑过程让我感到困惑。我的应用程序(实际上是两个应用程序-一个生产和一个登台)使用Redis/Sidekiq,这是捆绑流程。因此,我的问题是:
1) 这是‘正常’吗
2) 如果没有,是否有办法开始对此进行故障排除
更新
以下是最重要的输出:
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
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%。更好,但似乎仍然很高。我认为下一步将是大量的代码优化等。我相信我可以在这里找到很多东西。Ruby进程可能会占用太多内存的原因有很多。任何gem或应用程序代码都可以分配任意数量的内存,所以一般来说,so不可能告诉您原因。这里有一个可能的原因:
密切关注您运行了多少Sidekiq进程、配置的并发性、轮询以及使用的队列数量。其中任何一个数量过多都会导致内存使用率过高。您可以在
sidekiq.yml
中调整这些值,并测试它们对环境的影响
有关更多信息:您可以发布
ps au--sort=-%mem的输出吗?这将显示完整的命令,并确认那些bundle
进程实际调用的内容。另外,您是否可以发布上一滴的top
输出?这将有助于比较两种输出。我猜您的意思是ps aux--sort=-%mem
这是最好的答案-我的代码会影响到这一点,但并发性是目前为止最大的一个。谢谢你。。。嗯。它立刻下降到80%,但现在慢慢地又恢复到95%,谢谢迈克-我知道我有很多清理/重构等工作要做,我相信这会有所帮助。