网站管理平台应用一段时间后,访问后台速度正常,访问网站速度很慢;重起后速度正常,一段时间后速度变慢。
这个问题是由于和系统安装的杀毒软件、网络底层软件冲突造成的,出现这种错误时会导致apache变慢,解决方法是修改apache的配置文件
Apache 关闭 AcceptEx() ,这个在Windows平台下适用
方法是在 httpd.conf 内加入 Win32DisableAcceptEx 。
Win32DisableAcceptEx 顾名思义就是在 Windows 下关掉 AcceptEx() 功能的指令。至於 AcceptEx() 这个东西是什么,可以参考 Apache 的官方网页:
http://httpd.apache.org/docs-2.0/mod/mpm_winnt.html#win32disableacceptex
主要是说这 AcceptEx() 是 Microsoft WinSock v2 API 一组提升网络效率 API 中的指令。而且在 Windows 上似乎蛮有可能出问题的。
注:可能为了效能还是预设为开啟 AcceptEx()
如果无预警的发生问题,可能是 Windows Update 或是防火墙、防毒软体更新了某些网路原件,造成 Microsoft WinSock v2 API 动作不正常,这时可以把这个功能先给关掉。
依照官方说明 , Win32DisableAcceptEx 这个功能,只有 2.0.49 版以后的才可以使用,所以我猜测 AcceptEx() 这个指令大概也是 2.0.49 才会开始支援(目前最新的就是 2.0.49)。
关掉 AcceptEx() 的方式只要在 httpd.conf 找到 <IfModule mpm_winnt.c> 区段,加入 Win32DisableAcceptEx 就可以了。
<IfModule mpm_winnt.c>
Win32DisableAcceptEx #加入这一行
ThreadsPerChild 250
MaxRequestsPerChild 0
</IfModule>
然后重新启动动 Apache,“指定的网络名不再可用”再也不出现了
重起后,error.log不再出现错误,但是访问仍然会变慢,因此卸载了自带的杀毒软件(趋势杀毒,带防火墙),然后换用win2003自带的防火墙,打开80、8080和远程控制,重起电脑
问题似乎没有改善,而且log文件里面提示apache的线程数不够,因此修改了http.conf文件
<IfModule mpm_winnt.c>
Win32DisableAcceptEx #加入这一行
ThreadsPerChild 1000
MaxRequestsPerChild 0
</IfModule>
修改完后重起apache,没有再出现变慢的情况
由于服务器的内存够大,因此顺带优化了一下tomcat的内存占用
执行tomcat\bin\Tomcat.exe
在java选项中,把最小内存、最大内存占用由 256MB, 512MB 调整为1024MB,1024MB
然后重起tomcat
重起服务无法解决,应该是windows系统资源被耗尽,而且很可能不是 apache与tomcat耗尽的(重起服务会释放),所以从以下三个角度重新优化系统
远程看到服务器上又安装了趋势杀毒的网络版,而且防火墙是打开状态——我已经打开了windows2003的防火墙,会不会造成重复和冲突?由于是网络版,无法在本机配置,所以就没有动
关于Win32DisableAcceptEx这个参数:
如果加上这个参数,会解决error.log里面的错误情况,但是一方面会造成apache效能降低,另一方面造成apache内存占用过大。
有测试表明,打开这个参数,同时配上200个线程,apache的最大内存占用会超过2G,因此有人建议打开这个参数的情况下线程数要小于200。而保证访问速度,线程数设为了1000,有可能会造成资源不足。
因此,在线程数设为1000的情况下去掉了这个参数,经过几个小时的观察,在error.log里没有发现指定的网络名不再可用这个错误,看来这个错误的出现与线程过小有一定关系;去掉这个参数后,apache的内存不再无限制的增长。
由于apache的线程数增加,但是tomcat的线程数没有经过调整,造成了apache与tomcat间的瓶颈,因此对tomcat做了以下优化
打开 tomcat\conf\server.xml文件,找到
<Connector port="8009" enableLookups="false" redirectPort="8443"
debug="0" protocol="AJP/1.3" />
改为
<Connector port="8009" enableLookups="false" maxThreads="500"
minSpareThreads="400" maxSpareThreads="450" redirectPort="8443"
debug="0" protocol="AJP/1.3" />
然后重起tomcat即可
maxThreads:最大线程数;tomcat这个Connector上最多用的线程数
minSpareThreads:最小保留线程数;初始化的线程数
maxSpareThreads:最大保留线程数;超过这个线程就开始尝试释放
通过调整线程就要可以消除apache与tomcat间的瓶颈