论坛
潜水/灌水快乐,沉淀知识,认识更多同行。
ToB圈子
加入IT圈,遇到更多同好之人。
朋友圈
看朋友圈动态,了解ToB世界。
ToB门户
了解全球最新的ToB事件
博客
Blog
排行榜
Ranklist
文库
业界最专业的IT文库,上传资料也可以赚钱
下载
分享
Share
导读
Guide
相册
Album
记录
Doing
应用中心
搜索
本版
文章
帖子
ToB圈子
用户
免费入驻
产品入驻
解决方案入驻
公司入驻
案例入驻
登录
·
注册
账号登录
立即注册
找回密码
用户名
Email
自动登录
找回密码
密码
登录
立即注册
首页
找靠谱产品
找解决方案
找靠谱公司
找案例
找对的人
专家智库
悬赏任务
圈子
SAAS
qidao123.com技术社区-IT企服评测·应用市场
»
论坛
›
软件与程序人生
›
前端开发
›
Spring Boot Web 应用哀求响应太慢故障排查
Spring Boot Web 应用哀求响应太慢故障排查
没腿的鸟
论坛元老
|
2024-10-22 16:33:18
|
显示全部楼层
|
阅读模式
楼主
主题
1977
|
帖子
1977
|
积分
5931
马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。
您需要
登录
才可以下载或查看,没有账号?
立即注册
x
Spring Boot Web 应用哀求响应太慢排查
线上接口响应太慢,Spring Boot + 内嵌的 Tomcat 服务器,Tomcat 处理处罚哀求的最大线程数普通情况是 150 左右,最大是 200,以是当同时处理处罚的哀求过多,而且每个哀求不停没有处理处罚完成。全部的线程都在繁忙,没有办法处理处罚新的哀求,就会导致新的哀求排队等候处理处罚,从而造成了迟迟无法响应的线上变乱,用户体验太差。
场景复现
一个简单的 controller 接口
@RestController
public class SpringBootController {
@GetMapping("/")
public String index() throws InterruptedException {
// 每个线程都睡眠,模拟业务接口响应慢的问题
Thread.sleep(60 * 30 * 1000);
System.out.println("current thread: " + Thread.currentThread().getName());
return "Hello Spring Boot!";
}
}
复制代码
随后设置 tomcat 服务器的最大线程为 5 :
server:
port: 8080
tomcat:
threads:
max: 5
spring:
application:
name: simple-application
复制代码
测试
之后我们在单元测试中模拟 10 个线程对接口发起哀求
public class RequestTest {
public static void main(String[] args) {
for (int i = 0; i < 10; i++) {
new Thread(new RequestTask()).start();
}
}
private static class RequestTask implements Runnable {
@Override
public void run() {
try {
URL url = new URL("http://localhost:8080/");
HttpURLConnection connection = (HttpURLConnection) url.openConnection();
connection.setRequestMethod("GET");
int responseCode = connection.getResponseCode();
System.out.println("Response Code: " + responseCode);
}
catch (IOException e) {
e.printStackTrace();
}
}
}
}
复制代码
首先,我们解释掉 controller 中的就寝代码,运行测试得到以下的输出:
spring boot web 应用响应输出:
2024-08-01T15:56:25.369+08:00 INFO 7304 --- [simple-application] [nio-8080-exec-2] o.s.web.servlet.DispatcherServlet : Completed initialization in 0 ms
current thread: http-nio-8080-exec-4
current thread: http-nio-8080-exec-5
current thread: http-nio-8080-exec-1
current thread: http-nio-8080-exec-2
current thread: http-nio-8080-exec-3
current thread: http-nio-8080-exec-5
current thread: http-nio-8080-exec-2
current thread: http-nio-8080-exec-4
current thread: http-nio-8080-exec-1
current thread: http-nio-8080-exec-3
测试输出:
Response Code: 200
Response Code: 200
Response Code: 200
Response Code: 200
Response Code: 200
Response Code: 200
Response Code: 200
Response Code: 200
Response Code: 200
Response Code: 200
复制代码
我们看到线程在响应输出。接下来,打开解释代码,模拟变乱现场。将会在控制台看不到任何输出,测试方法也会卡住不动。
排查
我们利用 JVM 的一些命令来举行排查:
# 首先查看 java 的进程 id
C:\Users\Administrator>jps -l
18400 indi.yuluo.tomcat.SpringBootApplication
10324 jdk.jcmd/sun.tools.jps.Jps
16872 org.jetbrains.jps.cmdline.Launcher
18072 org.jetbrains.idea.maven.server.RemoteMavenServer36
9624
7372 inid.yuluo.tomcat.RequestTest
复制代码
我们看到 SpringBootApplication 和 RequestTest 在运行,之后利用 jstack 命令生成线程快照,并保存为文件。
C:\Users\Administrator>jstack 18400 > C:\Users\Administrator\Desktop\spring-boot-thread_dump.txt
复制代码
打开线程快照文件,搜索 http-nio 就能看到 Tomcat 的哀求处理处罚线程,全部的哀求处理处罚线程状态都是 TIMED_WAITING ,表示线程正在等候另一个线程实行特定的动作,但是有一个指定的等候时间。而且能直接看到哀求是壅闭在了哪个代码位置。
"http-nio-8080-exec-2" #28 daemon prio=5 os_prio=0 cpu=0.00ms elapsed=187.14s tid=0x0000015ffe6089f0 nid=0x1ee4 waiting on condition [0x00000026eb5fc000]
# `TIMED_WAITING`
java.lang.Thread.State: TIMED_WAITING (sleeping)
at java.lang.Thread.sleep(java.base@17.0.1/Native Method)
# 阻塞位置:
at indi.yuluo.tomcat.controller.SpringBootController.index(SpringBootController.java:18)
复制代码
解决方案
适当修改 Tomcat 的最大线程数,可以增加并发哀求的处理处罚能力。
适当调大 Tomcat 的最小空闲线程数,可以确保在并发高峰时刻,Tomcat 能敏捷响应新的哀求,而不需要重新创建线程。
修改值需要对用户体量做出预估之后,举行测试之后确定。
免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!更多信息从访问主页:qidao123.com:ToB企服之家,中国第一个企服评测及商务社交产业平台。
回复
使用道具
举报
0 个回复
倒序浏览
返回列表
快速回复
高级模式
B
Color
Image
Link
Quote
Code
Smilies
您需要登录后才可以回帖
登录
or
立即注册
本版积分规则
发表回复
回帖并转播
回帖后跳转到最后一页
发新帖
回复
没腿的鸟
论坛元老
这个人很懒什么都没写!
楼主热帖
CVE-2022-23131 Zabbix SAML SSO认证绕 ...
iOS全埋点解决方案-采集崩溃 ...
【ollama】Linux下更改ollama模型下载 ...
同一个网络下两台设备看直播时,进度不 ...
【密码管理器】上海道宁为您提供存储和 ...
java代码审计-XSS
iOS 苹果集成登录及苹果图标的制作要求 ...
北斗授时产品(GPS北斗授时设备)加NTP ...
Redis事务
Doris(七) -- 修改表、动态和临时分区 ...
标签云
渠道
国产数据库
集成商
AI
运维
CIO
存储
服务器
浏览过的版块
Java
linux
快速回复
返回顶部
返回列表