排查和解决线程池瓶颈问题案例

news/2025/2/27 11:08:28

在分布式系统中,线程池的使用非常普遍,尤其是在处理异步任务时。然而,线程池的配置不当可能会导致性能瓶颈,进而影响系统的整体性能。本文将分享一个实际案例,介绍如何通过日志分析和线程池优化来解决系统中的性能瓶颈问题。

问题背景

在我们的系统中,有一个基于Spring的事件监听机制,用于处理长连接消息的回调。事件监听器RawMessageEventListener通过onApplicationEvent方法处理事件。默认情况下,onApplicationEvent是同步执行的,但为了提升性能,我们使用了@Async注解将其改为异步执行。异步任务默认使用threadPoolTaskScheduler线程池。

在某天的10点左右,我们注意到系统的响应速度变慢,通过日志分析发现,threadPoolTaskScheduler线程池的处理能力成为了瓶颈。

问题排查

日志分析

首先,我们通过以下命令对日志进行分析:

tail -10000000 info-2025-02-23.log | grep '2025-02-23 10:' | grep 'threadPoolTaskScheduler' | awk '{print $4}' | sort | uniq -c

输出结果如下:

46586 [threadPoolTaskScheduler-1]

从日志中可以看到,在10点这个时间段内,threadPoolTaskScheduler线程池处理了4万多条日志,但只有一个线程在工作。这表明线程池的默认配置可能不足以应对高并发场景。

代码分析

我们进一步查看了事件监听器的代码:

java">@Async
public void onApplicationEvent(RawMessageEvent event) {
    // 处理事件逻辑
    ThreadPoolManager.getInstance().execute(() -> robotCallBackService.callBack(socketId, request, url));
}

@Async注解默认使用threadPoolTaskScheduler线程池,而该线程池的默认线程数为1。这意味着所有异步任务都会排队等待执行,导致任务积压,进而影响系统性能。

解决方案

增加线程池线程数

为了解决这个问题,我们决定自定义threadPoolTaskScheduler的配置,增加线程池的线程数。我们创建了一个配置类,设置了10个线程:

java">@Configuration
public class SchedulerConfig {

    @Bean
    public ThreadPoolTaskScheduler threadPoolTaskScheduler() {
        ThreadPoolTaskScheduler scheduler = new ThreadPoolTaskScheduler();
        scheduler.setPoolSize(10);
        scheduler.setThreadNamePrefix("CustomTaskScheduler-");
        return scheduler;
    }
}

通过这个配置,我们为threadPoolTaskScheduler线程池设置了10个线程,从而提升了并发处理能力。

验证效果

在应用了新的线程池配置后,我们再次观察系统的日志和性能。发现threadPoolTaskScheduler线程池能够同时处理多个任务,系统的响应速度明显提升,任务积压的问题得到了有效缓解。

结论

通过这次排查和优化,我们认识到线程池的配置对系统性能有着重要影响。在高并发场景下,默认的线程池配置可能无法满足需求,因此需要根据实际情况进行调整。通过自定义线程池配置,我们成功解决了系统中的性能瓶颈问题。

关键点总结

  1. 日志分析:通过日志分析发现线程池的瓶颈。
  2. 代码审查:确认@Async注解默认使用的线程池配置。
  3. 自定义线程池:通过自定义配置增加线程池的线程数,提升并发处理能力。
  4. 验证效果:通过日志和性能监控验证优化效果。

希望这个案例能够帮助大家在遇到类似问题时,快速定位并解决问题。如果你有类似的经验或其他优化方案,欢迎在评论区分享!


http://www.niftyadmin.cn/n/5870012.html

相关文章

跟着 Lua 5.1 官方参考文档学习 Lua (9)

文章目录 5 – Standard Libraries5.1 – Basic Functions错误处理error (message [, level])例子:error 函数的使用例子:error 函数 level 参数例子:使用 pcall 函数捕获错误 assert (v [, message])例子:assert 函数的使用 chun…

电脑键盘知识

1、键盘四大功能区 1. 功能区 2. 主要信息输入区 3. 编辑区 4. 数字键盘区 笔记本电脑键盘的功能区,使用前需先按Fn键 1.1、功能区 ESC:退出 F1:显示帮助信息 F2:重命名 F4:重复上一步操作 F5:刷新网页 …

python 程序

gif调整尺寸.py import sys from PIL import Image,ImageSequence import os ##print(sys.argv[0]) ##print(sys.argv[1]) def gifresize(file_name): gf Image.open(file_name) ## lifetime gf.info[duration] imglist [] imgnew [] for i in ImageSequence.…

AI工具箱最新使用教程

先克隆项目 电脑需要先安装 git ,安装的画看这个 Git安装教程(超详细)。 git镜像 git clone https://github.com/Escaflowne1985/MyToolsWebBackendUser.gitgitee镜像 git clone https://gitee.com/escaflowne/MyToolsWebBackendUser.git…

华为机试牛客刷题之HJ75 公共子串计算

HJ75 公共子串计算 描述 对于给定的两个字符串s和t,你需要找出它们的最长公共子串的长度。 子串为从原字符串中,连续的选择一段字符(可以全选、可以不选)得到的新字符串。 如果字符串 α 的一个子串 a’与字符串b的一个子串b 完全相等,那…

QILSTE H6-C210FO/5M高亮橙光LED灯珠 发光二极管LED

### H6-C210FO/5M:高亮橙光LED的技术参数与复杂特性 在电子设备的精密制造领域,H6-C210FO/5M型号的高亮橙光LED凭借其独特的设计和复杂的参数规格脱颖而出。这款由QILSTE(Hong Kong)Technology Co., Ltd生产的LED,尺寸…

004 Kafka异常处理

6.异常处理 文章目录 6.异常处理1.异常分类与处理原则2.生产者异常处理1. 同步发送捕获异常2. 异步发送回调处理 3.消费者异常处理1.全局异常处理器2.方法级处理3.重试yml配置 4.死信队列(DLQ)配置1. 启用死信队列2. 手动发送到DLQ 5.事务场景异常处理1.…

「拼好帧」小黄鸭 Lossless Scaling 软件介绍与下载

「拼好帧」小黄鸭 Lossless Scaling 软件介绍与下载 在游戏和视频播放时,你是否遇到过分辨率不匹配、画质模糊的问题?今天给大家介绍一款神器——Lossless Scaling(拼好帧),也被玩家们亲切地称为“小黄鸭”&#xff0…