当前位置: 首页 > article >正文

字节一面凉了!被问接口超时频繁,线程池该怎么优化?面试官:你管这叫高并发优化?

一、真实面经栽在线程池这个坑里上周朋友去字节面后端岗上来就是一道场景题线上接口超时频繁报错堆在一起你看了下日志发现大部分都卡在线程池队列满了拒绝请求你会怎么优化朋友想了两分钟回答说那把核心线程数调大一点队列容量也改大一点不就能装更多请求了。面试官听完就笑了你管这叫高并发优化然后就没有然后了。其实这真不能怪他很多人对线程池的理解还停留在创建的时候填四个参数知道核心线程、最大线程、存活时间、队列就完事了。真到线上出问题全靠瞎调参数蒙对了就万事大吉蒙错了反而更糟。这里要注意线程池调优不是越大越好。队列加太大请求堆积多了反而会让平均响应时间更长用户还是超时。线程开太多CPU 切换不过来上下文切换开销把性能都吃掉了。有意思的是很多公司的线程池配置从项目上线那天起就没动过。默认参数用到底出了问题才慌慌张张改一改改完又出新问题。其实线程池调优是有章法的不是靠感觉瞎蒙。二、别上来就调参数先搞清楚问题在哪碰到接口超时全是线程池拒绝第一步真不是改参数。你得先搞明白到底是请求真的太多了还是线程卡在那里动不了两种情况解法完全不一样。如果是某个慢查询把线程都block住了你就算开一百个线程很快还是会被占满问题根本没解决。这个时候应该去优化慢接口而不是扩容线程池。这里说个简单的判断方法看一下线程的平均等待时间和实际执行时间。如果等待时间很长执行时间很短说明确实是线程数不够请求排不上队。如果执行时间本身就很长那问题出在任务本身不是线程池。举个例子你的接口处理一次请求需要 100ms8 核机器开了 16 个线程理论上每秒能处理 160 个请求。如果每秒来了 300 个请求那自然排不过来这个时候可以考虑扩容。如果每个请求要等 2 秒数据库查询开 100 个线程一下子就占满了这时候优先优化 SQL 加索引比加线程有用多了。线程池解决的是排队问题不是慢问题。先治病还是先止痛得分清楚。很多人误以为核心线程数就设成CPU核数乘以2就行。其实这个公式只适用于CPU密集型任务。如果你的任务大部分都是在等IO——等数据库、等第三方接口那线程数可以设得大很多因为很多线程都是在等待CPU其实是空的。举个实际例子我之前做过一个推送服务大部分时间都在等第三方网关回调线程数开到 CPU 核数的 10 倍吞吐量反而更高因为闲着也是闲着多开线程能多处理请求。三、真正实用的优化步骤一步步来搞清楚问题之后再动手优化就不会错了。说几个实战中真正有用的优化手段按顺序来第一缩小任务本身的执行时间。这是性价比最高的优化。把慢SQL优化了把不必要的串行调用改成并行加上缓存能解决 80% 的问题。任务跑得快了自然不需要那么多线程排队。第二根据任务类型设置合理的线程数。公式给你放这了线程数 CPU核数 × (1 平均等待时间 / 平均计算时间)等待时间越长需要的线程越多。IO密集型任务等待时间远大于计算时间线程数可以大一点。CPU密集型计算时间占比高线程数接近CPU核数就够了开多了反而增加切换开销。第三拒绝策略真的很重要。很多人默认用AbortPolicy队列满了直接抛异常用户直接看到报错。其实更合理的是用CallerRunsPolicy让提交任务的线程自己去执行这个任务这样能把请求速率降下来不至于把所有用户都拒绝了。当然你也可以自己实现拒绝策略把请求放到Redis队列里慢慢处理或者直接返回系统繁忙请稍后重试给用户比直接抛异常强得多。第四队列选型别瞎选。你用无界LinkedBlockingQueue试试请求一来堆积几万条内存直接炸掉。所以生产环境一定要用有界队列。那用SynchronousQueue好不好这个队列不存任务来了直接提交给线程线程不够就拒绝适合请求量大但处理快的场景能减少排队延迟。如果你希望请求尽量都能处理接受一点延迟那就用有界LinkedBlockingQueue。这里踩过坑才知道队列不能太长。队列太长请求排队时间久了用户还是超时你堆积那么多请求干嘛还不如早点拒绝让用户重试或者降级。还有一点容易忽略不同类型的任务要分开线程池。你不能把推送任务、导入任务、接口请求都塞到同一个线程池里。一旦某个类型的任务把线程都占满了其他正常请求也别想处理了全被连累。拆分之后就算一个池子炸了不影响其他业务。四、别光说不练线上要这么监控调完参数不是完事了你得盯着看实际运行效果。线程池有几个关键指标必须监控当前活跃线程数是不是经常跑到最大线程数说明确实不够用队列中等待的任务数是不是经常排队排满任务完成速度和提交速度对比如果提交一直比完成快那迟早会崩平均执行时间、平均等待时间看你的调优有没有效果其实很多问题监控一看就明白。你调完参数观察一天看看拒绝次数还多不多接口超时率降了没有一目了然。面试官其实不care你能背出多少参数他就想知道你线上真碰到问题会怎么一步步分析解决。你把这套诊断流程说出来比你背十个线程池参数有用多了。回到最开始那个问题接口超时频繁线程池队列满了拒绝请求你该怎么回答别上来就说加大线程加大队列先问清楚任务是CPU密集还是IO密集现在每个任务平均执行时间多少是不是有慢接口拖后腿然后再一步步来先优化任务再调整参数再拆分隔离最后上监控。这么说面试官基本就满意了。很多时候候选人凉不是因为不知道线程池是什么是因为太着急给答案没搞清楚问题就瞎优化正好踩中面试官挖的坑。

相关文章:

字节一面凉了!被问接口超时频繁,线程池该怎么优化?面试官:你管这叫高并发优化?

一、真实面经:栽在线程池这个坑里 上周朋友去字节面后端岗,上来就是一道场景题:线上接口超时频繁,报错堆在一起,你看了下日志发现大部分都卡在线程池队列满了拒绝请求,你会怎么优化? 朋友想了两…...

企业无线网络运维实录:如何稳定部署MAC优先Portal认证,避免认证回退的坑?

企业无线网络MAC优先Portal认证实战指南:从架构设计到排错优化 走进任何一家现代化企业的办公区,你很难找到一根网线——无线网络早已成为数字办公的"氧气"。但当我们为员工提供这无形便利时,认证环节的体验往往成为技术团队最头疼…...

ThinkPad风扇控制终极指南:如何用TPFanCtrl2告别过热与噪音困扰

ThinkPad风扇控制终极指南:如何用TPFanCtrl2告别过热与噪音困扰 【免费下载链接】TPFanCtrl2 ThinkPad Fan Control 2 (Dual Fan) for Windows 10 and 11 项目地址: https://gitcode.com/gh_mirrors/tp/TPFanCtrl2 你是否曾因ThinkPad风扇的"直升机模式…...

下周一马斯克与奥特曼法庭重逢,8520亿美元OpenAI面临「违反慈善信托」诉讼

世纪诉讼即将开庭下周一,马斯克和奥特曼将在法庭重逢,估值8520亿美元的OpenAI要上被告席。加州奥克兰联邦法院已排好日程,4月27日进行陪审团遴选,4月28日开庭陈述,审期持续到5月中旬。半个硅谷的相关人士都要被传上证人…...

GoPro WiFi Hack与OpenGoPro对比分析:选择最适合你的开发方案

GoPro WiFi Hack与OpenGoPro对比分析:选择最适合你的开发方案 【免费下载链接】goprowifihack Unofficial GoPro WiFi API Documentation - HTTP GET requests for commands, status, livestreaming and media query. 项目地址: https://gitcode.com/gh_mirrors/g…...

别再折腾了!2024年最新TeX Live + TeXstudio保姆级安装配置指南(含清华镜像加速)

2024年LaTeX终极配置指南:从零搭建高效学术写作环境 第一次接触LaTeX时,我被那些复杂的命令和报错信息吓得不轻。记得研究生入学第二天,导师扔给我一份LaTeX模板说"用这个写论文",结果光是安装环境就折腾了整整三天。如…...

避坑指南:onnx模型转换与推理中常见的5个‘坑’及解决办法(附onnx-simplifier实战)

ONNX模型实战避坑指南:从转换陷阱到推理优化的深度解决方案 在深度学习模型部署的生态系统中,ONNX(Open Neural Network Exchange)已经成为连接训练框架与推理引擎的重要桥梁。然而,这座桥梁并非总是平坦——许多开发者…...

免密钥AI对话工具ShellGPTMobile:原理、安装与安全使用指南

1. 项目概述:一个真正“免费”的移动端AI对话工具在AI应用井喷的今天,找到一个好用、免费且没有使用门槛的移动端对话工具,对很多普通用户来说依然是个难题。很多打着“免费”旗号的应用,要么需要你绑定海外支付方式,要…...

UDS诊断实战:手把手教你用CANoe/CANalyzer发送0x23服务读取ECU内存(附报文解析)

UDS诊断实战:用CANoe/CANalyzer发送0x23服务读取ECU内存的完整指南 在汽车电子诊断领域,UDS协议已经成为行业标准,而0x23服务(ReadMemoryByAddress)则是诊断工程师日常工作中最常用的功能之一。想象一下,当…...

麒麟Kylin V10控制中心深度体验:除了基础设置,这些隐藏技巧和优化项你知道吗?

麒麟Kylin V10控制中心高阶指南:解锁专业用户的隐藏生产力工具 作为国产操作系统的代表之作,麒麟Kylin V10的控制中心远不止表面看到的那些基础设置选项。对于已经熟悉系统基本操作的中高级用户而言,深入挖掘这些隐藏功能可以显著提升工作效率…...

yutu:基于多智能体架构的YouTube自动化AI代理实战指南

1. 项目概述:一个能让你“躺平”的YouTube频道AI管家 如果你和我一样,运营着一个YouTube频道,那你一定对下面这些事深有同感:每周雷打不动地要花几个小时上传视频、手动填写那些冗长的标题、描述和标签;得像个客服一样…...

3DS游戏格式转换实战:从3ds/cci到CIA的一键解决方案

3DS游戏格式转换实战:从3ds/cci到CIA的一键解决方案 【免费下载链接】3dsconv Python script to convert Nintendo 3DS CCI (".cci", ".3ds") files to the CIA format 项目地址: https://gitcode.com/gh_mirrors/3d/3dsconv 还在为下载…...

深入Linux内核:进程调度与内存管理机制

深入Linux内核:进程调度与内存管理机制 现代操作系统的核心功能中,进程调度与内存管理是两大基石。Linux作为开源操作系统的代表,其内核设计精巧而高效,吸引了无数开发者深入研究。本文将带你探索Linux内核中进程调度与内存管理的…...

手把手教你用StaMPS+TRAIN+GACOS搞定InSAR大气校正(MATLAB实战)

从零到一:MATLAB环境下StaMPSTRAINGACOS大气校正全流程实战指南 当TerraSAR-X数据的大气相位像一层薄雾般笼罩在你的干涉图上时,作为刚接触InSAR技术的研究者,你是否曾为如何剥离这层干扰而苦恼?本文将带你走进一个真实的科研场景…...

ValueCAN3硬件接线图详解:手把手教你连接车载CAN网络(附引脚图)

ValueCAN3硬件接线图详解:手把手教你连接车载CAN网络(附引脚图) 第一次拿到ValueCAN3设备时,许多工程师会被金属外壳上那排神秘的引脚难住。这些直径不到2毫米的金属触点,却是连接整车CAN网络的神经末梢。本文将用实验…...

luci-app-unblockneteasemusic网络劫持原理详解:从IPset到Hosts的完整实现

luci-app-unblockneteasemusic网络劫持原理详解:从IPset到Hosts的完整实现 【免费下载链接】luci-app-unblockneteasemusic [OpenWrt] 解除网易云音乐播放限制 项目地址: https://gitcode.com/gh_mirrors/lu/luci-app-unblockneteasemusic luci-app-unblockn…...

告别硬编码!用C++函数指针优雅实现游戏角色‘自杀’CALL(附完整代码)

告别硬编码!用C函数指针优雅实现游戏角色‘自杀’CALL(附完整代码) 在游戏逆向工程领域,直接操作内存和硬编码地址的传统做法就像在钢丝上跳舞——虽然能完成任务,但稍有不慎就会导致崩溃或安全风险。本文将带你探索一…...

终极Black性能基准:建立客观的Python代码格式化速度评估标准体系

终极Black性能基准:建立客观的Python代码格式化速度评估标准体系 【免费下载链接】black The uncompromising Python code formatter 项目地址: https://gitcode.com/GitHub_Trending/bl/black Black作为一款备受欢迎的Python代码格式化工具,以其…...

从噪音困扰到专业音质:OBS-VST如何为你的直播音频带来革命性提升

从噪音困扰到专业音质:OBS-VST如何为你的直播音频带来革命性提升 【免费下载链接】obs-vst Use VST plugins in OBS 项目地址: https://gitcode.com/gh_mirrors/ob/obs-vst 你是否曾因直播时房间的回声、键盘的敲击声或风扇的嗡嗡声而感到困扰?是…...

ECharts自定义系列(custom)实战:手把手教你为多系列柱状图添加渐变/图片背景

ECharts自定义系列深度实战:打造多系列柱状图的视觉盛宴 当标准图表配置无法满足你的设计需求时,ECharts的custom系列就像一把瑞士军刀,让你可以自由雕刻每一个像素。本文将带你从零开始,掌握如何为多系列柱状图添加渐变、图案甚至…...

从Hub基因到靶点发现:如何用WGCNA深度挖掘你的RNA-seq数据,寻找关键生物标志物?

从Hub基因到靶点发现:如何用WGCNA深度挖掘RNA-seq数据中的关键生物标志物? 在生物医学研究中,RNA测序技术产生的海量数据常让研究者陷入"数据丰富但洞见匮乏"的困境。WGCNA(加权基因共表达网络分析)作为系统…...

MyBatisPlus查询方法避坑指南:selectOne返回多条数据怎么办?selectByMap性能真的差吗?

MyBatisPlus查询方法深度避坑指南:从原理到实战优化 最近在技术社区看到不少关于MyBatisPlus查询方法的讨论,特别是selectOne返回多条数据时的诡异行为和selectByMap的性能争议。作为在电商系统中深度使用MyBatisPlus的开发者,我想分享一些从…...

分布式系统创新探索

分布式系统创新探索:构建数字未来的基石 在数字化浪潮席卷全球的今天,分布式系统作为支撑大规模计算与数据处理的底层架构,正成为技术创新的核心领域。从云计算到区块链,从物联网到人工智能,分布式系统的设计理念不断…...

医疗器械生产制造法规要求

医疗器械生产制造法规要求 医疗器械生产制造受到严格法规监管,以确保产品的安全性和有效性。以下是主要法规要求: 中国法规要求(NMPA) 《医疗器械监督管理条例》 生产企业需取得《医疗器械生产许可证》或备案凭证。按照医疗器械生…...

JMeter 安装与配置教程 (Windows 系统)

文章目录JMeter 安装与配置教程 (Windows 系统)1、安装 JDK2、下载 Apache JMeter3、配置环境变量4、启动 JMeter5、运行 JMeter GUI 或命令行模式常见问题与解决方案JMeter 安装与配置教程 (Windows 系统) 概述: JMeter 是一款开源的性能测试工具,广泛…...

别再手动管理GPU了!用Determined AI搭建算力池,让团队共享3090的保姆级教程

解放团队生产力:用Determined AI构建高效GPU算力池的完整指南 当你的团队拥有多张RTX 3090这样的高性能GPU,却发现它们大部分时间处于闲置状态,或者团队成员经常因为资源分配问题而互相等待时,问题就来了——我们投入巨资购置的硬…...

RK3588 Android12设备树定制:如何通过修改device配置,让你的开发板支持HDMI-IN和4G模块

RK3588 Android12硬件定制实战:从HDMI-IN到4G模块的完整适配指南 当一块RK3588核心板从开发套件变成实际产品时,最关键的环节莫过于硬件功能的定制化适配。我曾见证过一块原本只能播放视频的开发板,经过正确的设备树配置,最终蜕变…...

终极指南:3步快速掌握开源游戏清单工具,让Steam文件管理变得如此简单!

终极指南:3步快速掌握开源游戏清单工具,让Steam文件管理变得如此简单! 【免费下载链接】Onekey Onekey Steam Depot Manifest Downloader 项目地址: https://gitcode.com/gh_mirrors/one/Onekey 你是否曾经面对复杂的游戏文件结构感到…...

Verilog有符号数运算避坑指南:从常量赋值到加减乘除的完整配置流程

Verilog有符号数运算避坑指南:从常量赋值到加减乘除的完整配置流程 在数字电路设计中,有符号数的正确处理是许多工程师的痛点。无论是滤波器设计、音频处理还是控制系统,只要涉及负数运算,Verilog中的符号位处理就可能成为调试时的…...

本地Cookie导出终极指南:5分钟掌握安全Cookie管理技巧

本地Cookie导出终极指南:5分钟掌握安全Cookie管理技巧 【免费下载链接】Get-cookies.txt-LOCALLY Get cookies.txt, NEVER send information outside. 项目地址: https://gitcode.com/gh_mirrors/ge/Get-cookies.txt-LOCALLY 你是否曾需要获取网站的Cookie数…...