【问题标题】:How to improve Nginx, Rails, Passenger memory usage?如何提高 Nginx、Rails、Passenger 内存使用率?
【发布时间】:2014-09-23 09:24:39
【问题描述】:

我目前通过 Cloud 66 在 Digital Ocean VPS(1GB RAM)上设置了一个 rails 应用程序。问题是 VPS 的内存已满载乘客进程。

passenger-status的输出:

# passenger-status
Version : 4.0.45
Date    : 2014-09-23 09:04:37 +0000
Instance: 1762
----------- General information -----------
Max pool size : 2
Processes     : 2
Requests in top-level queue : 0

----------- Application groups -----------
/var/deploy/cityspotters/web_head/current#default:
  App root: /var/deploy/cityspotters/web_head/current
  Requests in queue: 0
  * PID: 7675    Sessions: 0       Processed: 599     Uptime: 39m 35s
    CPU: 1%      Memory  : 151M    Last used: 1m 10s ago
  * PID: 7686    Sessions: 0       Processed: 477     Uptime: 39m 34s
    CPU: 1%      Memory  : 115M    Last used: 10s ago

max_pool_size 似乎配置正确。

passenger-memory-stats的输出:

# passenger-memory-stats
Version: 4.0.45
Date   : 2014-09-23 09:10:41 +0000
------------- Apache processes -------------
*** WARNING: The Apache executable cannot be found.
Please set the APXS2 environment variable to your 'apxs2' executable's filename, or set the HTTPD environment variable to your 'httpd' or 'apache2' executable's filename.


--------- Nginx processes ---------
PID   PPID  VMSize   Private  Name
-----------------------------------
1762  1     51.8 MB  0.4 MB   nginx: master process /opt/nginx/sbin/nginx
7616  1762  53.0 MB  1.8 MB   nginx: worker process
### Processes: 2
### Total private dirty RSS: 2.22 MB


----- Passenger processes -----
PID   VMSize    Private   Name
-------------------------------
7597  218.3 MB  0.3 MB    PassengerWatchdog
7600  565.7 MB  1.1 MB    PassengerHelperAgent
7606  230.8 MB  1.0 MB    PassengerLoggingAgent
7675  652.0 MB  151.7 MB  Passenger RackApp: /var/deploy/cityspotters/web_head/current
7686  652.1 MB  116.7 MB  Passenger RackApp: /var/deploy/cityspotters/web_head/current
### Processes: 5
### Total private dirty RSS: 270.82 MB

.. 2个Passenger RackApp进程,好的。

但是当我使用htop命令时,输出如下:

似乎有很多乘客 Rackup 流程。我们还在使用默认配置运行 Sidekiq。

New Relic Server 报告以下内存使用情况:

我尝试调整乘客设置,添加负载平衡器和另一台服务器,但老实说不知道从这里做什么。如何找出造成如此多内存使用的原因?

更新:由于一些更改,我不得不重新启动 ngnix,它似乎释放了相当多的内存。

【问题讨论】:

  • Nginx 的设计目的是在运行期间不会增加内存占用。如果重新启动它会释放内存,请调查原因。

标签: ruby-on-rails memory nginx passenger sidekiq


【解决方案1】:

按 Shift-H 隐藏 htop 中的线程。这些不是进程,而是进程中的线程。关键列是 RSS:您有两个 209MB 和 215MB 的乘客进程和一个 154MB 的 Sidekiq 进程。

简短回答:这对于 Rails 应用程序来说是完全正常的内存使用情况。如果您希望每个进程有多个进程,那么 1GB 就有点小了。我会将乘客减少到一个进程。

【讨论】:

  • 同意。我假设这是一台 64 位机器。也许您可以通过切换到 32 位来释放一些,但老实说,1G 是您为编写低质量代码而陷入困境的开发人员提供的。
  • 谢谢,“shift+h”是我需要看到的,它们实际上是线程。
【解决方案2】:

您的应用程序是否创建子进程?如果是这样,那么那些额外的“Passenger RackApp”进程很可能实际上不是由 Phusion Passenger 创建的进程,而实际上是由您自己的应用程序创建的进程。您应该仔细检查您的应用程序是否产生子进程以及您是否正确清理了这些子进程。还要仔细检查您使用的任何库是否也正确清理了它们的子进程。

我看到您正在使用 Sidekiq 并且您已经配置了 25 个 Sidekiq 进程。那些也吃了大量的内存。 Sidekiq 进程占用的内存与Passenger RackApp 进程一样多,因为它们都将您的整个应用程序(包括Rails)加载到内存中。尝试减少 Sidekiq 进程的数量。

【讨论】:

  • 感谢宏利。我完全删除了 Sidekiq,它对情况有所改善,但不是很大。仍然有相当多的Passenger RackApp 进程产生:cl.ly/Xgie。我没有有意识地产生子进程,乍一看,我们使用的任何宝石都没有。我会调查更多。
  • 删除 Sidekiq 被证明是好的。一旦我再次添加它,我将减少进程数量并监控是否是罪魁祸首。
  • 25 个线程,而不是进程。 Htop 将线程显示为单独的行。
  • @MikePerham 我认为 htop 默认隐藏线程。但这可能是特定于版本的。理查德,你能试着在 htop 中按“H”吗?如果默认情况下显示线程,可能会隐藏线程。
  • @Hongli 看来线程默认没有隐藏。隐藏:cl.ly/XhmW,未隐藏:cl.ly/XgvW。我的印象是非企业版没有使用线程。
猜你喜欢
  • 2011-03-31
  • 1970-01-01
  • 2017-09-14
  • 1970-01-01
  • 2013-10-31
  • 2015-01-25
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多