1

On a quad-core server with 8GB of ram I have apache processes that use up to 2.3GB RES memory and 2.6GB VIRT memory. Here is a copy of the top -c command: Top command

Is there a way to reduct the memory usage for these apache processes?

These are my httpd.conf settings:

Timeout 160
TraceEnable Off
ServerSignature Off
ServerTokens ProductOnly
FileETag None
StartServers 6
<IfModule prefork.c>
MinSpareServers 4
MaxSpareServers 16
</IfModule>
ServerLimit 400
MaxClients 320
MaxRequestsPerChild 10000
KeepAlive On
KeepAliveTimeout 4
MaxKeepAliveRequests 80

Note: There seems to be some connection delay. Also if 16 connections are using 8GB or ram. I am a bit worried that if my server gets 300 connections, it will go offline. Also in Munin I can see the committed memory rise from a few GB tot 80GB within 2 weeks. With every apache restart it goes down to a few GB again

Frederik
  • 3,423
lisa
  • 11

3 Answers3

1

The memory in Apache is used by modules and by memory used by modules. Disable unused modules and to see which remaining one you have to tune use pmap <PID> to see how the memory was allocated. Use dmalloc and valgrind to debug the remaining memory allocation problems.

0

This is unusually high memory usage. There might be a memory leak.

For now, try updating your Apache2 installation (including modules) and reduce the number of MaxRequestsPerChild, i.e. to 500. The latter setting essentially reduces the maximum lifetime of Apache2 sub-processes in terms of "requests processed". That is, if there are memory leaks, they will not build up as dramatically.

robert
  • 143
0

Removing unnecessary modules is the basic solution to the problem, but you've got to be running an insane bunch of modules to get an Apache process that takes 2GB of RAM. It's far more likely that you've got dynamic code modules (such as mod_php) that's running nasty, leaky code, or else a module that's poorly coded and leaking memory itself.

You can drop MaxRequestsPerChild to something quite small, or you can do the job properly and find the memory leaks. A middle ground is to at least push the dynamic code execution out to a separate process (using suPHP, suexec, php-fpm, etc), which is a good idea anyway for security purposes.

womble
  • 98,245