SSL Session默认设置导致线程阻塞了几十秒的案例分析

本文涉及的产品
服务治理 MSE Sentinel/OpenSergo,Agent数量 不受限
可观测可视化 Grafana 版,10个用户账号 1个月
简介: SSL Session默认设置导致线程阻塞了几十秒的案例分析

问题描述

几年前在做某学习APP的时候,评论服务(comment)访问评论后端服务(comment-server)正常RT在【几毫秒 ~ 几十毫秒】,偶尔(每隔几天)RT达到几十秒甚至几分钟,造成用户看不到评论列表,发表评论失败等不好的体验。

分析过程

系统交互关系

  • 网关与comment之间通讯协议是LWP(LaiWang Protocol)
  • comment与SLB之间通讯协议是https

comment调用comment-server超时?

在应用调用依赖服务的时候,会记录下【时间戳,依赖类别,调用的接口,响应时间,状态码】等指标信息。

通过监控及日志信息,出现问题的时候与SLB交互的RT是【452秒】,初步定位是【SLB】或【comment-server】处理慢导致的,所以联系了运维同学、负责【comment-server】的同学一起排查。

与SLB交互耗时

其中request_time:0.004秒,upstream_response_time:0.004秒

comment-server处理耗时

处理耗时【4毫秒】,看来锅是自己的😳。

Review代码

应用访问SLB使用的是Apache HttpClient,代码抽象表达如下:

这个代码哪里似乎有问题?

GC导致的阻塞?

通过查看GC Log,发现CMS GC耗时较长,与超时的时间点是能够对应上的,终于发现了线索。

发生CMS GC的时候,线程都在忙些什么呢?这时候LWP框架的线程dump起到了关键作用,下面对LWP简单做下介绍。

线程模型

LWP是一个RPC框架,网络通讯框架使用的是netty。

业务线程池

线程池初始化

拒绝策略

在线程blocked的时候,LWP框架打印出了当时的线程栈信息,发现所有业务线程都阻塞在了SSL交互过程中。

问题根因

SSLSessionContext’s ssl session缓存(which is a SoftReference cache) 超时时间默认是86400s (24小时),ssl session缓存大小默认是没有限制的,导致CMS GC处理SoftReference的时候耗时较长导致的。

算是JDK的一个Bug,如下:

解决办法

设置SSLContext实例的sessionCacheSize、sessionTimeout,示例:

sslContext.getClientSessionContext().setSessionCacheSize(1024);
sslContext.getClientSessionContext().setSessionTimeout(60);

不仅https,对于使用SSL通讯的应用同样需要注意上面的问题。

参考资料

相关实践学习
部署高可用架构
本场景主要介绍如何使用云服务器ECS、负载均衡SLB、云数据库RDS和数据传输服务产品来部署多可用区高可用架构。
负载均衡入门与产品使用指南
负载均衡(Server Load Balancer)是对多台云服务器进行流量分发的负载均衡服务,可以通过流量分发扩展应用系统对外的服务能力,通过消除单点故障提升应用系统的可用性。 本课程主要介绍负载均衡的相关技术以及阿里云负载均衡产品的使用方法。
目录
相关文章
|
2月前
多线程案例-定时器(附完整代码)
多线程案例-定时器(附完整代码)
241 0
|
2月前
|
Python
Python学习之路 02 之分支结构
Python学习之路 02 之分支结构
446 0
Python学习之路 02 之分支结构
|
2月前
|
Java Python 开发者
Python 学习之路 01基础入门---【Python安装,Python程序基本组成】
线程池详解与异步任务编排使用案例-xian-cheng-chi-xiang-jie-yu-yi-bu-ren-wu-bian-pai-shi-yong-an-li
449 2
Python 学习之路 01基础入门---【Python安装,Python程序基本组成】
|
2月前
|
消息中间件 Linux 调度
【Linux 进程/线程状态 】深入理解Linux C++中的进程/线程状态:阻塞,休眠,僵死
【Linux 进程/线程状态 】深入理解Linux C++中的进程/线程状态:阻塞,休眠,僵死
73 0
|
6天前
|
SQL Dubbo Java
案例分析|线程池相关故障梳理&总结
本文作者梳理和分享了线程池类的故障,分别从故障视角和技术视角两个角度来分析总结,故障视角可以看到现象和教训,而技术视角可以透过现象看到本质更进一步可以看看如何避免。
83729 0
|
7天前
|
监控
写一个线程来监控各线程是否发生阻塞
写一个线程来监控各线程是否发生阻塞
18 0
|
2月前
|
设计模式 安全 C++
【C++ const 函数 的使用】C++ 中 const 成员函数与线程安全性:原理、案例与最佳实践
【C++ const 函数 的使用】C++ 中 const 成员函数与线程安全性:原理、案例与最佳实践
238 2
|
2月前
|
安全 Java 程序员
多线程案例-线程池
多线程案例-线程池
125 0
|
2月前
|
消息中间件 安全 Java
多线程案例-阻塞队列
多线程案例-阻塞队列
174 0
|
2月前
|
设计模式 安全 Java
多线程案例-单例模式
多线程案例-单例模式
245 0