事故现象
线上服务不定点的不能使用, 查日志发现resin服务正在重启。 由于resin所在的服务有web监控,如果web服务没有相应,则会重启resin服务。 那到底是什么导致了无法请求到web服务呢(60秒没有相应)
故障定位
1, 首先查看相应的日志:
/data/logs/chewenwww/stdout.log 正常信息日志
/data/logs/chewenwww/stderr.log 异常信息日志
/data/server/resin/log/jvm-default.log resin的日志
查看resin的日志发现在车resin重启之前有如下日志:
java.util.concurrent.TimeoutException: Timed out(1000) waiting for operation
at net.rubyeye.xmemcached.XMemcachedClient.latchWait(XMemcachedClient.java:2230)
at net.rubyeye.xmemcached.XMemcachedClient.fetch0(XMemcachedClient.java:513)
at net.rubyeye.xmemcached.XMemcachedClient.get0(XMemcachedClient.java:879)
at net.rubyeye.xmemcached.XMemcachedClient.get(XMemcachedClient.java:837)
at net.rubyeye.xmemcached.XMemcachedClient.get(XMemcachedClient.java:848)
at net.rubyeye.xmemcached.XMemcachedClient.get(XMemcachedClient.java:870)
at jp.gummy.service.cache.MemCacheManager.get(MemCacheManager.java:88)
at jp.gummy.tools.common.cache.MCache.get(MCache.java:304)
查看stdout.log 也发现有 zookeeper 重新链接的日志
[03 04:17:02,860 INFO ] [main-SendThread(10.3.63.205:2181)] zookeeper.ClientCnxn - Client session timed out,
have not heard from server in 21688ms for sessionid 0x2441aa450100345, closing socket connection and attempting reconnect
就此认为是 网络的问题。
后经过排查, 发现网络也没有什么大的问题。
2, 查看慢查询日志
经过查询慢查询日志, 发现有一条根据手机号码查询user对象的语句
@SQL("select "+ALL_FIELD+" from " + TABLE_NAME
+ " where phoneNum = :1 ")
public CwUser getCWUserByPhoneNum(String phoneNum);
经过客户端查询分析, 此语句查询很慢。
这个时候以为大概就找到原因了, 可不太明白为什么一条慢查询怎么就导致了服务的变慢,而且查询
日志发现这条语句的执行频率也不是太高。
故障重现分析
1, 将线上的206web服务拿下来,模拟用户点击使用手机号登录, 模拟慢查询的操作。 点击两三次以后发现, 206的web服务不在相应。
2, 增加gc的日志记录, 在/data/server/resin/conf/resin.conf 配置文件中增加gc的日志。如下
<jvm-arg>-Xms4096m</jvm-arg>
<jvm-arg>-Xmx4096m</jvm-arg>
<jvm-arg>-Xdebug</jvm-arg>
<jvm-arg>-Xss512k</jvm-arg>
<jvm-arg>-XX:PermSize=256M</jvm-arg>
<jvm-arg>-XX:MaxPermSize=512m</jvm-arg>
<jvm-arg>-XX:+PrintGCDetails</jvm-arg>
<jvm-arg>-XX:+PrintGCTimeStamps</jvm-arg>
<jvm-arg>-Xloggc:./log/gc.log</jvm-arg>
3, 查看gc的log发现,在点击完登录以后(手机号为:abc, 密码为:123456)。jvm模型中的年老代持续增加。
gc日志路径 /data/server/resin/log/gc.log
310.815: [GC [PSYoungGen: 838342K->12272K(1100672K)] 1214764K->406864K(3896896K), 0.0308350 secs] [Times: user=0.09 sys=0.02, real=0.03 secs]
23268.488: [GC [PSYoungGen: 821872K->16666K(1119360K)] 1216464K->412505K(3915584K), 0.0302600 secs] [Times: user=0.08 sys=0.00, real=0.03 secs]
24054.566: [GC [PSYoungGen: 849818K->18987K(1111872K)] 1245657K->420547K(3908096K), 0.0275740 secs] [Times: user=0.14 sys=0.01, real=0.03 secs]
24251.516: [GC [PSYoungGen: 852139K->269605K(735744K)] 1253699K->1161827K(3531968K), 0.4672150 secs] [Times: user=4.31 sys=0.35, real=0.47 secs]
24254.009: [GC [PSYoungGen: 735717K->460824K(932096K)] 1627939K->1618868K(3728320K), 0.4211430 secs] [Times: user=4.06 sys=0.15, real=0.42 secs]
24255.917: [GC [PSYoungGen: 926936K->463479K(932096K)] 2084980K->2083985K(3728320K), 0.5223580 secs] [Times: user=4.91 sys=0.28, real=0.52 secs]
24258.026: [GC [PSYoungGen: 929591K->465319K(932096K)] 2550097K->2549705K(3728320K), 0.5334350 secs] [Times: user=4.93 sys=0.35, real=0.53 secs]
24260.064: [GC [PSYoungGen: 931431K->465972K(932096K)] 3015817K->3015163K(3728320K), 0.5280580 secs] [Times: user=4.89 sys=0.36, real=0.53 secs]
24260.592: [Full GC [PSYoungGen: 465972K->217778K(932096K)] [PSOldGen: 2549191K->2796224K(2796224K)] 3015163K->3014002K(3728320K) [PSPermGen: 127322K->127322K(264832K)], 4.9594160 secs] [Times: user=4.88 sys=0.08, real=4.95 secs]
24266.419: [Full GC [PSYoungGen: 466112K->466112K(932096K)] [PSOldGen: 2796224K->2796224K(2796224K)] 3262336K->3262336K(3728320K) [PSPermGen: 127322K->127322K(262144K)], 4.8840250 secs] [Times: user=4.87 sys=0.01, real=4.88 secs]
24271.304: [Full GC [PSYoungGen: 466112K->340903K(932096K)] [PSOldGen: 2796224K->2796223K(2796224K)] 3262336K->3137127K(3728320K) [PSPermGen: 127322K->125606K(262144K)], 6.4299960 secs] [Times: user=6.42 sys=0.01, real=6.43 secs]
24278.162: [Full GC [PSYoungGen: 466112K->466112K(932096K)] [PSOldGen: 2796223K->2796223K(2796224K)] 3262335K->3262335K(3728320K) [PSPermGen: 125607K->125607K(262144K)], 4.9364420 secs] [Times: user=4.93 sys=0.01, real=4.94 secs]
24283.109: [Full GC [PSYoungGen: 466112K->466112K(932096K)] [PSOldGen: 2796224K->2796224K(2796224K)] 3262336K->3262336K(3728320K) [PSPermGen: 125607K->125607K(262144K)], 4.9332780 secs] [Times: user=4.93 sys=0.01, real=4.93 secs]
24288.042: [Full GC [PSYoungGen: 466112K->449133K(932096K)] [PSOldGen: 2796224K->2796223K(2796224K)] 3262336K->3245357K(3728320K) [PSPermGen: 125607K->125606K(262144K)], 6.4916020 secs] [Times: user=6.48 sys=0.01, real=6.49 secs]
24294.579: [Full GC [PSYoungGen: 466112K->461216K(932096K)] [PSOldGen: 2796223K->2796223K(2796224K)] 3262335K->3257440K(3728320K) [PSPermGen: 125617K->125617K(262144K)], 6.5066020 secs] [Times: user=6.50 sys=0.01, real=6.50 secs]
24301.100: [Full GC [PSYoungGen: 466112K->466112K(932096K)] [PSOldGen: 2796223K->2796223K(2796224K)] 3262335K->3262335K(3728320K) [PSPermGen: 125617K->125617K(262144K)], 4.9549900 secs] [Times: user=4.94 sys=0.01, real=4.95 secs]
24306.056: [Full GC [PSYoungGen: 466112K->466112K(932096K)] [PSOldGen: 2796223K->2796223K(2796224K)] 3262335K->3262335K(3728320K) [PSPermGen: 125617K->125617K(262144K)], 4.9524090 secs] [Times: user=4.94 sys=0.01, real=4.95 secs]
24311.013: [Full GC [PSYoungGen: 466112K->466112K(932096K)] [PSOldGen: 2796223K->2796223K(2796224K)] 3262335K->3262335K(3728320K) [PSPermGen: 125617K->125617K(262144K)], 4.9518770 secs] [Times: user=4.94 sys=0.02, real=4.95 secs]
发现年老代的占用空间几乎达到 100%, PSOldGen: 2796223K->2796223K(2796224K)]。 这个很让人费解
日志格式说明参考: gc.jpeg 和 fgc.jpeg
4, 再次模拟上述测试环境, 在 stderr.log中发现如下:
Caused by: java.lang.OutOfMemoryError: Java heap space
at com.mysql.jdbc.MysqlIO.nextRowFast(MysqlIO.java:1632)
at com.mysql.jdbc.MysqlIO.nextRow(MysqlIO.java:1409)
at com.mysql.jdbc.MysqlIO.readSingleRowSet(MysqlIO.java:2886)
at com.mysql.jdbc.MysqlIO.getResultSet(MysqlIO.java:476)
at com.mysql.jdbc.MysqlIO.readResultsForQueryOrUpdate(MysqlIO.java:2581)
at com.mysql.jdbc.MysqlIO.readAllResults(MysqlIO.java:1757)
at com.mysql.jdbc.MysqlIO.sqlQueryDirect(MysqlIO.java:2171)
at com.mysql.jdbc.ConnectionImpl.execSQL(ConnectionImpl.java:2568)
at com.mysql.jdbc.PreparedStatement.executeInternal(PreparedStatement.java:2113)
at com.mysql.jdbc.PreparedStatement.executeQuery(PreparedStatement.java:2275)
at org.apache.commons.dbcp.DelegatingPreparedStatement.executeQuery(DelegatingPreparedStatement.java:96)
at org.apache.commons.dbcp.DelegatingPreparedStatement.executeQuery(DelegatingPreparedStatement.java:96)
at org.springframework.jdbc.core.JdbcTemplate$1.doInPreparedStatement(JdbcTemplate.java:648)
at org.springframework.jdbc.core.JdbcTemplate.execute(JdbcTemplate.java:591)
at org.springframework.jdbc.core.JdbcTemplate.query(JdbcTemplate.java:641)
at org.springframework.jdbc.core.JdbcTemplate.query(JdbcTemplate.java:670)
at org.springframework.jdbc.core.JdbcTemplate.query(JdbcTemplate.java:678)
at org.springframework.jdbc.core.JdbcTemplate.query(JdbcTemplate.java:710)
at net.paoding.rose.jade.provider.jdbc.JdbcImpl.query(JdbcImpl.java:67)
at net.paoding.rose.jade.provider.jdbc.JdbcDataAccess.select(JdbcDataAccess.java:79)
at net.paoding.rose.jade.core.SQLThreadLocalWrapper.select(SQLThreadLocalWrapper.java:48)
at net.paoding.rose.jade.core.SelectOperation.execute(SelectOperation.java:66)
at net.paoding.rose.jade.core.JadeDaoInvocationHandler.invoke(JadeDaoInvocationHandler.java:128)
at $Proxy35.getCWUserByPhoneNum(Unknown Source)
at com.chewen.chewen_user.biz.impl.CwUserBizImpl.getByPhoneNum(CwUserBizImpl.java:68)
由此猜测是否是查询的结果是很多条记录??????? 导致堆栈溢出呢
故障推论验证
1, 通过mysql客户端发现, 查询
mysql> select count(*) from user where phoneNum="abc" ;
+----------+
| count(*) |
+----------+
| 5115771 |
+----------+
有大概五百多万条记录,将查询条件更改为其他字符时, 发现结果一样
mysql> select count(*) from user where phoneNum="abcdef" ;
+----------+
| count(*) |
+----------+
| 5115771 |
+----------+
推测, 难道是mysql查询时将字符串转为Bigint格式的时候转为0了?
mysql> select count(*) from user where phoneNum=0;
+----------+
| count(*) |
+----------+
| 5115771 |
+----------+
结果一样。
到此, 真相大白了, 因为数据表结构中phoneNum是Bigint类型的, 而查询的时候如果是字符串则将
字符串转化为了Bigint格式, 转为0了。导致了上百万条记录的返回, 导致jvm堆栈溢出。
jvm gc format: http://blog.csdn.net/lxb_champagne/article/details/9006593
jvm 垃圾回收: http://blog.sina.com.cn/s/blog_4080505a0101i6cr.html
相关推荐
2. 线上事故处理:文章中提到线上事故的处理过程,包括问题的发现、定位、修复和恢复,旨在尽量减少系统的停机时间和损失。 3. GitHubStar:文章中提到 GitHub 的 Star 机制,Star 代表用户对项目的认可和支持,...
"程序人生记一次敖丙的线上P2事故" 概述: 本文档记录了敖丙的线上P2事故,详细记录了事故的过程、原因和解决方案。事故的原因是由于CPU使用率达到99%,导致系统响应时间增加,影响用户体验。通过分析,发现问题的...
因此,对安全事故进行深入反思,分析其发生的原因,已经成为提升安全管理、防止事故重演的必要途径。安全事故的反思不仅是为了惩戒违规行为,更重要的是从中吸取教训,举一反三,从根本上提升安全管理水平。 首先,...
- **事件分析**:分析了故障的根本原因及其对业务的影响。 - **改进措施**: - 定期检查和更新邮件服务器的安全补丁,避免类似问题再次发生。 - 加强对于新版本操作系统与现有服务器兼容性的测试。 - 对IT部门...
3. **事故培训流程**:针对线上事故处理的培训,旨在提高团队的应急处理能力和效率。 4. **处罚规则**:可能包含对于处理线上事件不及时或不当的处罚措施,以确保流程的有效执行。 在实际操作中,这个流程规范应...
2. **事故响应**:一旦发现故障,应立即启动应急响应机制。这包括通知相关人员(如运维团队、开发团队、项目经理等),并记录故障开始时间、影响范围等基本信息。 3. **初步判断与隔离**:通过对系统状态的检查和...
同时,模版还能够帮助企业进行事故分析,找出安全漏洞,从而提升整体的安全管理水平。 总之,"安全事故报告书excel模版下载"是企业安全管理的重要工具,它不仅简化了报告制作流程,也为企业的信息安全提供了一份...
这份名为“行业资料-电子功用-充电桩整机线上测试方法以及装置的介绍分析”的压缩包文件,包含了关于充电桩整机线上测试方法和相关测试装置的详细内容。下面将对其中涉及的知识点进行深入解析。 1. 充电桩整机测试...
然而,近年来,S203线上的交通事故频发,给人员财产安全带来了极大威胁。为深入剖析事故成因,提出针对性的安全对策,李华成和李江两位学者展开了针对内蒙古S203线事故成因的分析研究,并通过数理统计和系统分析方法...
"IT线上维护项目故障报告模板.zip" 提供了两个具体的文档,分别是针对2022年1月6日XXX平台宕机事故和访问不了故障的报告,旨在帮助我们理解如何编写有效的故障报告。 首先,故障报告的核心目标是记录事件的全过程,...
Java线程分析是Java开发中的重要环节,尤其是在处理性能优化、死锁排查或者并发问题时。TDA(Thread Dump Analyzer...这不仅可以提升应用质量,也有助于提升开发团队的故障排查能力,减少因多线程问题导致的线上事故。
文档标题和描述涉及的是2018年上半年海南地区安全工程师的考试模拟试题,特别是关于《生产事故案例分析》部分,内容涵盖了危险、有害因素的识别和处理,以及相关的安全管理知识。以下是基于这部分内容的关键知识点:...
在投资建议方面,分析师推荐关注那些线上运营能力强和线下布局进度良好的公司,比如三只松鼠、良品铺子、盐津铺子和甘源食品等。这些公司通过多渠道的发展策略,不仅可以更好地触及消费者,也能在市场变化中保持灵活...
2. **智能支护设计模块**:用户可以输入新工程的具体参数,系统利用BP神经网络进行数据处理和分析,依据巷道的地质条件和历史支护案例,智能设计出科学合理的支护方案。 3. **支护报告生成模块**:系统根据设计方案...
3. **过程监控**:视觉系统可以持续监控冲压过程,检测模具磨损、变形等情况,及时报警并预防生产事故。 4. **自动化控制**:结合反馈机制,视觉系统可以与机器人、伺服驱动器等设备配合,实现闭环控制,调整冲压...
通过线上处理轻微事故,可以显著降低交通拥堵,节省警力资源,同时提升公众满意度。 据统计,每日平均有大量轻微事故需要处理,如果依靠传统的现场出警方式,不仅消耗大量警力,还会导致道路长时间拥堵。而采用智慧...
人人网服务化与架构变迁,包括: ...一次线上事故 失控 从事故深挖出一些共性问题 Xiaonei Oriented Architecture 为什么不使用非阻塞方式? 离线服务调度 在线服务调度 服务在线/离线 Log/Profiling 收集分析
尤其在清洗线上,由于水、酸和碱等溶液的存在,线路易腐蚀,且线路故障可能引发安全事故。采用Profibus-DP现场总线技术,能够有效解决上述问题。 三、Profibus-DP在电路板自动清洗线上的应用技术路线 本文提出了一...
【KEEP核心竞争力分析】 KEEP作为全球最大的线上健身平台,其成功的关键在于其独特的内容+社区构建的核心竞争力。该公司提供丰富的健身课程和训练规划,不断迭代更新以满足用户的个性化需求。这种持续的内容创新...
1. 英语考试结构:题目中提到的是高一英语下学期的线上考试,这涉及到英语教育中的考试模式,通常包括阅读理解、听力、词汇、语法等多个部分,旨在测试学生的综合语言能力。 2. 阅读理解题型:在描述中提到了阅读...