路径:
1、给一个岗位分配较大的权限(目的是为了登录时慢些,使之报登录超时或通信异常,比如给岗位设置上百个岗位隶属关系),然后登录
2、当报登录超时后,再继续登录一次
问题表现:
如果apache服务端是双核,
1、凡是一个账号出现登录超时的情况,Httpd进程所占CPU就会50%,再登录一次,会再上升50%,即使退出所有客户端,CPU也不会释放(除非重启服务),因此现场服务即使是多核,如果出现超时的账号稍微多一点,就会导致Apache服务CPU被耗光
2、登录时并没有达到我们所设置的超时时间(5min or 6min)系统就会报:超时或通信异常(1-2min左右)
3、使用apache自带的server-status分析线程占用情况,如果有客户端出现非法退出的情况,线程并不是 立马释放,而是过几秒释放,所以如果现场出现此问题情况较多时,即使是500个线程(40个账号),也是可能out of threads的
参考:经过测试,一个账号登录时,会同时占用2-4个线程不等,其余的操作大部分占1-2个线程
日志及elf文件:与现场吻合
(1)Appserver的elf(经过测试,凡是出现超时,appserver的elf文件就会报下面这个,分析现场elf文件,apache出问题前,出现了大量的这类错误,且apache access log中有大量用户登录):
[{FEE617CC-1FDD-4BDD-AC0C-5325F7D46AA7}]对应的用户不存在
(2)Apache error log(一旦出现超时,线程不被及时释放,导致out of threads):
[Tue Nov 29 15:45:38 2011] [warn] Server ran out of threads to serve requests. Consider raising the ThreadsPerChild setting
[Tue Nov 29 15:46:53 2011] [warn] (OS 64)指定的网络名不再可用。 : winnt_accept: Asynchronous AcceptEx failed.
[Tue Nov 29 15:46:53 2011] [warn] (OS 64)指定的网络名不再可用。 : winnt_accept: Asynchronous AcceptEx failed.
[Tue Nov 29 15:46:53 2011] [warn] (OS 64)指定的网络名不再可用。 : winnt_accept: Asynchronous AcceptEx failed.
[Tue Nov 29 15:46:53 2011] [warn] (OS 64)指定的网络名不再可用。 : winnt_accept: Asynchronous AcceptEx failed.
后记:
各平台版本需要解决如下问题:
1、登录超时后apache CPU资源不释放问题
2、未达到超时时间就报超时的问题
修改后,测试再进行一次验证
也可能超时只是复现此问题的方法之一,
在6集中并发登录测试时没有出现此问题的原因很明显,就是权限小登录快不会大量用户报超时(6的表现是通信异常,不报超时)
截止现在,apache出现问题时的错误表现一共有:
1、ran out of threads、指定网络名不再可用、测试服务失败(已复现,避免ran out of threads可以通过设置apache的threadsperchild选项)
2、内存吃光:apache error.log中有大量的Not enough space: mpm_get_completion_context: Failed to create the transaction pool(未复现)
问题2内存吃光的原因初步诊断为存在内存泄露,或长时间大量应用导致
(MaxRequestperchild我们的系统未设置,默认是0,表明资源会一直不释放,直到服务重起,目前因还没有一个合理的测试值,设大了吃内存,设小了影响效率,后续我们再安排测试