现象:
[Sat Mar 03 13:29:49 2007] [warn] (OS 64)指定的网络名不再可用。 :winnt_accept: Asynchronous AcceptEx failed.
出现这个故障时硬盘灯狂闪,内存占用极大,访问极慢。
分析:
AcceptEx() 是 Microsoft WinSock v2 API 一组提升网路效率 API 中的指令。而且在 Windows上似乎蛮有可能出问题的。
注:可能為了效能还是预设為开啟 AcceptEx()
解决:
如果无预警的发生问题,我猜可能是 Windows Update 或是防火墙、防毒软体更新了某些网路原件,造成 MicrosoftWinSock v2 API 动作不正常,这时可以把这个功能先给关掉。
依照官方说明 , Win32DisableAcceptEx 这个功能,只有 2.0.49 版以后的才可以使用,所以我猜测AcceptEx() 这个指令大概也是 2.0.49 才会开始支援(目前最新的就是 2.0.49)。
关掉 AcceptEx() 的方式只要在 httpd.conf 找到 区段,加入 Win32DisableAcceptEx就可以了。
Win32DisableAcceptEx #加入这一行
ThreadsPerChild 250
MaxRequestsPerChild 0
疑问:如果把AcceptEx()这个关掉了,是否会影响访问的速度;如果影响速度,又怎样不让速度慢下来。
解决办法如下:
在httpd.conf文件中添加 Win32DisableAcceptEx 标记,如下:
<IfModule mpm_winnt.c>
ThreadsPerChild 550
MaxRequestsPerChild 10000
Win32DisableAcceptEx
</IfModule>
设置ThreadsPerChild为 550(可能占内存会达到2G,可按你机器的实际情况配置),这样可以允许并发连接更大一些。同时性能上也不会有明显的降低。
如果Apache的error.log还是出现大量的:Sat Dec 24 17:21:28 2006] [warn] (OS64)指定的网络名不再可用。 : winnt_accept: Asynchronous AcceptExfailed。可以参考下列配置:
1、网上邻居->本地连接->属性->internet协议(TCP/IP)->属性->高级->wins标签->去掉启用LMhosts查询前的勾.
2、控制面版->windows防火墙->高级标签->本地连接设置->服务的标签里勾选安全Web服务器(HTTPS)。
3、然后退出Apache,再打开启动就可以了 ,一开始我没有退出,直接在那重启,就是不可以,一定要先停止,在开启即可
停止Apache,再启动。确实新设置起作用了:
[notice] Disabled use of AcceptEx() WinSock2 API
[notice] mod_python: Creating 8 session mutexes based on 0 maxprocesses and 1000 max threads.
[notice] Child 2380: Child process is running
[notice] Child 2380: Acquired the start mutex.
[notice] Child 2380: Starting 1000 worker threads.