`

线上事故分析

 
阅读更多

 

事故现象

 

线上服务不定点的不能使用, 查日志发现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

 

分享到:
评论

相关推荐

    《程序人生》记一次敖丙的线上P2事故1

    2. 线上事故处理:文章中提到线上事故的处理过程,包括问题的发现、定位、修复和恢复,旨在尽量减少系统的停机时间和损失。 3. GitHubStar:文章中提到 GitHub 的 Star 机制,Star 代表用户对项目的认可和支持,...

    《程序人生》记一次敖丙的线上P2事故.pdf

    "程序人生记一次敖丙的线上P2事故" 概述: 本文档记录了敖丙的线上P2事故,详细记录了事故的过程、原因和解决方案。事故的原因是由于CPU使用率达到99%,导致系统响应时间增加,影响用户体验。通过分析,发现问题的...

    安全事故反思.doc

    因此,对安全事故进行深入反思,分析其发生的原因,已经成为提升安全管理、防止事故重演的必要途径。安全事故的反思不仅是为了惩戒违规行为,更重要的是从中吸取教训,举一反三,从根本上提升安全管理水平。 首先,...

    IT故障事件处理报告

    - **事件分析**:分析了故障的根本原因及其对业务的影响。 - **改进措施**: - 定期检查和更新邮件服务器的安全补丁,避免类似问题再次发生。 - 加强对于新版本操作系统与现有服务器兼容性的测试。 - 对IT部门...

    线上事件或故障处理流程规范.pdf

    3. **事故培训流程**:针对线上事故处理的培训,旨在提高团队的应急处理能力和效率。 4. **处罚规则**:可能包含对于处理线上事件不及时或不当的处罚措施,以确保流程的有效执行。 在实际操作中,这个流程规范应...

    线上故障处理流程.zip

    2. **事故响应**:一旦发现故障,应立即启动应急响应机制。这包括通知相关人员(如运维团队、开发团队、项目经理等),并记录故障开始时间、影响范围等基本信息。 3. **初步判断与隔离**:通过对系统状态的检查和...

    安全事故报告书excel模版下载

    同时,模版还能够帮助企业进行事故分析,找出安全漏洞,从而提升整体的安全管理水平。 总之,"安全事故报告书excel模版下载"是企业安全管理的重要工具,它不仅简化了报告制作流程,也为企业的信息安全提供了一份...

    行业资料-电子功用-充电桩整机线上测试方法以及装置的介绍分析.rar

    这份名为“行业资料-电子功用-充电桩整机线上测试方法以及装置的介绍分析”的压缩包文件,包含了关于充电桩整机线上测试方法和相关测试装置的详细内容。下面将对其中涉及的知识点进行深入解析。 1. 充电桩整机测试...

    内蒙古S203线事故成因分析及安全对策研究

    然而,近年来,S203线上的交通事故频发,给人员财产安全带来了极大威胁。为深入剖析事故成因,提出针对性的安全对策,李华成和李江两位学者展开了针对内蒙古S203线事故成因的分析研究,并通过数理统计和系统分析方法...

    IT线上维护项目故障报告模板.zip

    "IT线上维护项目故障报告模板.zip" 提供了两个具体的文档,分别是针对2022年1月6日XXX平台宕机事故和访问不了故障的报告,旨在帮助我们理解如何编写有效的故障报告。 首先,故障报告的核心目标是记录事件的全过程,...

    java线程分析工具TDA

    Java线程分析是Java开发中的重要环节,尤其是在处理性能优化、死锁排查或者并发问题时。TDA(Thread Dump Analyzer...这不仅可以提升应用质量,也有助于提升开发团队的故障排查能力,减少因多线程问题导致的线上事故。

    海南2018上半年安全工程师《生产事故案例分析》_危险、有害因素产生模拟考试题.doc

    文档标题和描述涉及的是2018年上半年海南地区安全工程师的考试模拟试题,特别是关于《生产事故案例分析》部分,内容涵盖了危险、有害因素的识别和处理,以及相关的安全管理知识。以下是基于这部分内容的关键知识点:...

    食品加工行业专题研究:线上各平台趋于均衡,线下拓店渠道下沉趋势形成.pdf

    在投资建议方面,分析师推荐关注那些线上运营能力强和线下布局进度良好的公司,比如三只松鼠、良品铺子、盐津铺子和甘源食品等。这些公司通过多渠道的发展策略,不仅可以更好地触及消费者,也能在市场变化中保持灵活...

    “线上”智能支护系统设计.pdf

    2. **智能支护设计模块**:用户可以输入新工程的具体参数,系统利用BP神经网络进行数据处理和分析,依据巷道的地质条件和历史支护案例,智能设计出科学合理的支护方案。 3. **支护报告生成模块**:系统根据设计方案...

    视觉系统在冲压自动化线上的应用.rar

    3. **过程监控**:视觉系统可以持续监控冲压过程,检测模具磨损、变形等情况,及时报警并预防生产事故。 4. **自动化控制**:结合反馈机制,视觉系统可以与机器人、伺服驱动器等设备配合,实现闭环控制,调整冲压...

    智慧交通事故快清快处云平台方案.pptx

    通过线上处理轻微事故,可以显著降低交通拥堵,节省警力资源,同时提升公众满意度。 据统计,每日平均有大量轻微事故需要处理,如果依靠传统的现场出警方式,不仅消耗大量警力,还会导致道路长时间拥堵。而采用智慧...

    人人网服务化与架构变迁v3.pdf

    人人网服务化与架构变迁,包括: ...一次线上事故 失控 从事故深挖出一些共性问题 Xiaonei Oriented Architecture 为什么不使用非阻塞方式? 离线服务调度 在线服务调度 服务在线/离线 Log/Profiling 收集分析

    Profibus-DP在电路板自动清洗线上的应用.pdf

    尤其在清洗线上,由于水、酸和碱等溶液的存在,线路易腐蚀,且线路故障可能引发安全事故。采用Profibus-DP现场总线技术,能够有效解决上述问题。 三、Profibus-DP在电路板自动清洗线上的应用技术路线 本文提出了一...

    消费者服务报告:KEEP即将港股上市,全球最大线上健身平台以内容+社区构筑核心竞争力(2022)(36页).pdf

    【KEEP核心竞争力分析】 KEEP作为全球最大的线上健身平台,其成功的关键在于其独特的内容+社区构建的核心竞争力。该公司提供丰富的健身课程和训练规划,不断迭代更新以满足用户的个性化需求。这种持续的内容创新...

    黑龙江省鸡西市鸡东县第二中学2019_2020学年高一英语下学期线上考试试题

    1. 英语考试结构:题目中提到的是高一英语下学期的线上考试,这涉及到英语教育中的考试模式,通常包括阅读理解、听力、词汇、语法等多个部分,旨在测试学生的综合语言能力。 2. 阅读理解题型:在描述中提到了阅读...

Global site tag (gtag.js) - Google Analytics