一次线程假死问题的分析

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非常的像。

你可能感兴趣的:(一次线程假死问题的分析)