`
iamzhongyong
  • 浏览: 797133 次
  • 性别: Icon_minigender_1
  • 来自: 杭州
社区版块
存档分类
最新评论

记录一次对代码完全陌生的问题排查过程

 
阅读更多

        最近高层来参观,有个页面是重点放在屏幕上的,但是已经好几个月没维护了,前端同学在调样式的时候发现响应时间很长,有两个异步请求都在30秒左右,如果在慢速网络情况下,40秒都有可能。于是开始排查。

        但是,这个页面的逻辑我完全不清楚。

        1、用firebug看了一下,发现一次页面请求,会发送多个http请求,是到一个接口,然后通过参数不同来调用不同的逻辑,哎呀,傻了,本来逻辑就不清楚,还是通过参数动态控制的;

 

        2、找到代码,逐段分析,发现逻辑方法中初最后一行外,其余的全是内存操作,不可能耗时很长,只有最后一场是数据库的操作;

 

        3、中间试过用Btrace的工具把调用的方法栈以及响应时间占比打印出来,这样就能很快的定位那个地方慢了,但是搞了半天,也没打印出栈信息出来,于是放弃使用这个高级货了。

 

        4、进入最后一行代码的实现,发现全是DAO操作,心里大体有谱了,但是有好多DAO,是那个DAO方法慢了呢?

 

        5、观察发现这些DAO是来自一个类,然后就用housemd来进行动态追踪,打印这个类的执行情况。

1
trace  -d  -t 60 IbatisNodeTransitDAO

            这样在点击页面的过程中,打印出来这个类中各个方法的执行情况,

1
2
3
4
core/dao/ibatis/IbatisNodeTransitDAO.queryPredictWarnAllNodeTransitsLoadCount(PredictDataQueryTO,  Double, Double)   
sun.misc.Launcher$AppClassLoader@63c78e57            2          328ms     core.dao.ibatis.IbatisNodeTransitDAO@564a6f2
core/dao/ibatis/IbatisNodeTransitDAO.queryPredictWarnForcastRoutineByAreaBounds(PredictDataQueryTO)       
sun.misc.Launcher$AppClassLoader@63c78e57            5           <1ms     core.dao.ibatis.IbatisNodeTransitDAO@564a6f2
core/dao/ibatis/IbatisNodeTransitDAO.queryPredictWarnLineCountByNodeTransitId(Long,  String)              
sun.misc.Launcher$AppClassLoader@63c78e57          184          290ms     core.dao.ibatis.IbatisNodeTransitDAO@564a6f2
core/dao/ibatis/IbatisNodeTransitDAO.queryPredictWarnNodeTransitsByAreaBounds(PredictDataQueryTO)         
sun.misc.Launcher$AppClassLoader@63c78e57            5          258ms     core.dao.ibatis.IbatisNodeTransitDAO@564a6f2

 

 

        6、在上面中,发现queryPredictWarnLineCountByNodeTransitId这个方法的平均响应时间很长,而且调用次数很多,然后就找到这个DAO对应的SQL,SQL如下:

1
2
3
4
5
6
7
8
9
select
            sum(ls.order_count) as lineCount
        from
            xxxxxx_table ls
        where
            ls.status = 1 and
            ( ls.record_date between #beginDate# and #endDate#) and
            ls.to_transit_id = #transitId#
        ]]>

 

         第一反应是没有加索引,在websqlplus上面,看了一下,这个表数据不多80W左右,然后造了一个数据,用explain select_statement来看了一下情况,然后type是all,也就是全表扫描,这时候基本清楚问题怎么解决了。

 

        7、联系DBA添加索引,被DBA说了一顿,白天不能加,哀求白天,加上了。

        由于status是个常量字段,不用添加,于是在record_date和to_transit_id搞了一个组合索引。

 

        8、至此,问题解决。​

 

            总结:

            1、灵活运用动态追踪工具,因为线上环境不可能像我们线下环境那样能够debug

            2、快速阅读代码,定位可能存在的瓶颈(死循环、网络IO、数据库操作、大对象操作等)

        

        

9
2
分享到:
评论
1 楼 rain2005 2014-03-19  
哈哈,这个问题还是服务监控没有做到位,housemd确实很赞

相关推荐

    一次OOM问题排查过程实战记录

    主要给大家介绍了一次OOM问题排查过程,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面来一起学习学习吧

    一次Jvm old过高的排查过程实战记录

    主要给大家介绍了一次Jvm old过高的排查过程,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧

    记一次tomcat进程cpu占用过高的问题排查记录

    主要介绍了记一次tomcat进程cpu占用过高的问题排查记录,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧

    一次Docker中Redis连接暴增的问题排查实战记录

    主要给大家介绍了一次Docker中Redis连接暴增的问题排查的相关资料,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面来一起学习学习吧

    一段sql代码计算组织层级架构

    作为一种用于管理和查询关系型数据库的语言,SQL代码在电子取证中可以帮助取证人员恢复被删除、修改或隐藏的数据。通过分析数据库中的SQL操作记录,可以确定数据被何种操作影响,并从日志中还原出相应的数据内容,有...

    Arthas(阿尔萨斯)是阿里巴巴开源的 Java 诊断工具.rar

    分析了代码之后,发现并没有特殊的地方,没有特殊的过滤器或者拦截器,所以初步排除是业务代码问题 分析调用流程 出现这个问题之后,首先确认了下接口的调用流程。由于是内部测试,所以调用流程较少。 Nginx-反向...

    python批量打开一个文件夹下的所有工作簿.zip

    5. 日志记录:为了方便后续的问题排查和数据分析,可以在代码中添加日志记录功能,将程序运行过程中的关键信息和异常情况记录下来,便于后期查看和分析。 总之,这个Python自动化办公源码可以帮助用户快速地批量...

    解决程序越界或栈溢出导致的死机或不正常问题排查的一个方法

    这里记录自己一个简单的问题解决的方法。 解决思路: 1,程序在经过一个操作触发后,程序会出现发送的数据发不出或者有时候还会导致死机,看coredump看不出问题,这时我们找到触发会执行的一段代码,详细看一下可能...

    制作内存镜像的工具,可以对window系统的内存制作镜像

    系统状态快照:制作系统内存镜像可以记录系统在某一时刻的完整状态,包括运行的进程、内存分配情况、网络连接等。这对于监控系统性能、备份系统状态以及进行系统恢复等工作非常有用。 软件开发和测试:在软件开发...

    基于注解的轻量级java流程跟踪工具+源代码+文档说明

    本框架项目为了解决中小型企业级java项目调用流程的性能追踪问题,提供便捷快速的调用流程追踪日志记录,同时可以记录每个调用函数的耗时。 对于采用executorServic开发的多线程程序同样可以进行追踪,能够加快排查...

    Java异常诊断greys-anatomy.zip

    基于C/S架构的任务模式甚至能让多人同时远程到同一进程上执行不同的指令、脚本,非常适合团队一起进行线上问题排查与跟踪。Greys采用纯Java编写并留有良好的扩展,如果你有需求,只要你会Java,就可以为你自己...

    MYSQL5 LOG 分析工具.rar

    插件的用户,这样可以大概排查出那些插件有代码问题。其实启用MySQL的慢查询日志很简单,只需要在MYSQL.INI 增加参数即可 log="c:/mysql_query.log" 重启mysql就可以将数据库所有操作记录下来,为了方便分析,...

    爬取各高校各专业录取分数线

    使用with open()语句:在打开文件时,使用with open()语句可以自动管理文件的打开和...建议至少打印或记录异常信息,以便排查问题。 代码结构优化:将一些功能相似的代码块提取为函数,增加代码的可读性和可维护性。

    本科毕业设计+基于SpringBoot+Vue构建的中小企业进销存管理系统

    支持结合ELK实时日志分析系统,方便日志查询,问题排查,上线检查 灵活的权限控制,可控制到页面和按钮,满足绝大部分的权限需求 可在线生成vue、controller、entity、xml、dao、service、vue、sql代码,增删改查...

    Java毕业设计-基于springboot开发的医院管理系统-毕业论文(附毕设源代码).rar

    同时,系统还提供了详细的日志记录功能,便于追踪和排查问题。 本毕业设计项目不仅是一份优秀的学术作品,更是一份具有实际应用价值的软件系统。对于有志于从事医疗信息化领域工作或对Java开发感兴趣的同学来说,这...

    abb机器人过载报错-ABB机器人常见报警代码与解决方案.pdf

    9、报警代码:39504(制动器电源过载) 39504解决⽅案:对驱动单元、制动电源、动⼒电缆、控制模块、本体线缆、编码器线缆进⾏排查,找出损坏的部件进⾏更换。 ⼴州长科⾃动化拥有熟练的维修团队,⾃备⼤量ABB机器⼈...

    C# 利用Selenium实现浏览器自动化操作的示例代码

    概述 Selenium是一款免费的分布式的自动化测试... log4net:主要用于日志的记录和存储,本例采用log4net进行日志记录,便于过程跟踪和问题排查,关于log4net的配置和介绍,之前已有说明,本文不做赘述。 Queue:队列

    16套bootstrap后台管理界面html素材

    日志和错误管理:可以记录系统的操作日志和错误日志,方便排查和解决问题。 系统设置:可以对系统的一些参数进行配置和管理,如站点设置、邮件配置等。 安全性和稳定性:后端管理系统通常需要具备一定的安全性和稳定...

    http请求 request失败自动重新尝试代码示例

    最近开发一个项目,要实现的一个场景是对于某个http请求,如果请求失败,需要再自动尝试几次,并记录异常原因便于排查 代码实现 #http连接有问题时候,自动重连 def conn_try_again(function): RETRIES = 0 #重试...

Global site tag (gtag.js) - Google Analytics