Apache也是一个内存老虎, 在我的Ubuntu上,每个进程占用60M左右的内存.? 如果服务器内存比较小, 就需要对Apache的进程数作一些控制.? 比如说在一个400M内存的机器上,比较有价值的参数如下:
KeepAliveTimeout 1
StartServers 1 MinSpareServers 1 MaxSpareServers 5 MaxClients 20 MaxRequestsPerChild 20
这里面的原理有如下解释:
Reduce wasted processes by tweaking KeepAlive This is a tradeoff. KeepAliveTimeout is the amount of time a process sits around doing nothing but taking up space. Those seconds add up in a HUGE way. But using KeepAlive can increase speed for both you and the client - disable KeepAlive and the serving of static files like images can be a lot slower. I think it's best to have KeepAlive on, and KeepAliveTimeout very low (like 1-2 seconds).
Limit total processes with MaxClients If you use Apache to serve dynamic content, your simultaneous connections are severely limited. Exceed a certain number, and your system begins cannibalistic swapping, getting slower and slower until it dies. IMHO, a web server should automatically take steps to prevent this, but instead they seem to assume you have unlimited resources. Use trial & error to figure out how many Apache processes your server can handle, and set this value in MaxClients. Note: the Apache docs on this are misleading - if this limit is reached, clients are not "locked out", they are simply queued, and their access slows. Based on the value of MaxClients, you can estimate the values you need for StartServers, MinSpareServers, & MaxSpareServers. ? Force processes to reset with MaxRequestsPerChild Forcing your processes to die after a while makes them start over with low RAM usage, and this can reduce total memory usage in many situations. The less dynamic content you have, the more useful this will be. This is a game of catch-up, with your dynamic files constantly increasing total RAM usage, and restarting processes constantly reducing it. Experiment with MaxRequestsPerChild - even values as low as 20 may work well. But don't set it too low, because creating new processes does have overhead. You can figure out the best settings under load by examining "ps axu --sort:rss". A word of warning, using this is a bit like using heroin. The results can be impressive, but are NOT consistent - if the only way you can keep your server running is by tweaking this, you will eventually run into trouble. That being said, by tweaking MaxRequestsPerChild you may be able to increase MaxClients as much as 50%.
这里可以使用一个帮助计算MaxClients的脚本:
#!/bin/bash echo "This is intended as a guideline only!" if [ -e /etc/debian_version ]; then ??? APACHE="apache2" elif [ -e /etc/redhat-release ]; then ??? APACHE="httpd" fi RSS=`ps -aylC $APACHE |grep "$APACHE" |awk '{print $8'} |sort -n |tail -n 1` RSS=`expr $RSS / 1024` echo "Stopping $APACHE to calculate free memory" /etc/init.d/$APACHE stop > /dev/null ?MEM=`free -m |head -n 2 |tail -n 1 |awk '{free=($4); print free}'` echo "Starting $APACHE again" /etc/init.d/$APACHE start > /dev/null echo "MaxClients should be around" `expr $MEM / $RSS`
本文由创作,欢迎转载并保留对本博的链接。