日期:2014-05-16  浏览次数:20847 次

性能调优step by step (四) --遇到的问题(Apache)


一.两个失误


1. Timeout 20   改错  改成0了,导致报500 异常
解决办法:这样客户端链接一直不超时,很快就会占满所有的资源。其它连接就连接不上。这个超时时间是必须有的
2.  配置的应该是AJP1.3的协议,原来配置项有些配置到8080端口了 配置的是http1.1协议。对应于AJP的8009参数没有配置上。导致不能满足高并发的要求.

二.其他调优点

3.  tps 上不去

分析:
(1)测试代码问题,把newSampleTest() 放在了setUp里面,统计结果不准
,导致TPS一直比较异常,要么是用户数整除的,要么是直线上升的。
(2)TPS开始会比较高,但随时间大幅下降,响应时间也是越来越长,并通过监控显示, 大量线程bolck在 取用户产品权限这里
QA的测试脚本中存在一个问题:往数据库插入的数据,每次请求都是同一个userid,只会循环改变vaccountid,这样导致按userid取列表的SQL性能每次请求一次比一次差。

(3)接口测试时都是短连接,不需要长链接。
httpd.conf   KeepAlive 为Off
  JkWorkerProperty worker.localnode.connection_pool_timeout=0 为链接池的等待时间,让其不超时,因为我们采用的是一个apache 对应一个jboss 一直保持通讯就可以了,JBOSS 同步修改。
结果:比原来理想,tps 有提高。




4. 502 异常频繁出现
4.1 解决办法:将原来的 mod-jk  localnode方式修改为loadbalancer,使用apache 缓冲池,并设置了apache 线程池大小为500。
4.2 又爆出 502、503 异常:Apache configured -- resuming normal operations

将socket超时时间增加些,让请求的线程等待时间加长一点。不至于很快拒绝掉,导致503异常。
JkWorkerProperty worker.localnode.socket_timeout=20  增加
JkWorkerProperty worker.localnode.connection_pool_minsize=25 (增加,原来注释掉了)
4.3 502 Response has been sent to the client (yet)
解决方法:线程池被被占用,先修改log看下,再有问题修改下 mod-jk  soket超时时间。调的长一点。




5. 将maxProcess 和maxThread 同时出现,以哪个为基准,cpu与性能有什么关系
分析: maxProcessor  和maxThread 同时出现时,maxProcess   优先级较高。maxProcess  表示最大并发数,maxThread 是jboss 启动的最大线程数。
这里最大链接数调整为3200 ,这个已经足够满足需求了,用于保证jboss 的稳定性,算法就是每个cpu 可以撑住200个线程,16core*200/core = 3200 ,生产环境为8core  cpu需要调整下。
     apache 起了10 个进程  StartServers = 10 这里有两个相关参数要调整
     MinSpareThreads(http_conf)*10 = MinSpareThreads (server.xml) ?
     JkWorkerProperty worker.localnode.connection_pool_size=320 *10 (启动了10个进程)= maxClient

     
     ServerLimit      100
     ThreadLimit      400(大于 ThreadsPerChild  320)
      StartServers     10
     MaxClients       3200
     MinSpareThreads  100
     MaxSpareThreads  320(小于MaxClients/10)
     ThreadperChild   320


6.   报异常Socket read failed



[org.apache.catalina.core.StandardWrapperValve] ERROR org.apache.catalina.core.ContainerBase.[jboss.web].[localhost].[/pc2].[remoting] :: Servlet.service() for servlet remoting threw exception
java.io.IOException: Socket read failed
at org.apache.coyote.ajp.AjpProcessor.read(AjpProcessor.java:1014)
at org.apache.coyote.ajp.AjpProcessor.readMessage(AjpProcessor.java:1089)



解决方法:对比和UDB配置区别server.xml
maxThreads="3200"  [color=red]minSpareThreads="100"(1000修改为100没有与httpd中相应值 10:1 这个说法)[/color] backlog="256"  


7. 宕机,apache error_log报child process 14629 still did not exit, sending a SIGTERM 错误
解决办法:apache 子进程无法正常终止,资源耗尽就宕机了,apache的日志文件太大导致的,将apache 日志删除。

8. 3200多个close_wait 状态, apache 很慢。最终跑完时有1800多个close_wait,gcUtil观察回收情况,发现回收不正常 YGC非常慢,不是每次更新一行都有增加回收次数
解决方法:由于测试环境是 16core的cpu ,这样我们的最大连接数可以按照 16*200= 3200 调,从结果来看,1800个最终的close_wait/UDB 在同样配置下是900左右的cose_wait挂起状态,也说明我们16核接收了更多请求,但是apache 配置确没有接受这么多,导致线程阻塞。调整为 3200个最大并发数。

调整后 wait 的线程保持 200 个左右回收正常了。刚才的回收不正常是由于线程挂起导致的。