线程夯死的排查及解决

这篇具有很好参考价值的文章主要介绍了线程夯死的排查及解决。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

最近做的业务一直是和第三方交互的业务,为了加快速度,基本上都是采用多线程,然而时不时总是发生一些推送任务莫名的卡死,知道前几天的一次发现,让我开始了线程的排查之路,希望对大家的有一定的启发和借鉴

一:分布式锁导致的线程夯死

问题的发生是小伙伴突然和我说线上的数据推送任务不推送了,于是我基于对自己的代码信任,觉得不可能,(其实以前也发生过这样的问题,大多是代码中涉及的redis队列超时导致,不过我已经优化了一个版本,觉得不可能还有这样的问题,这时候小伙伴说重启吧,但是我想了想之前也遇到过这种灵异现象,这一次上头了,感觉事情没那么简单,于是我开始了排查之路

1.发现线程夯死

日志系统显示下午的15:30,google的推送线程(gg_push_47)捞取了数据打了日志就卡住了,初步怀疑线程夯死
线程夯死的排查及解决

2.确认线程夯死

于是根据ip找到了具体的pod,以及里面的自主排障里的Arthas控制台,查询到了线程处于TIMED_WAITING,注意我配图的Arthas线程已经不是当时的线程了(gg_push_47),因为当时忘记截图了,所以随手找了一个,用来代表线程当时的状态

线程夯死的排查及解决线程夯死的排查及解决
线程夯死的排查及解决

3.排查夯死原因

问题已经定位到了,于是找到了运维打了jstack日志(因为我没服务器权限。。。)可以看到gg_push_47夯死在了jedis的一个lock操作上面,而最后一次业务当法则是getToken
线程夯死的排查及解决
getToken中恰好也存在利用公司架构封装的redis使用的分布式锁,于是我们看看.getToken操作redis
到底做了啥

线程夯死的排查及解决

到这里其实原因就很清晰了,lock这个方法设置的锁,锁持有超时和锁等待时间都是-1,也就是永久
那么假设A线程调用 getToken但是由于释放锁的时候出现了redis超时的问题,也就是finally这段代码异常了,那么A线程由于锁永远持有,所以B线程(gg_push_47)由于设置的锁等待时间是-1,那么B线程虽然获取不到锁,但是也会永远等待,导致了线程的夯死

4.结论

分布式锁一定要设置锁超时和锁等待时间,如果不确定时间的值,那么可采用看门狗机制,我这里是维护之前的代码,没办法。。都是坑啊

二:网络请求不设置超时时间导致的线程夯死

问题的发生是小伙伴又和我说线上的数据推送任务不推送了,不过这次从google换成了facebook,tm的分布式锁搞定了啊,而且facebook没用分布式锁,设置任何JUC到LOCK都没,怎么可能会被夯死呢,这时候小伙伴又说重启吧,但是我又一次上头了,于是再次踏上排查之路。。。

1.确认线程夯死

有了上次的经验我直接拿到了停止推送的线程,发现不同于上次的等待这次一直处于runnable状态
线程夯死的排查及解决

线程夯死的排查及解决

2.排查夯死原因

于是又找到了运维打了jstack日志(运维累了。。。)可以看到fb_push_44夯死在fb的网络请求中线程夯死的排查及解决
绿色的是我的最后一次交互业务代码,红色的为facebook-sdk封装的网络请求的api,可以发现问题出现在读取respose,初步怀疑是没有设置超时时间,于是我看了一下源码发现真的没有设置超时时间

1.发现连接对象是HttpsURLConnection,set方法并为设置任何超时时间参数,去看看具体的的属性有无默认值
线程夯死的排查及解决
2.发现JDK提供的HttpsURLConnection初始化时间都是0,即永不超时,而SDK中也为设置,所以也就导致了线程夯死
线程夯死的排查及解决

3.结论

任务网络请求,一定要设置超时时间,否则就是坑啊。。。文章来源地址https://www.toymoban.com/news/detail-415813.html

到了这里,关于线程夯死的排查及解决的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • oracle服务器的CPU占用率一直100%排查方式

    公司开发、测试、演示环境,三个环境的oracle服务器无论服务器是否空闲, CPU的占用率一直是100%, 一直也没有找到问题原因,今天就花了一整天时间研究这个问题。 awr报告是oracle 10g下提供的一种性能收集和分析工具,它能提供一个时间段内整个系统资源使用情况的报告,

    2024年02月14日
    浏览(42)
  • 软件测试面试题:压测时,QPS一直上不去,如何排查?

    在进行系统压测时,QPS(Queries Per Second)即每秒查询数,无法达到预期值是一个常见的问题,本文就来介绍下QPS一直上不去时应该如何排查。 同时,我也为大家准备了一份软件测试视频教程(含面试、接口、自动化、性能测试等),就在下方,需要的可以直接去观看,也可以

    2024年02月10日
    浏览(43)
  • k8s pod一直处于pending状态一般有哪些情况,怎么排查?

    一个pod一开始创建的时候,它本身就是会处于pending状态,这时可能是正在拉取镜像,正在创建容器的过程。 如果等了一会发现pod一直处于pending状态, 那么我们可以使用kubectl describe命令查看一下pod的Events详细信息。一般可能会有这么几种情况导致pod一直处于pending状态: 1、

    2024年01月17日
    浏览(53)
  • 执行Lua脚本后一直查询不到Redis中的数据(附带问题详细排查过程,一波三折)

    这个问题坑惨我了,估计耗费了我两个小时😫,中间走了不少弯路,好在我灵光一闪+GPT给我的灵感否则就栽在这上面了 问题背景 在使用 Redis 实现接口调用次数扣减操作时,发现响应结果一直返回的是 -1,也就是查询不到数据 问题排查过程1 : 经过一段排查,加上GPT的提示

    2024年02月13日
    浏览(48)
  • 单片机卡死的几大原因、分析、解决

    阅读引言: 本文我想给大家分享一下我在学习过程中遇到的以及了解到的一些导致单片机运行卡死(死锁)的一些常见原因和解决办法, 请注意, 只是列举,并不是全部, 因为导致单片机运行卡死的原因无穷无尽。 目录 一、裸机层面 1.死循环, 条件一直成立 2.中断问题

    2024年03月28日
    浏览(58)
  • 单片机卡死的八大原因和解决方法

    在微控制器上,程序卡住(即停止执行)可能有多种原因。下面我将列举一些常见的原因,并提供一些可能导致程序卡住的示例情况。请注意,这里只是一些示例,并不能穷尽所有可能的情况。 1. 死循环(Infinite Loop):在程序中存在无法跳出的循环结构,导致程序无法继续

    2024年02月15日
    浏览(78)
  • 从业务层的代码出发,去排查通用框架代码崩溃的问题

    目录 1、问题说明 1.1、Release下崩溃,Debug下很难复现 1.2、用Windbg打开d

    2024年02月11日
    浏览(38)
  • 【问题排查篇】一次业务问题对 ES 的 cardinality 原理探究

    作者:京东科技 王长春 小编工作中负责业务的一个服务端系统,使用了 Elasticsearch 服务做数据存储,业务运营人员反馈,用户在使用该产品时发现, 用户后台统计的订单笔数和导出的订单笔数不一致 ! 交易订单笔数不对,出现差错订单了?这一听极为震撼!出现这样的问

    2024年02月03日
    浏览(38)
  • 没有禁用硬件图形加速的情况下解决visio卡死的问题

    这两天在使用visio的时候,总是会发生死机问题。出现问题的特点如下: 在使用鼠标滚轮进行缩放时,一定会发生卡死 打开任务管理器,发现CPU和内存占用率全满 电脑的其他界面无法操作,前台应用全部卡死 主要的解决办法是关闭visio的硬件图形加速功能,其位置在: vis

    2024年02月06日
    浏览(92)
  • 解决虚拟机VMware一段时间不动,就卡死的问题

    虚拟机总是一段时间不移动鼠标,就会无响应,每次都要重启两次才能继续维持一段时间,我一开始以为是内存和处理器或者硬盘太小的问题,但是我调大了之后还是一样,下面是我分配的虚拟机性能  针对虚拟机卡死,列出以下改善性能的方式,大家可以尝试一下: 因为虚

    2024年02月06日
    浏览(95)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包