Tell me more ×
Server Fault is a question and answer site for professional system and network administrators. It's 100% free, no registration required.

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

http://imgur.com/x8Lq9.png

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
share|improve this question
Your server health looks fine. Are you experiencing any performance problems you are trying to solve? – Mircea Vutcovici Sep 19 '11 at 12:27
Yes, 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. – lisa Sep 19 '11 at 12:51

3 Answers

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.

share|improve this answer

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.

share|improve this answer

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.

share|improve this answer
I tried suPHP but it stopped some sites from working and gave lots of directory permission errors. The websites are running wordpress and 2GB for a apache process is huge! That is why I am worried. How do I know which modules are not needed? – lisa Sep 19 '11 at 12:53
The modules that aren't needed are the ones you aren't using... knowing which modules you aren't using is part of administering the server. – womble Sep 19 '11 at 12:58
I rebuilt apache and now have 2.2.20, removed mod_perl and set MaxRequestsPerChild to 1000. Now the memory usage is around 500mb VIRT and 150 RES. Thank you – lisa Sep 19 '11 at 13:31

Your Answer

 
discard

By posting your answer, you agree to the privacy policy and terms of service.

Not the answer you're looking for? Browse other questions tagged or ask your own question.