在性能测试的时候,当并发数达到200时触发该问题
现象表现为,load达到200左右,CPU高达100%,内存使用正常,FullGC频率为1小时一次。虽然java进程正常,jvm并未崩溃,但是系统已经拒绝服务,可视为宕机。
![](http://dl.iteye.com/upload/attachment/0074/0900/fcebe6dc-8cb5-34ae-96b9-85da59449183.png)
![](http://dl.iteye.com/upload/attachment/0074/0904/0cc98849-6eb6-352d-8536-8964ed4b58f9.png)
![](http://dl.iteye.com/upload/attachment/0074/0902/4498f301-e9dc-3bcf-8ef7-bca59930fd32.png)
该问题一直持续到第二天上班时。在发现问题后,我们停止了LoadRunner,同时也停止了apache,也就是可以保证系统不再接收任何请求。
可是系统并未因此恢复正常。经分析怀疑系统存在死循环之类耗CPU的操作。
通过top shift+h shift+p 命令,查看线程情况,发现出现上百个java线程,他们各占1%的cpu。
进一步确定是代码问题造成的本次故障。
通过jstack命令打印出java线程的快照到日志文件,对日志文件进行分析,发现大多java线程的快照如下
"http-bio-8080-exec-2957" daemon prio=10 tid=0x09d01800 nid=0x4841 runnable [0x69fd4000]
java.lang.Thread.State: RUNNABLE
at org.apache.commons.collections.map.AbstractHashedMap.getEntry(AbstractHashedMap.java:440)
at org.apache.commons.collections.map.LRUMap.get(LRUMap.java:174)
at com.hongli.pandora.item.manager.WeightScoreComputor.compute(WeightScoreComputor.java:29)
at com.hongli.pandora.item.manager.CargoManager$2.compare(CargoManager.java:462)
at com.hongli.pandora.item.manager.CargoManager$2.compare(CargoManager.java:458)
at java.util.Arrays.mergeSort(Arrays.java:1270)
因此确定apache的LRUMap存在问题,经过对代码的分析发现,LRUMap是线程不安全的,在高并发的环境下,触发了死循环的bug。
最终通过在WeightScoreComputor中加入ReentrantReadWriteLock来手动保证线程的安全的方式解决了这一问题。
总结:高并发环境下暴露出的问题通常是由于内存泄漏,线程不安全等问题导致,除了在编码期间充分考虑这些问题外,更重要的是要进行充分的压力测试,并且对发生的问题进行合理的分析和排查,以解决问题和避免类似问题的再现。
这是一例典型的线程不安全的bug导致系统宕机的案例,再次提醒我们在编码过程中,必须时刻牢记共享变量的危险性,应尽量避免使用共享变量,在必须使用的情况下,必须保证共享变量在多线程环境下的安全性。
![点击查看原始大小图片](http://dl2.iteye.com/upload/attachment/0074/0900/fcebe6dc-8cb5-34ae-96b9-85da59449183-thumb.png)
- 大小: 18 KB
![点击查看原始大小图片](http://dl2.iteye.com/upload/attachment/0074/0902/4498f301-e9dc-3bcf-8ef7-bca59930fd32-thumb.png)
- 大小: 24.1 KB
![点击查看原始大小图片](http://dl2.iteye.com/upload/attachment/0074/0904/0cc98849-6eb6-352d-8536-8964ed4b58f9-thumb.png)
- 大小: 11 KB
分享到:
相关推荐
RAC 节点宕机故障分析是指在 Oracle Real Application Clusters(RAC)环境中,节点宕机故障的诊断和解决方法。在这个主题中,我们将重点介绍 RAC 节点宕机故障的分析和解决方法,涵盖 ALERT 告警文件分析、事件分析...
本文主要是本人在实际的生产环境中遇到WebLogic宕机问题,经过自己的经验整理而总结的文档,对从事中间件的人将会是很好的参考。
作为domino从业人员,经常会遇到系统宕机的问题,可是对于很多domino者,看到nsd报告的一大堆信息,就像天书一样无从下手。 本人通过下面两种方式进行说明:手动分析、NSD工具分析。Nsd报告是技术群一朋友提供,我...
处理weblogic宕机,消除内存溢出或者栈溢出问题
监控系统可以实时监控服务器的运行状态,而维护人员可以对服务器进行定期维护和升级,以避免服务器宕机。 结论 服务器宕机是不可预测的,但通过制定完善的应急预案和冗余措施,可以减少服务器宕机的影响。同时,...
"ORACLE数据库一次意外宕机的分析处理实记(ora-1578)" 在本文中,我们将讲述ORACLE数据库一次意外宕机的分析处理过程。该宕机事件发生在测试环境中的一台装有ORACLE数据库的AIX小机上,导致数据库宕机。我们将从...
mysql主备机宕机自动切换
tomcat宕机重启脚本,比较简单的一种设置
由于项目需要,编写基于zookeeper集群监测服务器宕机情况,并发邮件通知代码;实现很简单,编写了客户端和服务端,基于maven实现,代码方面修改zookeeper ip地址,需要部署的服务器名和邮件信息即可实现。直接打包...
这一份文档是不错的资源,永不宕机的服务器
由重启引起的Oracle RAC节点宕机分析及追根溯源.docx
如发生在 mysql 软件可承受力够但是服务器硬件,或者其他服务导致的 宕机 又或者 MYSQL 参数配置过大或者参数配置不合理...,出现宕机的可能多种多样,本文档主要体现的是宕机后可能出现的问题和后遗症较大的情况是什么
【毕业设计】基于 SpringBoot 的高并发选课系统,主要解决在高校选课场景下,保证选课系统在大量读写压力下不宕机,以及选课时尽可能提高 QPS,给学生一个良好的选课体验,完成上述功能同时保证选课安全 本项目主要...
信息系统运行卡顿、宕机的原因分析与初步解决方案
手把手教你如何在gitlib服务器宕机情况下,恢复代码仓库,自己在实际工作中总结的经验,如有问题可联系zhang_x_j_3166@163.com
宕机检测工具,可进行多台服务器,多IP,多个业务端口的检测。适合用于监视集群中各个节点是否正常工作。
宕机没有任何好处——POWER7 能够确保宕机不影响您的业务
主要介绍了nginx负载均衡配置,宕机自动切换方式,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
基于Nmon的PowerHA宕机故障分析.docx
第 1 章 事件概述 4 第 2 章 系统环境 4 2.1 硬件配置 4 2.2 操作系统 4 第 3 章 事件分析 4 3.1 通过日志分析事件过程 4 第 4 章 结论和建议 5