`

真正解决win2003下apache的httpd.exe占用内存的问题

阅读更多

昨 天又有新的情况发生。10分钟报一次内存满,无法打开论坛,远程连接到服务器一看,吓我一大跳,httpd.exe进程占用700多M内存。重启一下 apache服务,发现httpd.exe从20M开始往上涨,从不释放内存,不断增加,增加到700多M后论坛打不开,内存满了。

  又是一个严重问题,经过整整3个小时的google搜索,终于从google的海洋中找到了问题的所在。

  这几天遇到了一个很多人都遇到过的问题,这个问题在google上有太多的人都遇到,但很少有指出最终的解决方案,大部分是解决了AcceptEx failed,但引起了内存的疯狂增加(“memory leak”)。这几天遇到这个问题后也费了不少功夫,但没有从网上找到最根本的解决办法,幸运的是,最终探索出了一个解决方案,在这里写出来,希望能帮助 后来遇到问题的难友们尽早解决问题。

  遇到的问题比较曲折,大体经过是:

  某天,不能访问apache的页面,检查得知,apache在疯狂写日志,而且大部分是一句话:“winnt_accept: Asynchronous AcceptEx failed”,最多的时候写到了200M以上。经各方探索,最终在apache的手册上找到了一个解决方法:

  在http.conf配置中设置Win32DisableAcceptEx参数。这样做的原因是,apache在某些Windows版本上可能兼容性 不足,在调用AcceptEx接收请求时可能有问题,使用上面的参数禁用后,apache会使用另一套方案替代(BSD),这种方案效率稍微低些。详见:

  http://httpd.apache.org/do...

  当时修改完该设置后,重启apache,测试了一段时间,感觉原来的问题确实消除了,不过当时感觉内存占用量非常明显,但测试一段时间没有问题就放过去了,直到今天下午:

  今天下午发现又不能访问页面了,然后检查apache发现它已经crash了。然后打开日志发现最后一句:“Out of memory!”--内存不足了。

  然后对内存进行测试,发现一直按住F5键不停,apache的内存就不停上涨,似乎有一直吃光内存的意思,停止刷新后只能下降到500M左右了(刚启 动时是20M)。如果不使用Win32DisableAcceptEx参数则明显没有这个问题,停止刷新后能回落到20M。看来是这个参数的原因。

  于是从google上寻找答案,但可惜的是没有太多有价值的东西。只能看到apache的官方网站已经把这个问题列为了一个bug,甚至有些人又退回 到不使用那个参数(忍受AcceptEx failed的风险?)。最后看到了一个说法,将ThreadsPerChild 设为170以下就可以,可为什么是170以下呢?作者没有很多描述。于是自己探索如下,使用一个简单的页面,不停的按住F5刷新:

  如果将Threadsperchild 设为50,无论怎么刷新内存最多到150M左右,但不会再长了。停止刷新后,会降到55M左右;如果将ThreadsPerChild 设为100, 内存峰值:282M,能降到92M左右;如果将ThreadsPerChild设为550,内存峰值2G,停止后到500M左右……。

  按照上述规律,基本上找到了问题的原因,因为我的配置中原来使用的是ThreadsPerChild 550,这样也就是内存很可能会长到2G以上(复杂页面比简单页面耗用量大),而机器的内存设置不能支持这么大,因此应该就是这个问题了。

  所以最终的解决方法就是保留Win32DisableAcceptEx的同时修改了ThreadsPerChild 150。解决完成后我推测内存疯狂增长的原因:

  首先,ThreadsPerChild的意思是系统启动时默认启动的等待线程数,用来等待处理客户的请求。在使用AcceptEx时内存增长不明显并 且可以降回20M左右,可能是因为用户来了请求线程分配了一些资源,此时内存增长,但用户访问完成后,这些资源都释放了(这些资源很可能都和用户相关,没 法留着下个用户使用,所以都释放了)。但禁用了AcceptEx后,由于apache每个线程需要处理网络事件,因此每个线程的资源需要就多了,并且处理 完一个用户的请求后,有些资源不想释放,是可以对下个用户重用的,这样就留在了里面。由于我的线程数设了550(估计网上很多人遇到这个类似于 “memory leak”问题的可能也都设的比较大或者机器虚拟内存较小),这样当线程较多时就会出现达到最大内存的情况,而且这种现象给人的感觉就是有内存泄漏,因为 初始时是20M,来一个请求后线程分配一些资源(暂时不释放的),这样可能就变成了21M,如果同时有10个人访问,可能等他们访问完后就变成了50M, 感觉是有内存泄漏。

  这样也就解释了为什么有人说设到170以下就不再出现内存不足了,可能因为他的机器这个配置比较合适。不过知道了上述的规律和一些推测,这个结论应该是根据自己机器的情况合理调配。

  原来是disable了AcceptEx后引起的问题,但是又不能打开AcceptEx,只能按照文章中所述将ThreadsPerChild修改为150,问题解决。

  同时希望apache官方能尽快修正这一严重BUG。

分享到:
评论
1 楼 fictioner 2010-09-09  
感谢,借助此文和另一篇文章联合解决了问题。

我目前用的参数是:
ThreadsPerChild 170
MaxRequestsPerChild 5000
Win32DisableAcceptEx

服务器配置是
Xeon 5430
8G内存
使用虚拟机分配4个核心和2G内存,目前占用内存250M以下,虚拟内存260M左右。

另一篇文章地址:http://www.cnblogs.com/aoogur/archive/2008/11/11/1331104.html

相关推荐

    apachehttpd.exe

    The Apache HTTP Server ("httpd") was launched in 1995 and it has been the most popular web server on the Internet since April 1996. It has celebrated its 25th birthday as a project in February 2020

    apache httpd.conf中文 apache优化

    apache httpd.conf中文 apache优化

    php5apache2.dll-php5.1.x.rar

    2.将 httpd.exe.manifest 文件复制到你的apache安装目录下的bin文件夹下. 3.双击运行vcredist_x86.exe安装.(如果您的系统里已安装了 .NET framework 2.就可以省掉这一步) 完成!重启你的apache2.2。

    Apache的httpd.conf文件配置

    ### Apache的httpd.conf文件配置详解 #### 一、引言 `httpd.conf`是Apache Web服务器的核心配置文件,它决定了服务器的行为、性能及功能。对于系统管理员来说,掌握如何正确配置`httpd.conf`至关重要。本文将详细...

    Linux下安装Apache httpd.doc

    - **MPM模式默认程序**:`/usr/sbin/httpd.event`, `/usr/sbin/httpd.worker` - **帮助文件**:通过`rpm -qd httpd`查看 - **日志文件目录**:`/var/log/httpd` - `access_log`:访问日志 - `error_log`:错误日志...

    mod_python-3.3.1.win32-py2.5-Apache2.2.exe

    1. 安装:双击该.exe文件,按照向导进行安装,过程中选择合适的Apache目录和Python安装路径,安装程序会自动将mod_python模块添加到Apache的配置文件httpd.conf中。 2. 配置:在httpd.conf中,确保以下行已启用: ...

    Apache的httpd.conf文件常用指令解释

    了解并熟练掌握httpd.conf文件中的常用指令对于管理和优化Apache服务器至关重要。以下是一些主要的指令及其解释: 1. **ServerRoot**: 这个指令指定Apache服务器的根目录,即包含所有配置文件、模块和日志文件的...

    httpd.exe.manifest

    这个是用来解决APACHE 滚动日志的,原文地址在这里。http://hi.baidu.com/7xwang/modify/blog/3c3543ac1ff649d17cd92a34

    Apache 的 httpd.conf 详解

    ### Apache的httpd.conf配置详解 #### 一、概述 `httpd.conf` 是Apache Web服务器的核心配置文件,它控制着服务器的行为与功能。通过合理地配置这些参数,可以极大地提高服务器的安全性、性能和可扩展性。下面将对...

    Apache2 httpd.conf 中文版

    - **文档获取**:对于详细的指令说明,可以参考官方文档:[http://httpd.apache.org/docs-2.0/](http://httpd.apache.org/docs-2.0/)。 ### 配置文件结构 配置文件大致可以分为三大部分: 1. **全局环境参数**:...

    apache httpd2.4.46源码包

    安装完成后,你可以通过修改`/usr/local/apache2/conf/httpd.conf`配置文件来调整Apache的行为,例如设置监听端口、虚拟主机、日志文件位置等。然后,启动Apache服务,通常命令为`/usr/local/apache2/bin/apachectl ...

    apache-httpd-2.4.58-win64-VS17.zip

    - **配置文件httpd.conf**:这是Apache服务器的主要配置文件,包含了服务器的运行参数、虚拟主机设置、访问控制规则等内容。 - **MPM(多进程模块)**:Apache 2.4支持多种MPM,如`prefork`、`worker`和`event`,...

    apache的httpd.conf文件配置详解

    这个文件位于Apache软件安装的根目录下,通常命名为httpd.conf或apache2.conf,根据不同的操作系统和安装方法可能会有所不同。配置文件的修改直接影响到服务器的运行方式和性能。 1. **基本配置** - `ServerRoot`...

    apache2配置文件httpd.conf

    apache2配置文件httpd.conf

    Apache httpd-2.4.17-x64.zip

    "Apache24"文件夹则可能包含了Apache服务器的核心组件和相关文件,如二进制可执行文件(httpd.exe)、配置文件(httpd.conf)、模块(.so文件)以及日志文件等。其中,`httpd.exe`是Apache服务器的主要进程,负责...

    Apache2_httpd.conf配置文件中文版详解2

    Apache2 httpd.conf配置文件中文版详解 # 基于 NCSA 服务的配置文件。

    apache目前最新版本(apache2.4.43)

    它的最新版本为Apache 2.4.43,这个版本的发布旨在解决之前版本中的一些已知问题,提高性能,增强安全性,并引入了一些新的功能和改进。在这个版本中,用户可能会关注以下几个关键点: 1. 安全性更新:Apache 2.4....

    httpd.ini文件下载

    windows主机服务器的网站以搭建在虚拟主机上,当我们用习惯了apache下的.htaccess的时候,很难想象windows主机上怎么实现它的强大功能。实际上windows主机服务器上的虚拟主机可以用httpd.ini文件来充当.htaccess文件...

    httpd.tar.gz

    【标题】"httpd.tar.gz" 是一个包含Apache HTTP服务器源代码或二进制文件的压缩包。HTTP服务器是互联网上用于处理客户端HTTP请求的应用程序,它允许用户通过Web浏览器访问网页和其他在线资源。 【标签】"httpd.tar....

Global site tag (gtag.js) - Google Analytics