漂泊的云,停留的心!
人的头脑太复杂,时间过得久……

解决Apache 2.2.x在Windows 2003上的内存泄露问题

之前,头一次在Windows Server安装这样的环境,系统运行不久后,就经常发生httpd.exe 的Memory Leak. 在网上找了很久,这个问题终于解决了,httpd.conf配置如下:

<IfModule mpm_winnt.c> 
Win32DisableAcceptEx
ThreadsPerChild 100
MaxRequestsPerChild 1000
MaxMemFree 16
ThreadLimit 100
ThreadStackSize 8192
KeepAliveTimeout 2
MaxKeepAliveRequests 10
</IfModule>

如此设置成功后,不要使用“restart”, 因为使用restart的话,Apache只会停掉child thread, 再将老的parent thread复制后,生成一个新的child thread. 也就是说:你的threads设置没有生效。解决的办法是:Stop Sevice(别太心疼停服务),然后再Start Service。这样,parent tread就是一个新的进程号了,如果你不相信,可以在stop前、后,使用如下命令测试:

tasklist /FI "imagename eq httpd.exe"

当设置生效后,你就会从error.log中看到如下内容:
[Thu May 19 22:47:13 2012] [notice] Apache/2.2.4 (Win32) configured — resuming normal operations
[Thu May 19 22:47:13 2012] [notice] Server built: Jan 9 2007 23:17:20
[Thu May 19 22:47:13 2012] [notice] Parent: Created child process 3752
[Thu May 19 22:47:13 2012] [notice] Disabled use of AcceptEx() WinSock2 API
[Thu May 19 22:47:13 2012] [notice] Child 3752: Child process is running
[Thu May 19 22:47:13 2012] [notice] Child 3752: Acquired the start mutex.
[Thu May 19 22:47:13 2012] [notice] Child 3752: Starting 100 worker threads.
[Thu May 19 22:47:13 2012] [notice] Child 3752: Listening on port 80.
[Thu May 19 22:48:00 2012] [error] [client 222.178.216.188] Invalid URI in request Connection: Keep-Alive
[Thu May 19 22:49:54 2012] [notice] Child 3752: Process exiting because it reached MaxRequestsPerChild. Signaling the parent to restart a new child process.
[Thu May 19 22:49:54 2012] [notice] Parent: Received restart signal — Restarting the server.
[Thu May 19 22:49:54 2012] [notice] Apache/2.2.4 (Win32) configured — resuming normal operations
[Thu May 19 22:49:54 2012] [notice] Server built: Jan 9 2007 23:17:20
[Thu May 19 22:49:54 2012] [notice] Parent: Created child process 1756
[Thu May 19 22:49:54 2012] [notice] Disabled use of AcceptEx() WinSock2 API
[Thu May 19 22:49:54 2012] [notice] Child 1756: Child process is running
[Thu May 19 22:49:55 2012] [notice] Child 3752: Released the start mutex
[Thu May 19 22:49:55 2012] [notice] Child 1756: Acquired the start mutex.
[Thu May 19 22:49:55 2012] [notice] Child 1756: Starting 100 worker threads.
[Thu May 19 22:49:55 2012] [notice] Child 3752: Waiting for 100 worker threads to exit.
[Thu May 19 22:49:55 2012] [notice] Child 1756: Listening on port 80.
[Thu May 19 22:50:03 2012] [notice] Child 3752: All worker threads have exited.
[Thu May 19 22:50:03 2012] [notice] Child 3752: Child process is exiting
注意:
当达到MaxRequestsPerChild时,apache的parent thread会启动一个新的child thread,这时你的系统中会停有3个httpd.exe进程,直到上一个进程的所有child thread都结速后,进程才会退出。
另外,上面的error log级别是:LogLevel warn

赞(0)
版权声明:本文采用知识共享 署名4.0国际许可协议 [BY-NC-SA] 进行授权
文章名称:《解决Apache 2.2.x在Windows 2003上的内存泄露问题》
文章链接:https://piaoyun.cc/159.html
本站资源仅供个人学习交流,请于下载后24小时内删除,不允许用于商业用途云路窝农家乐,否则法律问题自行承担。