您的位置:首页 > 运维架构 > Apache

如何优化Apache,减少内存使用

2012-10-24 09:43 399 查看
1. SSH into your server as root.

2. Run top.

3. Press shift + m.

4. Note the highest RES memory used by httpd.

5. Hit Q to exit top.

6. Execute: service httpd stop

7. Once httpd is stopped, execute: free -m

8. Note the memory listed under “used”.

9. Find the guaranteed memory for your VPS plan. Support can tell you how much you have guaranteed if you cannot find it.

10. Subtract the memory USED from the memory that your plan is GUARANTEED. This will give you your base FREE MEMORY POOL.

11. Multiply the value of your FREE MEMORY POOL by 0.8 to find your average AVAILABLEAPACHE POOL
(this will allow you a 20% memory reserve for burst periods).

12. Divide your AVAILABLE APACHE POOL by the highest RES memory used by httpd. This will give you the MaxClients value that should be set for your system.

13. Open httpd.conf in your favorite text editor (don’t use Windows text editors as they
may break httpd.conf).

14. Set the MaxClients value you’ve calculated.

15. Set Keepalive Off if you don’t need it (your server will handle more requests per second with keepalive on, but will require more memory for apache–don’t turn on keepalive if you’re not leaving a 20% memory reserve).

16. If you are leaving keepalive on, set keepalivetimeout to the lowest value you can to prevent connections from hanging. If you experience high latency to your server, set keepalivetimeout to 2-5 seconds.

17. Set your Timeout to a reasonable value. Pick a time that won’t cut off the transfer of your pages to your customers, but keep it low enough that you don’t have dead connections that remain open for a large period of time (10-30 seconds should be a good
timeout if most of your users are on highspeed, and 30-120 should be ok for dialup).

18. MaxKeepAliveRequests should be set equal to the largest number of objects you have in 1 page. If you don’t know, 70-200 should be good.

19. Set your MinSpareServers equal to 10-25% of MaxClients.

20. Set your MaxSpareServers equal to 25-50% of MaxClients.

21. Set your StartServers equal to either MinSpareServers or MaxSpareServers. When apache is restarted, this is the number of servers that will start and be ready for connections immediately. High-traffic sites should set this value to MaxSpareServers and lower
volume sites should use MinSpareServrs.

22. MaxRequestsPerChild should be set somewhere between 500 (if you see rapid apache child process memory use growth) to 10000 (if you have no leaks in your applications). Setting this value to 0 will result in child processes never being killed, and eventually
all shared memory used by apache will become “dirty” and unshared, possibly resulting in higher overall memory use.

23. Once you’ve set all values, save the file, exit, and issue: service httpd restart.
The following is an EXAMPLE with output:
Under TOP I notice that my biggest apache process is using 5mb of memory:

PID USER PR NI VIRT RES SHR S %CPU %MEM TIME+ COMMAND

15535 root 16 0 15072 5376 3196 S 0 0.5 0:17.60 httpd
-bash-3.00# service httpd stop

/etc/init.d/httpd stop: httpd stopped

-bash-3.00# free -m

total used free shared buffers cached

Mem: 1024 131 892 0 0 0

-/+ buffers/cache: 131 892

Swap: 0 0 0

-bash-3.00#
I see I’m using 131MB of RAM without apache. I have 384MB of RAM available.
384 – 131 = 253MB Free Memory Pool

253 * 0.8 = 202.4MB Available Apache Pool

200 / 5 = 40
Armed with this information I now set up my httpd.conf with the following settings:
Timeout 10 (If it takes more than 10 seconds to load my pages, something is wrong)
MaxClients 40 (Note: I can set this lower if I know other processes will need more memory under load)

MinSpareServers 4 (My site gets almost no traffic)
MaxSpareServers 20 (My server never uses memory, so extra apache children hanging around doesn’t hurt me)
StartServers 4 (again, low traffic, so I don’t need to be handling an instantaneous burst on apache restart)
Keepalive On (Since I don’t use much memory, I don’t need to turn this off as the extra use won’t hurt me)
MaxKeepAliveRequests 100 (I don’t have 100 objects on any page, but using too low a value doesn’t help performance, so I’ll just do 100)
KeepAliveTimeout 1 (I don’t have large files/pages, so I don’t expect the remote computer to take more than 1 second to reply to each keepalive request)
MaxRequestsPerChild 10000 (I like the better performance with this, and I run no PHP Apps that leak memory)
Once I’ve set these, I save the file, exit the editor, and restart apache. I’ve now reconfigured apache to meet my specific needs!
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: