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

一次线程假死问题的分析

作者: 蓝色科学史 | 来源:发表于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非常的像。

    相关文章

      网友评论

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

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