热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

困扰好久的生产httpclient调用偶现socketTimeout异常

系统背景:生产2台服务器,调用量高峰时期差不多15到20次每秒,每天差不多有50--80次的调用超时。之前也一直没有在意。后来观察日志发现,异常总是连续几次的出现,不是一次一次的,这个现象引

 

系统背景:

生产2台服务器,调用量高峰时期差不多15到20次每秒,每天差不多有50--80次的调用超时。之前也一直没有在意。后来观察日志发现,异常总是连续几次的出现,不是一次一次的,这个现象引起了我的注意。

 

后来因为一次优化需求,后台我将请求调用方式改为了线程池的异步调用:

 

private static ExecutorService threadPool = Executors.newCachedThreadPool();

 

主线程要等线程池任务运行完返回结果集,才可以继续运行,future来获取多线程返回结果,每个线程中的任务包含一个http请求调用,上线后,接口速度因为异步处理,所以提高了50ms左右,还算比较乐观,这样线程正常运行了一段时间,超时还是有,这个问题没有解决,因为没有定位出原因。

生产故障

某天晚上,服务调用方晚上搞活动,调用量增加了原先的2到3倍,晚上内存出现告警80%以上,运维人员查看内存使用情况,swap区域已经使用了60%以上。这下肯定是内存满了,晚上紧急情况,重启了应用,暂时恢复了正常。正确的流程应该是先下个dump文件,再重启的应用的。

 

第二天一早过来查问题,看系统运行情况,首先看jvm内存情况。

jstat -gcutil 25444 1000 20

 

发现比较异常的几个参数,Old区有将近90%左右,s0 和s1两者每次回收都有存留的值,正常应该一个是0的,最最要命的是FGCT几十次,正常情况下,只要JVM内存参数设置合理,是不会有这么多的FGC的,于是问了运维人员,他们配置的是默认配置(非专业运维人员…尴尬)于是乎我们开始调整jvm运行参数

-xms 初始堆大小    调整为512M

-xmx 最大堆大小    调整为2048M

-XX:PermSize 设置持久代的最大值  调整为256M    -----这个调整对FGCT的参数影响很大,说明之前FGCT次数过多和持久代内存不足有很大关系,推算系统static的代码区比较大

 

其他设置没做太大改动

 

修改之后,FGCT直线下降,次数很小,S0和S1运行正常,O区 0% 增长十分缓慢,观察一段时间后,各个区域运行正常。

 

好了,最最关键的来了,JVM调整参数之后,查看了一整天的日志,尽然没有一次SocketTimtOut

 

原因分析: 当系统FGC的时候系统会stop the world,所以在这段时间内,会出现短暂的连续的超时。


推荐阅读
  • 利用Executor框架管理线程池
    本文介绍了如何使用Executor框架来管理和创建线程池,包括不同的线程池类型及其应用场景,以及如何通过Executors工厂类创建不同类型的Executor实例。 ... [详细]
  • 本文主要解决了在编译CM10.2时出现的关于Samsung Exynos 4 HDMI HAL库中SecHdmiV4L2Utils.cpp文件的编译错误。 ... [详细]
  • 本文探讨了Java中有效停止线程的多种方法,包括使用标志位、中断机制及处理阻塞I/O操作等,旨在帮助开发者避免使用已废弃的危险方法,确保线程安全和程序稳定性。 ... [详细]
  • 解决宝塔面板Nginx反向代理缓存问题
    本文介绍如何在宝塔控制面板中通过编辑Nginx配置文件来解决反向代理中的缓存问题,确保每次请求都能从服务器获取最新的数据。 ... [详细]
  • 本文介绍了进程的基本概念及其在操作系统中的重要性,探讨了进程与程序的区别,以及如何通过多进程实现并发和并行。文章还详细讲解了Python中的multiprocessing模块,包括Process类的使用方法、进程间的同步与异步调用、阻塞与非阻塞操作,并通过实例演示了进程池的应用。 ... [详细]
  • 本文介绍了SIP(Session Initiation Protocol,会话发起协议)的基本概念、功能、消息格式及其实现机制。SIP是一种在IP网络上用于建立、管理和终止多媒体通信会话的应用层协议。 ... [详细]
  • 本文详细介绍了在Windows系统中如何配置Nginx以实现高效的缓存加速功能,包括关键的配置文件设置和示例代码。 ... [详细]
  • Web动态服务器Python基本实现
    Web动态服务器Python基本实现 ... [详细]
  • 如何使用.NET CORE HttpClient
    小编这次要给大家分享的是如何使用.NETCOREHttpClient,文章内容丰富,感兴趣的小伙伴可以来了解一下,希望大家阅读完这篇文章之后能够有所收获。前 ... [详细]
  • 在Java领域,谈到网络编程,可能大家脑海里第一反应就是MINA,NETTY,GRIZZLY等优秀的开源框架。没错,不过在深入探究这些框架之前,我们需要先从最original的技 ... [详细]
  • 今天就跟大家聊聊有关HttpComponents中如何使用HttpClient连接池,可能很多人都不太了解,为了让大家更加了解,小编给大家总结了以下内容,希望大 ... [详细]
  • Eclipse利用HttpClient 写post和get连接到后台
    文件目录如下:第一个包代码如下:packagecn.itcast.login;importcn.itcast.login.service.DataService;importandroid.ap ... [详细]
  • Httpclient.setHttpRequestRetryHandler(requestRetryHandler);***设置重连机制和异常自动恢复处理*privatestaticHt ... [详细]
  • 轻松把玩HttpClient之封装HttpClient工具类(八),优化启用Http连接池策略
    写了HttpClient工具类后,有人一直在问我怎么启用http连接池,其实我没考虑过这个问题。不过闲暇的时候,突然间想起了这个问题,就想把这个问题搞一搞。 ... [详细]
  • 本文详细介绍了Java中的泛型概念及其在类、接口和方法中的应用。泛型是自JDK 1.5以来引入的一项重要特性,旨在增强代码的灵活性和安全性。 ... [详细]
author-avatar
鱼和鱼还有鱼3_Mh_qet
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有