Rails app + Apache Passenger + Postgres : memory consumption

Hi all,

I've a Rails 3.0 application that have a problem with the memory consumption.

The application works in production mode on Apache + passenger mod on a Debian machine. It's a virtual machine with 6 Gb RAM and 2 CPU (1 core 3GHz). It's a mailing application and a simple click on a link to read a mail requires a series of operations on the server to render the page. This simple click needs about 50% of CPU during 2 or 3 seconds (I see it with "top" command). It seems that ruby processes allocate memory for jobs. But when the job is finished, the allocated memory seems to not be freed (unlike the CPU usage).

The problem is that I've about 150 users on the system and the Postgresql database is installed on the same machine. When several users make operations at same time, memory usage increases until 100% and Postgres can't accept request any more (then Postgres stops to log).

Is there any configuration that I can make (Apache? Passenger? Rails?) to prevent memory usage increasing (Why it isn't decreasing with the CPU?) and Postgresql crash?

Thank you in advance.

Rémi

Is there any configuration that I can make (Apache? Passenger? Rails?)

to prevent memory usage increasing (Why it isn’t decreasing with the

CPU?) and Postgresql crash?

What version of ruby are you using? If possible, you may want to consider using http://www.rubyenterpriseedition.com.

There are Passenger configuration variables you can use to adjust how long processes stay alive to continue serving requests, how many requests they serve, the max number of processes, etc.

http://www.modrails.com/documentation/Users%20guide%20Apache.html#_resource_control_and_optimization_options

Also, you can check the status and memory usage of your Passenger/Rails processes using the commands documented here:

http://www.modrails.com/documentation/Users%20guide%20Apache.html#_analysis_and_system_maintenance

Jim

Thank you for your answer.

What version of ruby are you using? If possible, you may want to consider using http://www.rubyenterpriseedition.com.

I use Ruby 1.8.7 . I will inquire about Ruby Enterprise Edition.

There are Passenger configuration variables you can use to adjust how long processes stay alive to continue serving requests, how many requests they serve, the max number of processes, etc.

http://www.modrails.com/documentation/Users%20guide%20Apache.html#_resource_control_and_optimization_options

This is my actual Passenger config :

<IfModule mpm_worker_module>     StartServers 4     MinSpareThreads 25     MaxSpareThreads 100     ThreadLimit 64     ThreadsPerChild 25     MaxClients 300     MaxRequestsPerChild 900 </IfModule>