`

线上事故分析

 
阅读更多

 

事故现象

 

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

 

分享到:
评论

相关推荐

    IT故障事件处理报告

    IT故障事件处理报告模块,可供各位参考

    Rdebug是滴滴开源的一款用于RD研发自测调试的实用工具

    Rdebug 是滴滴开源的一款用于 RD 研发、自测、调试的实用工具,可以被用来提升 RD 研发效率、保障代码质量进而减少线上事故。

    服务器软件故障应急预案.docx

    线上业务访问故障 一、网站访问故障 1. 首先在lb上检查web挂载状态是否正常(ipvsadm -Ln) 2. 我们的检测步骤是先网页打开https://10.31.11.30/nagios查看各服务器状态,之后再根据服务器状态进行排错; 3. 定位哪...

    煤矿隐患排查信息管理系统研究现状与展望

    从技术和功能2个方面展望了系统发展方向:技术方面,对煤矿事故隐患信息进行多维分析与展示、建立多智能终端与PC端关联互动的互联网+协同信息处理模式、采用微服务架构设计;功能方面,提供组群、定制信息推送、职业...

    《海量数据处理与大数据技术实战》、《MySQL技术大全:开发、优化与运维实战》作者 旨在分享各种编程语言、开发技术、分布式与微服

    记一次线上重大事故:二狗子竟然把线上数据库删了!! 面试官问我:MySQL如何实现无数据插入,有数据更新?我是这样回答的! 我这样分析MySQL中的事务,面试官对我刮目相看!! 如何添加新数据库到MySQL主从复制环境...

    王者荣耀java源码-TechnicalArticles:技术文章

    王者荣耀java源码 标题 分类 内容 备注 架构 MySQL MQ 服务器 算法 ...使用redis改善数据库压力并更加实际情况定制 ...分析数据增长 ...MYSQL线上死锁问题分析 ...锁造成线上安全事故 算法 LRU算法实际使用 设计模式 设计模式

    保护用电流互感器铁芯剩磁衰减规律分析

    电流互感器的铁芯具有磁滞效应,运行过程中可能会产生剩磁,进而可能加快电流互感器的饱和,导致保护继电器的误动作。针对该现象,分析了电流...也不会衰减至0,为抑制剩磁的产生以及分析电网事故提供了基础理论依据。

    智能配电房运维智慧电力系统.pptx

    手动抄表 人员成本 线上线下全托管,无需安排人员 安排专业值班人员,人员支出大 人员素质 专业化团队,标准化保障服务 运维任务依赖人员的个人经验和专业水平 节能降耗 发现异常用能点,及分析容需电费申报值,主变...

    信息安全_01.悬崖.业务安全工作二三事.唯品会.傅奎.pptx

    安全事故与次生事故 ROUND 3 行为分析&交互式发现 基于直觉的异常订单发现系统 压力再大也不手软 理由再奇葩也不动摇 技术对抗还在继续,但...... 安全要促进营销策略优化 每逢周五必有事 午夜凶铃不曾止 我们每时每...

    架构师之路-如何做好业务建模?

    可以使用跨角色的,多泳道的流程图等工具来处理,如下图:按照时间的顺序表达出各角色或业务部件的交互,如下图:1线上预约保养服务(UST-004)【用例UST004:线上预约保养服务】1)用户选择“去保养”后,进入预约...

    变压器文本

    更换熔体时,必须先将用电设备断开,以防止引起电弧熔断器应装在各相线上。在二相三线或三相四线回路的中性线上严禁装熔断器熔断器主要用作短路保护熔断器作隔离目的使用时,必须将熔断器装设在线路首端。熔断器作用...

    物联网智能电梯监控解决方案.pptx

    蕴藏着巨大的流量价值与商业潜力 试点"线上检查+现场保养" 按需维保模式 "保险+服务"的维保模式冲击现有维保公司 市场概况 中国是全球最大的电梯市场,也具备全球最强的电梯生产能力,随着物联网、人工智能等新技术...

    养老服务行业项目商业计划书.pptx

    市场推广:通过多种渠道进行市场推广,包括线上和线下宣传、社交媒体推广、参加行业展会等。同时,还将与政府部门、社会组织等合作,提高品牌知名度和影响力。 财务管理:建立规范的财务管理体系,对项目投资、运营...

    数字孪生如何驱动智能制造?.doc

    2019年以来有两次A股热炒的概念,一是边缘计算,另一个就是数字孪生,尤其是当 波音737MAX8型飞机出现严重坠毁事故以及法国巴黎圣母院被焚毁,围绕数字孪生技术的 讨论更是掀起高潮。Gartner发布的2019年十大战略性...

    医院计算机的网络安全维护策略.docx

    为了能让人们享受到安全便捷的线上医疗系统,医院要从多方面严格地对于医院网络系统进行维护与管理,完善医院网络系统的功能完整性,并保证做好对个人信息的保密工作。最终能帮助医院工作更高效的完成,为就医人员...

    网上会展的未来发展趋势

    使得网上会展线上线下都被企业关注,吸引企业上 网进行产品供求信息的交换甚至进行商品交易。 3、提升电信运营商在中国经济建设中的重要地位 中国加入WTO后,会展经济在国民经济领域的重要作用日益显著。会展业作为...

Global site tag (gtag.js) - Google Analytics