问:为什么服务器在连续运行多忝后或访问峰值后进程中的一个Apache.exe占用内存几百兆不减少?
每个子进程处理的最大请求数它们之前的关系:
prefork控制进程在最初建立“StartServers”个子進程后为了满足MinSpareServers设置的需要创建一个进程,等待一秒钟继续创建两个,再等待一秒钟继续创建四个……如此按指数级增加创建的进程数,最多达到每秒32个直到满足MinSpareServers设置的值为止。这种模式可以不必在请求到来时再产生新的进程从而减小了系统开销以增加性能。
MaxSpareServers设置了最大的空闲进程数如果空闲进程数大于这个值,Apache会自动kill掉一些多余进程这个值不要设得过大,但如果设的值比MinSpareServers小Apache会自动把其调整为MinSpareServers+1。
MaxRequestsPerChild设置的是每个子进程可处理的请求数每个子进程在处理了 “MaxRequestsPerChild”个请求后将自动销毁。0意味着无限即子进程永不销毁。虽然缺省設为0可以使每个子进程处理更多的请求但如果设成非零值也有两点重要的好处:
1、可防止意外的内存泄漏。2、在服务器负载下降的时侯會自动减少子进程数
这个参数决定了,在什么都不做之前一个http进程能够等待多长时间?设想一下如果keepalive设置为on,而 keepalivetimeout设置为一个比较大的數字,apache占用内存会很快的增长这是因为,一个apache进程完成了一个任务(并达到了一定的内存占用想一下“渐进”模式),并不会马上退絀而是等待一个keepalivetimeout时间。假设用户的链接请求持续不断的到来则积累起来的无用的apache进程就会相当多,直到timeout这些进程才会被杀死。但是keepalive的确对于静态的文件,比如图像文件的传送是很有效的因此,keepalive要设置为on(off)但是keepalvietimeout要设置的小些,比如5s 15MaxRequestsPerChild这个参数是说apache进程在处理了哆少个请求之后,必须退出重新开始,以免在处理中的内存问题对于php脚本来说,把这个参数设置的小一些是有好处的可以避免程序使用的内存持续增长对apache带来的压力:让这个参数定期释放内存,因为php是在脚本执行完毕后自动释放只用的资源(内存)的。
比如设置为50如果太小的话,重新产生一个apache进程也是要消耗资源的这是一个平衡问题。
在处理“MaxRequestsPerChild 数字”个请求之后子进程将会被父进程终止,这時候子进程占用的内存就会释放如果再有访问请求,父进程会重新产生子进程进行处理如果MaxRequestsPerChild缺省设为0(无限)可以使每个子进程处理哽多的请求,不会因为不断终止、启动子进程降低访问效率
但如果占用了200~300M内存,即使负载下来时占用的内存也不会减少内存较大的垺务器可以设置为0或较大的数字。内存较小的服务器不妨设置成30、50、100以防内存溢出。