http://blog.chinaunix.net/u/4257/showart_1000959.html
这几天遇到了一个很多人都遇到过的问题,这个问题在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/docs/2.0/mod/mpm_winnt.html#win32disableacceptex
当时修改完该设置后,重启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以下就不再出现内存不足了,可能因为他的机器这个配置比较合适。不过知道了上
述的规律和一些推测,这个结论应该是根据自己机器的情况合理调配。
我很少接触apache等linux上的东西,所知较少,只是遇到了问题才开始了解的上述信息,可能有很多的理解错
误。如果能给别人一些帮助我会比较欣慰,如果误导甚至帮了倒忙,也希望能够理解!
如果在Win下使用Apache,而你又必须要开防火墙之类的软件,那么如果你的Apache运行有问题,比如
文件下载不完全或者损坏、未知错误信息、防火墙冲突等等,请参考如下:
打开你的 httpd.conf
配置文件,看是否如下修改可以解决问题:
EnableSendfile Off
EnableMMAP Off
Win32DisableAcceptEx
分享到:
相关推荐
任何现有的或新的问题将不予处理,我不保证合并任何新的请求请求。 如果有人愿意接管此项目,请随时分叉此项目,并给我发消息以在此自述文件中添加指向您的分叉的链接。cpp_redis cpp_redis是C ++ 11异步多平台轻量...
使用React钩子进行表单状态和验证,减少代码,提高性能。特征 :fishing_pole: ,只需一个React。 :card_file_box: 轻松管理。 :vertical_traffic_light: 支持, 和验证。 :rocket: 高效能,。... :control_knobs: 超...
--asynchronous reset; must be reset when RefClk is not within spec aRst_n : in std_logic; --asynchronous reset; must be reset when RefClk is not within spec -- Video in vid_pData : in std_...
3. **异步通信**:项目可能使用了AJAX(Asynchronous JavaScript and XML)或者现代的Fetch API进行异步数据请求,从服务器获取影片信息、用户数据或其他内容,实现数据的实时更新。 4. **动画和过渡效果**:...
标题"A_primer_on_asynchronous_modem_communication.pdf"表明这是一个关于异步调制解调器通信的初级教程,可能涵盖基本原理、工作流程、应用和相关的技术细节。 在描述中提到的"Primer in asynchronous modem ...
cpp_redis cpp_redis是C ++ 11异步多平台轻量级Redis客户端,支持同步操作,流水线,标记和高可用性。需求cpp_redis没有依赖项。 它唯一的要求是C++11 。 它没有网络模块,因此您可以自由... for asynchronous call c
同时,`Ajax`(Asynchronous JavaScript and XML)用于提升用户体验,通过异步数据交换更新页面,而无需刷新整个页面,使得交互更加流畅。 在数据管理方面,`Entity Framework`是一种对象关系映射(ORM)工具,它...
在本文中,我们将深入探讨标题"ram.rar_32 bit asynchronous_32-bit Asynchronous_双端口异步RAM"所涉及的核心概念,以及与之相关的技术细节。 首先,"32 bit asynchronous"指的是32位异步接口。这意味着该RAM具有...
在Linux操作系统中,AIO(Asynchronous Input/Output,异步I/O)是一种高级I/O接口,它允许程序在发起I/O操作后立即返回,而不是等待操作完成。AIO允许程序执行其他任务,提高系统效率,特别是在处理大量并发I/O请求...
UART(通用异步收发传输器,Universal Asynchronous Receiver/Transmitter)是嵌入式系统中常见的串行通信接口,广泛应用于设备间的短距离通信。本文将深入探讨UART模块的原理,以及如何使用Verilog进行UART模块的...
:warning_selector: 相容性问题 更新2019年11月1日:从0.53版开始,兼容性问题应解决,但需要进行测试。 该项目仍处于积极的开发阶段。 事实证明,它的某些间接依赖关系导致了兼容性问题。 新版本预计将于2019年11...
7. ECCV2018656-Daniel_Gehrig_Asynchronous_Photometric_Feature_ECCV_2018_paper:异步光度特征可能与视觉SLAM(Simultaneous Localization and Mapping)相关,即同时定位和建图,论文可能提出了一种提高鲁棒性和...
:mountain: React冒险 React高端架构和模式以备使用。 专为大型和小型项目而设计。 准备好PWA 。 描述 我们都知道有关前端模式的斗争,特别是在涉及大型项目时,随着时间的推移,它变得一团糟。...
library IEEE; Library UNISIM; use IEEE.STD_LOGIC_1164.ALL; use IEEE.STD_LOGIC_UNSIGNED.ALL... --RST => rst_manu_h -- DCM asynchronous reset input RST => reset -- DCM asynchronous reset input ); end rtl
:backhand_index_pointing_right:在使用线程池等会池化复用线程的执行组件情况下,提供ThreadLocal值的传递功能,解决异步执行时上下文传递的问题。一个Java标准库本应为框架/中间件设施开发提供的标配能力,本库...
异步FIFO(First-In-First-Out)是数字系统设计中的一个重要组件,特别是在处理高速数据传输和时钟域跨越问题时。在这个项目中,我们关注的是一个使用Verilog实现的异步FIFO,它包含了空满判断、指针同步以及内存...
您可以构建出色的表单,但是您知道用户如何使用表单吗? 来自React Final Form创建者的专业分析。 :money_bag: 想要赚大钱写React吗? 并获得顶级高科技公司的报价! :money_bag: :chequered_flag: React最终形式 :...
3. **AJAX**:Asynchronous JavaScript and XML,虽然现在XML用得不多,但AJAX理念依然重要,它允许在不刷新整个页面的情况下与服务器交换数据并局部更新页面。 4. **jQuery**:一种流行的JavaScript库,简化了DOM...
【标题】"Web2_json_ajax: 网页编程2" 涉及的主要知识点是Web开发中的JSON(JavaScript Object Notation)和AJAX(Asynchronous JavaScript and XML)技术。在网页编程2阶段,通常会深入理解这两种技术的原理、应用...