美文网首页
一次线程假死问题的分析

一次线程假死问题的分析

作者: 蓝色科学史 | 来源:发表于2019-12-11 13:23 被阅读0次

1.日志发现,服务器上项目晚上6点半运行到12点的时候线程假死,抓包,不再发送请求。

2.通过jps,jstack命令找到了卡主的位置。jstack pid > 1.log。

3.原来怀疑是句柄数超了
lsof -n|awk '{print $2}'|sort|uniq -c|sort -nr|grep pid
ulimit -n
但是转过头来想想,

4.发现也有可能是代码的问题

"configloop" #46 prio=5 os_prio=0 tid=0x00007f42c0be5000 nid=0x4d67 runnable [0x00007f4280fd2000]
   java.lang.Thread.State: RUNNABLE
        at java.net.SocketInputStream.socketRead0(Native Method)
        at java.net.SocketInputStream.read(SocketInputStream.java:150)
        at java.net.SocketInputStream.read(SocketInputStream.java:121)
        at java.io.BufferedInputStream.fill(BufferedInputStream.java:246)
        at java.io.BufferedInputStream.read1(BufferedInputStream.java:286)
        at java.io.BufferedInputStream.read(BufferedInputStream.java:345)
        - locked <0x00000000c4f0da20> (a java.io.BufferedInputStream)
        at sun.net.www.http.HttpClient.parseHTTPHeader(HttpClient.java:703)
        at sun.net.www.http.HttpClient.parseHTTP(HttpClient.java:647)
        at sun.net.www.protocol.http.HttpURLConnection.getInputStream0(HttpURLConnection.java:1534)
        - locked <0x00000000c4f0da60> (a sun.net.www.protocol.http.HttpURLConnection)
        at sun.net.www.protocol.http.HttpURLConnection.getInputStream(HttpURLConnection.java:1439)
        - locked <0x00000000c4f0da60> (a sun.net.www.protocol.http.HttpURLConnection)
        at java.net.HttpURLConnection.getResponseCode(HttpURLConnection.java:480)
        at org.springframework.http.client.SimpleClientHttpResponse.getRawStatusCode(SimpleClientHttpResponse.java:55)
        at org.springframework.web.client.DefaultResponseErrorHandler.hasError(DefaultResponseErrorHandler.java:55)
        at org.springframework.web.client.RestTemplate.handleResponse(RestTemplate.java:766)
        at org.springframework.web.client.RestTemplate.doExecute(RestTemplate.java:736)
        at org.springframework.web.client.RestTemplate.execute(RestTemplate.java:670)
        at org.springframework.web.client.RestTemplate.exchange(RestTemplate.java:579)
        at com.yibo.lanwork.ContainerHelper.sendPostRequest(ContainerHelper.java:248)
        at com.yibo.lanwork.ContainerHelper.lambda$startConfigTread$0(ContainerHelper.java:150)
        at com.yibo.lanwork.ContainerHelper$$Lambda$391/461160828.run(Unknown Source)
        at java.lang.Thread.run(Thread.java:745)

难道是spring中restTemplate使用的问题吗,又踩了一个http客户端的坑吗?百度搜索了一下 “resttemplate线程locked”,发现restTemplate使用中遇到问题的大有人在。restTemplate是使用的阻塞方式发送的http请求,这样做可能会阻塞线程。

https://www.cnblogs.com/otways/p/11411652.html

没想到小小的http客户端,在项目使用当中会出现这么多的问题,go语言中很多http客户端库有内存泄露的问题,最后选用了fasthttp解决的问题。今天用okhttp3试一下吧。通过jstack并没有发现死锁的问题,也没有打印异常,极大的概率是read超时时间为无限长了,比如下面讲到的。

https://blog.csdn.net/weixin_33749242/article/details/89590199

这篇文章写的非常的好,如果想要写一个稳定的服务,那么使用Hystrix库可以增强系统的可靠性。新的东西不一定可靠,比如这次使用restTemplate。后面服务的稳定性可以通过使用熔断机制来加强,这篇博客就讲的很好。

https://www.cnblogs.com/crazymakercircle/p/11664812.html

由于线上的问题要快速解决,那么就用apache的httpclient或者okhttp来实现以下,测试看看是否正常。

对okhttp3的封装,记得做iOS的时候,afnetworking是用起来非常爽的。okhttp与afnetworking非常的像。

相关文章

  • 一次线程假死问题的分析

    1.日志发现,服务器上项目晚上6点半运行到12点的时候线程假死,抓包,不再发送请求。 2.通过jps,jstack...

  • 工作线程假死问题分析

    周末上线新版本,上线后,app登录不了,htop一遍,发现用户服务cpu200%,top -H -p一看,发现处理...

  • WPF 多线程解决假死问题

    xmal 代码 后台代码: 参考;1 WPF防止界面卡死并显示加载中效果2 BackgroundWorker原理剖析

  • 分析日志线程阻塞导致项目假死

    本例分析中所用的工具为jvisualvm(以下简称工具),在打开工具之前需要先启动fmm项目。本次排查问题的方式主...

  • 一次线上问题排查所引发的思考

    source: java葵花宝典问题: 线程执行一个任务迟迟没有返回,应用假死。 接口响应缓慢,甚至请求超时。 C...

  • C#:教你进度条的核心代码

    说明:利用多线程显示进度,防止主线程假死,子线程实时向主线程报告进度状况,主线程可提前结束子线程。看懂下面的代码你...

  • Android线程状态

    经常在分析 ANR 问题的时候,需要对线程状态了解得比较清楚,才能进一步分析问题。 线程状态 java 的线程状态...

  • 分析一个常见的java多线程通信问题(假死现象)

    一件复杂的事,一个人如果不能做,两个人又做的不好,一群人就可能很好的解决了。对于线程来说也是,通过多个线程就能完成...

  • Elastic-job 启动“假死”的问题分析

    问题记录 最近项目引入Elastic Job实现定时任务的分布式调度。引入的版本2.1.5,加入相关的job配置后...

  • iOS 崩溃监控

    我们分析崩溃日志时最先看的是异常信息,分析出问题的是哪个线程,在线程回溯里找到那个线程;然后,分析方法调用栈,符号...

网友评论

      本文标题:一次线程假死问题的分析

      本文链接:https://www.haomeiwen.com/subject/klkogctx.html