Rails app + Apache Passenger + Postgres:CPU消耗

时间:2013-04-04 11:59:33

标签: ruby-on-rails apache passenger cpu rails-postgresql

我的Rails 3.0应用程序存在CPU消耗问题。

该应用程序在Debian机器上的Apache + passenger mod上以生产模式运行。它是一台具有6 Gb RAM和2 CPU(1核3GHz)的虚拟机。它是一个邮件应用程序,只需单击链接即可阅读邮件,需要在服务器上进行一系列操作才能呈现页面。这个简单的点击在2或3秒内需要大约50%的CPU(我用“top”命令看到它)。

问题是我在系统上有大约150个用户,并且Postgresql数据库安装在同一台机器上。当多个用户同时进行操作时,CPU被100%使用,Postgresql有足够的资源来接受请求。

我是否可以制作任何配置(Apache?Passenger?Rails?)以防止CPU增加和Postgresql崩溃?我可以在两个CPU上分配作业(我不知道是否已经是这种情况)?

提前谢谢。

雷米

编辑:

似乎ruby进程为作业分配内存。但是当作业完成时,分配的内存似乎没有被释放。

3 个答案:

答案 0 :(得分:0)

postgreSQL实际上是崩溃吗?那会很奇怪;我希望它很慢,但不要崩溃。你可能还有其他问题...

你应该能够增加postgresql守护进程的优先级,或者减少Unix / Linux中的rails app :)之一,不错(以root用户身份)应该让你增加postgresql服务器的优先级(以便它得到它需要的CPU,而不是rails应用程序)。

答案 1 :(得分:0)

我忘了提到使用的内存也随着CPU的增加而增加。

在我的Rails日志中,我的错误如下:

ActiveRecord :: StatementInvalid(PG ::错误:致命:arrêtdesconnexionssuiteàlademande de l'administrationistrateur FATAL:arrêtdesconnexionssuiteàlademande de l'administrationistrateur

SignalException(SIGTERM)

所以请求(select,insert,...)被Postgresql拒绝。 问题期间Postgresql的日志是空的(我想因为如果没有资源可以写Postgresql就无法写入日志)。

答案 2 :(得分:0)

根据您的说法,您最好的选择可能是使用连接池,并尽可能多地删除同时连接的数量。这将导致更少的PostgreSQL内存,但更重要的是,它将导致更好的吞吐量,因为更少的信号量和磁盘I / O等待。毕竟,只有您的处理器和硬盘驱动器可以同时执行。一个好的起点是CPU内核的两倍加上你的磁盘轴数

在Ruby方面,这听起来像垃圾收集问题。很难说没有更多的信息,但我会首先删除你的同时PostgreSQL连接的数量,因为这是一个网络应用程序,所以连接不可能长时间闲置。