设为首页 收藏本站
查看: 429|回复: 0

[经验分享] apache+tomcat 集群高负载性能问题

[复制链接]

尚未签到

发表于 2017-1-6 06:39:20 | 显示全部楼层 |阅读模式
  在用apache+tomcat做负载均衡的时候,遇到服务器问题,apache的日志如下:
  写道
==ajp_process_callback::jk_ajp_common.c (1945): Writing to client aborted or client network problems
==ajp_service::jk_ajp_common.c (2607): (tomcat2) sending request to tomcat failed (unrecoverable), because of client write error (attempt=1)
==service::jk_lb_worker.c (1400): service failed, worker tomcat2 is in local error state
==service::jk_lb_worker.c (1419): unrecoverable error 200, request failed. Client failed in the middle of request, we can't recover to another instance.
==jk_handler::mod_jk.c (2671): Aborting connection for worker=controller
  网上找了一些解决办法,这里贴出只是为了备注一下,方便以后查找。
写道
1现象
当然能报这个错的原因很多,配置不对连不上的,二者版本不对,不兼容的,这里不讨论这些入门的事。只说配置成功,在有较高负载的情况下出现这种情况。这种情况还伴随着apache的文件正常访问,单独访问tomcat的端口也正常。只是访问apache+tomcat的端口出事。

2解决方案
在workers.properties里设置相应的负载机器的recovery_options=3

3解释
recovery_options属性说明了web server在检测到Tomcat失败后如何进行恢复工作。默认情况下,web server将转发请求给处于负载平衡模式中的另一个Tomcat。属性值为0,说明全部恢复;属性值为1,说明如果在Tomcat接到请求后出现失败状况,则不进行恢复;属性值为2,说明如果在Tomcat发送http头给客户端后出现失败状况,则不进行恢复;属性值为3,说明如果在Tomcat接到请求后出现失败状况或者在Tomcat发送http头给客户端后出现失败状况,则不进行恢复。此属性在jk 1.2.6版本被增加进来,以求避免Tomcat的死机和在支持ajp13的servlet引擎上发生的问题。此属性默认为全部恢复。
因在默认的情况下,JK检测tomcat的工作情况,所以浪费了很多资源,这个资源多到比tomcat正常工作所需的资源的1.6倍还多--通过后来的满足更多请求使用更少机器的情况估计出来的保守值。如果不检测恢复,则效率高了,处理的请求数可以是原来的2.6倍多,而且tomcat还不死--没响应,反而使出错的数量比检测恢复之后出错的数量还少,性能还加强了,如果原来用这种的集群100台机器,有一阵就挂掉,改成这个配置只要40台机器,一般在同样的时间段内运行无反应或出错的情况比recovery_options使用默认值的少得多。
recovery_options的最新参考
http://tomcat.apache.org/connectors-doc/reference/workers.html

4思考过程和方法
具体说是具体问题具体分析,这里主要是观察和思考矛盾现象。
矛盾现象:负载高时,机器僵死,CPU和IO都不怎么用,只处理少量请求,tomcat单独访问没问题,apache单独访问没问题。现象很矛盾,负载高反而不做什么事。
观察这种矛盾现象用到了查看机器网络流量,CPU占用,全局共享文件,使用内存,IO使用情况,apache和tomcat使用的文件、socket、线程。综合上面的现象和一些观察的结果看,问题出现在apache连接tomcat上,当然就去找那个上面提到过的配置文件参考。几乎试用了所有参数,最终找到这个参数,起初没觉得这个错误恢复功能会使性能下降这么大,不过仔细想想这个功能确实会占用大量的资源,一个程序监控另一个程序里的连接数据还要根据这些数据判断一堆东西显然要比一个只往自己的网络连接里收发数据的程序占用的资源大,以至性能下降很大。改了它之后解决了一半高负载的问题。还有可能会出现的另一个问题。

5可能出现的问题
在服务器管理的实践中遇到过经改完配制后,有的机器还有上面的报错,但已经不是不用CPU和IO了,看样子是正常工作了。有的机器现象较好,一个apache+4个tomcat,一晚上可以处理1000万的请求。用jmeter开50个线程狂压都死不了。起初认为是新旧机器的事,因旧机器性能本身是差,并且旧机器中出现以上报错的也多。但是也有一两台旧机器运行良好,一两台新机器一两天就会出现上面的报错。为此,又分析了一下这个矛盾现象。
从监控新机器处理的流量开始,这些新机器每天处理的流量都是差不多的,配制基本上一样。上面说过一台运行好的机器12小时处理1000万请求还轻松,而正常运营的每台机器24小时处理不超过150万请求,还有报错的现象。显然性能差别巨大不是新旧机器性能上的而是本质上的。
于是在新机器中选出性能好和不好的,全面对比,还算是比较顺利,因用CPU多的只有tomcat,而用ps看程序时,发现二者的java路径不一样,很容易让人想到是jre的事。把性能不好的机器换上的jrocket的jre,问题解决了。
原因为普通的jre总是回收内存,做了回收内存的日志,一秒钟最少回收一次,一台机器4个tomcat则每秒至少回收4次,回收期间使用CPU高--1个tomcat占500多兆内存,而且垃圾回收期间是暂停请求的,所以CPU狂用,而处理的量也不比其它机器多。而jrocket的jre测试用了一两个小时竟然没垃圾回收,网上查了一下有人说那个大约一天才回收一次,不过回收一次可能要几分钟到十几分钟,这就是为什么用apache加一个jrocket的NIO的tomcat不如用apache加4个tomcat好的原因,只要一垃圾回收一个tomcat十几分钟没响应肯定是不行的,虽然单个的NIO的tomcat的性能比4个tomcat的好。

出自:http://blog.sina.com.cn/s/blog_54394f910100p52t.html

运维网声明 1、欢迎大家加入本站运维交流群:群②:261659950 群⑤:202807635 群⑦870801961 群⑧679858003
2、本站所有主题由该帖子作者发表,该帖子作者与运维网享有帖子相关版权
3、所有作品的著作权均归原作者享有,请您和我们一样尊重他人的著作权等合法权益。如果您对作品感到满意,请购买正版
4、禁止制作、复制、发布和传播具有反动、淫秽、色情、暴力、凶杀等内容的信息,一经发现立即删除。若您因此触犯法律,一切后果自负,我们对此不承担任何责任
5、所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其内容的准确性、可靠性、正当性、安全性、合法性等负责,亦不承担任何法律责任
6、所有作品仅供您个人学习、研究或欣赏,不得用于商业或者其他用途,否则,一切后果均由您自己承担,我们对此不承担任何法律责任
7、如涉及侵犯版权等问题,请您及时通知我们,我们将立即采取措施予以解决
8、联系人Email:admin@iyunv.com 网址:www.yunweiku.com

所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其承担任何法律责任,如涉及侵犯版权等问题,请您及时通知我们,我们将立即处理,联系人Email:kefu@iyunv.com,QQ:1061981298 本贴地址:https://www.yunweiku.com/thread-324370-1-1.html 上篇帖子: 应用Apache Axis2 实现Webservice发布 下篇帖子: Handler and Phase in Apache Axis2
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

扫码加入运维网微信交流群X

扫码加入运维网微信交流群

扫描二维码加入运维网微信交流群,最新一手资源尽在官方微信交流群!快快加入我们吧...

扫描微信二维码查看详情

客服E-mail:kefu@iyunv.com 客服QQ:1061981298


QQ群⑦:运维网交流群⑦ QQ群⑧:运维网交流群⑧ k8s群:运维网kubernetes交流群


提醒:禁止发布任何违反国家法律、法规的言论与图片等内容;本站内容均来自个人观点与网络等信息,非本站认同之观点.


本站大部分资源是网友从网上搜集分享而来,其版权均归原作者及其网站所有,我们尊重他人的合法权益,如有内容侵犯您的合法权益,请及时与我们联系进行核实删除!



合作伙伴: 青云cloud

快速回复 返回顶部 返回列表