【看得懂却用不好】系列-最大线程数之坑

大家好,我是石页兄,编程界的一名小学生

上善若水,水善利万物而不争

欢迎 关注微信公众号「架构染色」&& 加群交流

关注公众号 + 加入微信群,可抽奖领取2024中国数据库技术大会门票详情见文末

1. 概述

网络中诸多文章对java线程池的描述可谓入木三分,下边这段描述相信诸多JAVA开发早已熟知于心,但请留意今天的故事的主题是《看得懂却用不好》

java 线程池机制中,核心线程数提供了一个基础的线程池工作机制,保证了处理任务的基本能力,而最大线程数则提供了处理高负载时的扩展能力。合理配置这两个参数可以提高线程池的性能和资源利用率。

其中最大线程数则提供了处理高负载时的扩展能力这句话给许多研发同学带来了真香的感知,内心OS'平时没什么流量核心线程数设个20,应对并发峰值,最大线程数设置个1000够了吧'。看似合理实则有坑,一起来看本次故障处理。

2. 问题描述

服务对每个请求的处理需要初始化一个引擎对象,但这个引擎对象的创建耗时较长,为了应对业务高峰期,通过线程池来预创建引擎对象,且每个新请求都会给线程池提交一个任务(大致理解是通过线程池来创建对象就好);线程池的两个核心参数设计为核心线程数20,最大线程数1000。看起来整体逻辑似乎没有问题,但在生产环境业务高峰期却出现了请求大量RT超过3秒,导致超时业务。

这是怎么回事呢?

3. 现象分析

理论预期是这样:应对高并发,线程池里会增加更多的线程用于创建引擎对象,那么应该说CPU的使用率应该提高来创建更多的引擎对象,有了更多引擎对象请求的处理能力应该增加,那么网络流量应该是更高的,但实际情况却并非如此,看下图标红的两处,在出问题的时段能看到,CPU的使用率降低了,网络流量降低了,也就是说资源未充分的使用,服务的响应处理并不及时。

那么,为何如此?

4. 根因分析

为节省读者老师时间,此处省略实际分析过程中走的弯路,咱们直奔本文主题。核心思路是通过监控工具分析引擎对象的创建过程

4.1 查看线程里的运行状态

一种传统方法是加日志,查看代码在什么时间开始执行,执行了多久,这种方法当然简单轻便但是我们不采用。

这里推荐给大家jdk自带的工具VisualVM,可直观查看线程的运行、空闲情况。关于此工具的具体操作读者朋友请自行百度,这里不再赘述,我们观察以下线程的运行效果

  1. 绿色代表线程处于运行状态
  2. 黄色代表线程处于等待状态

线程池中的这批线程居然在近25秒的时段内都处于等待状态,为何新增了这么多线程却不干活儿,长时间处于等待状态?

4.2 为何新增线程长时间等待

为了快速得到答案咱们问一问chatGPT得出如下答案:

瞬间创建成百上千的线程会对操作系统的线程时间分片策略产生影响。这种情况可能会带来一系列性能问题和系统资源挑战。以下是一些关键点和影响:

  1. 线程上下文切换开销定义:线程上下文切换是指操作系统在不同线程之间切换时,需要保存和恢复线程的上下文状态(如寄存器值、程序计数器等)的过程。影响:创建大量线程会导致频繁的上下文切换,因为操作系统需要在这些线程之间分配 CPU 时间。这会增加 CPU 的负担,降低系统的整体效率。
  2. 资源消耗内存使用:每个线程都有其自身的栈空间和其他资源。如果瞬间创建大量线程,会消耗大量内存,可能导致内存不足的问题。调度开销:操作系统的线程调度器需要管理和调度这些线程,增加了系统的调度开销。
  3. 时间分片策略定义:时间分片策略是操作系统分配给每个线程的 CPU 时间片的策略。线程调度器按照某种策略将 CPU 时间片分配给线程,以确保公平和高效的处理。影响:瞬间创建大量线程可能导致时间片分配不均匀。每个线程可能获得的 CPU 时间片变得非常短,从而增加了上下文切换的频率。这种频繁的切换会降低线程的实际执行效率,导致性能下降。
  4. 竞争和阻塞竞争:大量线程同时争用 CPU、内存和其他系统资源,可能导致资源竞争激烈,从而影响系统的响应能力和吞吐量。阻塞:一些线程可能会因为等待 I/O 操作、锁或其他资源而处于阻塞状态,这可能进一步加重系统的负担。
  5. 操作系统限制线程数限制:操作系统通常会对每个进程可以创建的最大线程数进行限制。超出这个限制可能会导致线程创建失败或系统不稳定。

...

总之,瞬间创建大量线程会对操作系统和应用程序产生负面影响,合理设计线程模型和资源管理策略是确保系统稳定性和性能的关键。

根据以上内容我们可得出以下结论:瞬间创建成百上千的线程,会导致操作系统线程时间分片策略调整,出现CPU使用率降低,线程处理单个认证任务的耗时增加,且运行间隔不稳定,持续一段时间后,操作系统的线程调度策略才趋于稳定

5. 解决方案

这里的策略是固定线程数为50个(读者老师请按照实际测试情况来设定),相同的压力下,请求无超时,线程运行稳定,如下图:

当然本文并非是强调最大线程数没有用,而是从另外一个视角让读者了解到最大线程数设置不合理的副作用。 各位看官在实际使用过程中留意通过测试和工具(如VisualVM)来观察下实际效果。

本篇暂且介绍这些较核心的内容,希望能帮到读者老师。

6. 最后说一句

我是石页兄,如果这篇文章对您有帮助,或者有所启发的话,欢迎关注笔者的微信公众号【 架构染色 】进行交流和学习。您的支持是我坚持写作最大的动力。

另外技术群中也有许多热心的大佬时常交流互助;可扫描下方笔者微信二维码,加 V 备注"加群",期待并欢迎您的加入。

7. 中国数据库技术大会2024

关注公众号 + 加入微信群,可抽奖获得2024中国数据库技术大会门票

大会介绍:

为了紧跟时代步伐,引领前沿技术,由IT168联合旗下ITPUB、ChinaUnix两大技术社区主办的第15届中国数据库技术大会(DTCC2024)将于2024年8月22日至24日在朗丽兹西山花园酒店隆重召开。

附部分大会主题:

演讲主题 演讲人 公司 职位
国产数据库应用迁移设计与开发规范 邓琼 中信银行 软件开发中心系统支撑领域CTO
为什么大型数据库需要共享池 吕海波 美创科技 技术专家,首席研究员
从根生长---第三代分布式数据库CCDB 李海翔 前腾讯 TDSQL首席架构师
金融数据库数字化转型性能优化方法论 林春 太保集团数智研究院 首席数据库专家
金融交易场景下数据库运维体系建设与思考 张磊 某金融科技公司 数据库与存储团队负责人
多云数据库PG架构与开发实践 赵飞祥 Airwallex(空中云汇) DB架构师
金融级云原生数据库设计与实现 孔再华 民生银行 数据库专家
PixelsDB:云环境下高性价比、多服务等级的serverless查询处理技术实践 卞昊穹 中国人民大学 讲师、PixelsDB项目负责人
数智化时代打造超融合数据库 梁敬彬 知名企业 数据专家
快手降本增效的底层数据库技术支撑 尚灿芳 快手 MySQL内核负责人
分布式 Data Warebase - 构筑 AI 时代数据基石 胡月军 Protonbase(小质科技) 技术VP
PostgreSQL性能改进2、3事 章晨曦 易景科技 联合创始人、首席技术官
内核代码优化实践:基于MySQL 8.0的扩展性改造 王斌 TCPCopy研发作者,MySQL代码优化专家
MySQL性能优化之纯用户态锁 孟祥滨 京东科技 数据库架构师
平安在数据库技术创新转型中的应用实践 汪洋 平安科技 总工程师
数据库的多维度探讨与实践 王辉 华夏银行 数据库专家
百度云原生数据库GaiaDB极致成本与复杂查询加速技术实践 邱学达 百度 云原生数据库负责人
得到APP向量数据库的场景化落地实践 郭富城 得到APP 算法研发工程师
构建企业级AI知识库在ebay的实践 朱冠胜 eBay 资深架构师
面向云边端协同的新型分布式数据库管理系统 王宏志 哈尔滨工业大学 计算学部长聘教授、博士生导师
百度大规模商业实时报表存储底座BaikalDB的实践 于正泉 百度 BaikalDB报表负责人
快手分布式 KV 存储底座的演进 陈星 快手 存储技术专家
解析云上实时数仓的挑战与应对 吴炳锡 Databend Labs 联合创始人
京东物流面向多源联邦查询场景下的探索实践 林恩伟 京东物流 高级数据开发工程师
快手大数据成本治理体系及实践 揣龙 快手 数据平台/数据管治组/资源成本负责人
抖音集团指标管理与消费体系建设实践 施检军 抖音集团 数据平台数据BP专家
去哪儿大数据成本治理 王玉峰 去哪儿网 大数据技术总监
保险行业数据治理与数据资产:从策略到实践 胡赵勇 海保人寿 架构师
探索近实时湖仓在同程旅行场景实践 吴祥平 同程旅行 数据中心计算集群研发组技术负责人
爱奇艺数据中台湖仓一体化应用实践 杜益凡 爱奇艺 研究员
数据库的AI适用场景与业财一体化的实践分享 薛晓刚 欧冶云商 首席数据库专家
游戏业务数据库的管理优化之道 杨建荣 竞技世界 数据负责人
向量库在职业教育领域的实践 张国裕 高顿教育 技术总监
Oracle 23ai:JSON关系二元性视图与属性图 尹海文 Oracle ACE -
百度向量数据库创新和应用实践分享 朱洁 百度 数据库部门产品总架构师
信创数据库数字化运维 臧強磊 南京基石数据技术有限责任公司 智能运维平台知识图谱项目负责人
数据库统一操作管理平台 程勇 树安信息 CTO
快手低代码及智能化大数据开发平台实践 韩江 快手 大数据生产平台负责人
数据安全的攻与防,数据泄露了有DBA什么事 张文精 狮桥融资租赁(中国)有限公司 DBA 总监
智能数据管理:AI 驱动的 DataOps 实践 代立冬 白鲸开源 联合创始人
抖音集团DataOps能力演进及建设实践 谢林萍 抖音集团 数据BP专家
百度智能云大容量KV数据库PegaDB的设计与实践 商雄 百度 PegaDB 研发负责人
货拉拉⼤数据KV NoSQL数据库建设实践 章啸 货拉拉 ⼤数据基础架构存储⽅向负责⼈/⼤数据专家
数据驱动变革:电商用户及行为数据大平台策略 邵锋 eBay 资深架构师
方正证券基于StarRocks的用户画像系统实践 陈晓燕 方正证劵 数据中台技术负责人
车联网大数据平台建设 袁兆国 长城汽车 车联网大数据技术主管
大数据处理技术进展 袁平鹏 华中科技大学 教授、博士生导师、计算机学会高级会员
美团MTSQL核心特性 王广友 美团 MTSQL内核研发核心成员
移动云海山数据库由云向算演进之路 于巍 移动云-苏州研发中心 数据库技术委员会主任,数据库资深架构师
vivo 分布式缓存探索与实践 汪翔 vivo 专家工程师

以上为大会最新主题,更多主题敬请期待...

会议地点:朗丽兹西山花园酒店

会议时间:2024年8月22日-8月24日(周四~周六)

大会主办:IT168、ITPUB、ChinaUnix

大会官网dtcc.it168.com/

相关推荐
ifanatic36 分钟前
[面试]-golang基础面试题总结
面试·职场和发展·golang
儿时可乖了42 分钟前
使用 Java 操作 SQLite 数据库
java·数据库·sqlite
ruleslol43 分钟前
java基础概念37:正则表达式2-爬虫
java
Iced_Sheep1 小时前
干掉 if else 之策略模式
后端·设计模式
xmh-sxh-13141 小时前
jdk各个版本介绍
java
XINGTECODE1 小时前
海盗王集成网关和商城服务端功能golang版
开发语言·后端·golang
天天扭码1 小时前
五天SpringCloud计划——DAY2之单体架构和微服务架构的选择和转换原则
java·spring cloud·微服务·架构
程序猿进阶1 小时前
堆外内存泄露排查经历
java·jvm·后端·面试·性能优化·oom·内存泄露