winnt_accept: AcceptEx failed.

 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,肯定会避免这些问题。

作者: gflei   发布时间: 2010-12-20