winnt_accept: AcceptEx failed.
两种现象:
[error] (730038)An operation was attempted on something that is not a socket.: winnt_accept: AcceptEx failed. Attempting to recover.
[warn] (OS 64)指定的网络名不再可用。 : winnt_accept: Asynchronous AcceptEx failed.
可能原因:
明确说明socket问题,说明在使用 AcceptEx()出现问题。
AcceptEx()的作用:
AcceptEx()是一个微软的WinSock2 API ,通过使用BSD风格的accept() API提供了性能改善。
AcceptEx的错误原因:
一些流行的Windows产品,比如防病毒软件或虚拟专用网络软件,会干扰AcceptEx()的正确操作。
解决办法:
不使用 AcceptEx()。
在httpd.conf文件中添加 Win32DisableAcceptEx 标记,如下:
<IfModule mpm_winnt.c>
ThreadsPerChild 150
MaxRequestsPerChild 10000
Win32DisableAcceptEx
</IfModule>
禁用 AcceptEx的副作用:
可能导致内存占用过多,是否会产生溢出?
性能下降,相比下降多少?
遇到这些副作用之后,的后续办法:
降低 线程数,ThreadsPerChild 150 ,有些人说小于170。
EnableMMAP Off
EnableSendfile Off
这些都是关闭一些特性,要么影响功能,要么影响性能。
对于影响性能的,影响的范围可能会更大。
最彻底的解决办法:
更换到linux,肯定会避免这些问题。