2020-10-08

2024-02-29  本文已影响0人  李炳龙_搜狐

史诗级java低时延调优案例1

-- 西门幽月

序章

生产环境调优往往是一件复杂又痛苦的事,互联网公司尤其严重,主要表现在

近期作者刚好遇到了一个问题,由于排查此问题涉及

hystrix,链路追踪,分布式服务日志搜索,http,gc,thread pool,c3p0 connection pool,jdbc驱动,netty nio,cache,finalizer,Memory Aanlysis Tool,jvisualvm,yourkit

等诸多技术和工具,个人认为是一个非常好的复杂问题排查的示例。

作者并非意图借此文传达问题的解决方案。而是希望引领读者能探索出自己解决问题的思路,因此正文将采用问答式行文。

另外,本文也指出了国内技术网站上某些非常常见的错误结论,由于cv大法(copy and paste)盛行的原因,那些错误流传甚广。任何从事高并发编程的工程师都应该避免那些常见错误。

本文的相关链接和未出现在文中但在排查问题过程中参考的文章都会在文末给出,方便读者后续研读

第一章 源于告警

最近收到告警显示,某接口偶尔有超时情况,该接口调用链路复杂,从日志作为出发点去分析有种无从着力之感,好在最近刚部署了skywalking,通过可视化页面可看到调用链路的耗时情况。

skywalking是Apache下的链路追踪工具

[图片上传失败...(image-2d361f-1602167711919)]

上图左方是接口名,右方横线表示执行开始至结束的时间。

从上图可以一目了然的看出,a接口超时,是因为调用b接口引起。接下来通过traceId分析日志,当时的情况是,ab项目都接入了skywalking,但是b项目没有打印traceId;b项目是分布式部署的,但没有使用elk收集日志。

感悟:

日志是最重要的技术之一,先把日志系统做好,才能避免996

第二章 心不唤物物不至,问题终于浮出水面

请求方使用的是Apache httpClient库,处理方使用公司自研框架,底层使用netty处理http协议。

因此问题转换为:

由于没有足够的信息分析上述情况,因此暂时放弃从此方向探索。

更深入的思考: 也可以查看skywalking源码,确认hystrix和httpclient记录起始时间。

使用grep "xxxx-xx-xx xx:xx:xx" full.log > simple.log命令导出临近时间的日志。由于作者只关注超时请求的日志,因此花费了大量时间却什么都没有发现。直到作者想查看b执行任务之前发生了什么的时候,意外发现,有将近4s的时间没有打印任何日志,这和图中超时时间吻合。该服务24小时都有大量流量,不应该出现这种情况,除非发生了gc,也就是stop the world。

<pre spellcheck="false" class="md-fences md-end-block ty-contain-cm modeLoaded" lang="" cid="n55" mdtype="fences" style="box-sizing: border-box; overflow: visible; font-family: var(--monospace); font-size: 0.9em; display: block; break-inside: avoid; text-align: left; white-space: normal; background-image: inherit; background-size: inherit; background-attachment: inherit; background-origin: inherit; background-clip: inherit; background-color: rgb(248, 248, 248); position: relative !important; border: 1px solid rgb(231, 234, 237); border-top-left-radius: 3px; border-top-right-radius: 3px; border-bottom-right-radius: 3px; border-bottom-left-radius: 3px; padding: 8px 4px 6px; margin-bottom: 15px; margin-top: 15px; width: inherit; background-position: inherit inherit; background-repeat: inherit inherit;">1074370.765: [GC (CMS Final Remark) [YG occupancy: 1161721 K (2831168 K)]1074370.765: [Rescan (parallel) , 0.0282716 secs]1074370.793: [weak refs processing, 3.9080203 secs]1074374.701: [class unloading, 0.0895909 secs]1074374.791: [scrub symbol table, 0.0193149 secs]1074374.810: [scrub string table, 0.0073974 secs][1 CMS-remark: 4456982K(5242880K)] 5618704K(8074048K), 4.0599904 secs] [Times: user=3.06 sys=1.86, real=4.06 secs]</pre>

第三章 问题已经解决?

感悟:

问题总是偶然发现的,但它似乎听到了你的呼唤。

上一篇 下一篇

猜你喜欢

热点阅读