java手动回收线程_性能优化:线程资源回收

article/2025/9/12 22:01:21

本文来自: PerfMa技术社区

PerfMa(笨马网络)官网

一、问题

模型服务平台的排序请求出现较多超时情况,且不定时伴随空指针异常。

二、问题发生前后的改动

召回引擎扩大了召回量,导致排序请求的item数量增加了。

三、出问题的模型

基于XGBoost预测的全排序模型。

四、项目介绍

web-rec-model:模型服务平台。用于管理排序模型:XGBoost、TensorFlow、pmml....召回模型:item2item,key2item,vec2item....等模型的上下线、测试模型一致性、模型服务等。

五、一次排序请求流程

1、如下图所示,一次排序请求流程包含:特征获取、向量获取、数据处理及预测。以上提到的三个步骤均采用多线程并行处理,均以子任务形式执行。每个阶段中间夹杂这数据处理的流程,由主线程进行处理,且每个阶段的执行任务均为超时返回,主线程等待子线程任务时,也采用超时等待的策略。(同事实现的一个树形任务执行,超时等待的线程框架)

2、特征数据闭环:该步骤为异步执行,将排序计算使用到的特征及分数,模型版本等信息记录。后续作为模型的训练样本,达到特征闭环。

04ddd2191c93c087b0d5dca5c77037f2.png

3、一次排序请求中,特征获取及向量获取为网络IO(IO密集型任务),超时可直接响应中断,线程可快速返回。数据处理及模型为计算步骤(CPU密集型任务)。

4、当前请求耗时情况:特征与向量的获取阶段耗时均为5-8ms,数据处理及模型预测阶段耗时平均在10ms左右。

六、问题发生现象

1、首先是调用方:推荐策略平台,监控报警排序请求的超时数量变多(调用方超时时间为300ms),且从监控上看发现排序服务的耗时明显变长:50ms+。正常高峰期的期望值为50ms以下。

2、其次排序服务告警出现大量超时错误。

ae94909c860577c4cb0ac056f8bb315f.png

3、第三根据错误信息定位到该错误信息来自于数据处理及模型预测阶段。

4、除了超时变多以外,服务中会出现偶发性的空指针异常。

七、问题排查

1、首先解决空指针这类低级错误。

271ddbe1002632217ff59cedb90f3e94.png

2、根据错误提示找到对应的代码,此处就不粘贴代码了,做一个简单的代码解释。代码逻辑为:从Map中根据特征key获取特征值进行计算。

3、疑惑点出现,首先该Map用于存放特征及向量键值对,且key均做了空值计算兼容。特征或者向量在查询到空值时,会在Map中放入一个对应的默认值。经过反复的代码确认,报错信息对应的代码不可能出现漏放默认值的情况。

4、借助Arthas的watch命令,监控空指针异常的入参。方便后面做模拟请求还原现场。

5、根据报错时的信息进行模拟请求。尝试N次,且使用不同的报错数据进行尝试,均未重现事故。

6、此时怀疑是多线程并发进行数据处理及预测时,发生对Map进行修改的动作,导致部分键值对丢失。

7、反复检查代码,确定数据处理及预测均为只读动作,不会对Map进行任何键值对的删改。

8、线索中断,排查一度搁置。

八、豁然开朗

1、借用Arthas进行报错观察:使用watch命令,依靠-e参数(指定报错触发打印)以及-x n 参数(打印方法入参及返回值数据层数)

2、根据观察,发现Map中丢失的均为向量键值对。

3、找到问题:在排序请求流程图中,在主线程进行分数归一化时,会fork子线程异步做特征数据进行压缩写入kafka。由于Map中存在大量的向量数据,导致保存数据过冗余的情况。此处的做法是先去除所有的向量数据,再进行保存。

4、但是该动作是发生在数据处理及模型预测后的,为何还会因为Map中删除键值对导致空指针异常呢。

5、此时怀疑是数据处理及模型预测阶段,多线程任务还没完成时,主线程已经等候超时返回了。

九、验证想法

1、还是观察超时日志。

4a86c06435f6cd6bac352c898b33c7ed.png

969da415910ca16510861b502e9d50f3.png

2、发现请求已经返回后,才出现空指针异常。那基本就可以验证以上的想法了。

十、问题解决

1、翻看使用的多线程框架(同事实现),主线程超时等待子线程任务。主线程超时返回后,没有通知子线程任务取消。所以才发生请求已返回,特征数据异步落地后,偶发性出现晚到的空指针异常的情况。如下图,主线程超时返回后,只取消主线程任务。

f97801aea33744e81e718e2c016130eb.png

2、解决思路:主线程超时返回后,中断子任务(取消子任务)。由于java的中断机制为软中断,一般是通过中断标志位进行线程中断协作的。当然IO或者sleep的中断由系统帮我们做了中断可以快速返回。对于CPU密集型的任务,是需要使用者在合适的计算点上做标志位判断,确定是否已中断结束任务。以这种协作的方式达到中断。(此处可能有部分理解不当)

3、修改多线程框架,在主线程超时返回后,修改子线程中断标志位。

f815c26add64bc861ef4368c76caf87f.png

4、在计算流程中加入线程中断检查,如果被中断则提前结束计算。

7e180a9b42b2d6c6b5d7a28e6a43acd1.png

十一、效果检查

1、修改发版后,空指针没再出现。(其实该空指针是不影响排序结果,因为结果已经是错的,该异常只是附带的虫子而已)

2、超时请求减少,高峰期的超时数据减少三分之一,50ms+的排序请求有明显减少。

十二、复盘

1、主线程等待子任务的场景下,如果主线程超时返回了。需通知子线程结束执行的任务。首先,主线程返回了,表示子任务已被丢弃。继续执行都是在做无用的计算,占用计算机资源。也不是说占着茅坑不拉屎,而是拉了没人要。应该尽量减少服务器资源用在没必要的消耗上。

2、该服务在数据处理及预测阶段使用的线程池队列为SynchronousQueue,如果不了解SynchronousQueue的话可以简单理解为一个0长度的队列。任务进池子时必须要有线程进行对接。与常规的BlockingQueue不同的是,任务在池子中不会堆积,对于任务的快速响应比较友好。但是也因为如果没有空闲的线程,则会不停创建线程直到最高线程数限制而触发丢弃策略。在该项目问题中,由于部分子任务在主线程返回后仍然在执行。新的请求进来后,会出现没有空闲线程的情况,导致池子创建新线程接任务。对于CPU密集型任务来说,过多的线程数对服务来说是另一种负担,毕竟线程切换的代价还是比较大的。这就套入死循环了。(个人理解,如表述有误,还望指正)

欢迎关注 PerfMa 社区,推荐阅读

内存问题探微

JAVA线上故障排查套路

b739ec46bb5c46d9c0aa4ce35ba1ea56.png

关于找一找教程网

本站文章仅代表作者观点,不代表本站立场,所有文章非营利性免费分享。

本站提供了软件编程、网站开发技术、服务器运维、人工智能等等IT技术文章,希望广大程序员努力学习,让我们用科技改变世界。

[性能优化:线程资源回收]http://www.zyiz.net/tech/detail-149747.html


http://chatgpt.dhexx.cn/article/08vJGRdd.shtml

相关文章

编译优化之 - 向量化优化入门

1. 介绍 2. Intel高级向量扩展 3. GCC中向量化 4. ICC中向量化 5. AOCC/LLVM中向量化 1. 介绍 什么是自动向量化? 自动向量化(automatic vectorization)是自动并行化(automatic parallelization)的一种特殊情况&#…

数据库向量化如何进行性能优化

数据库向量化如何进行性能优化 前面提到,数据库向量化是一个巨大的、系统的性能优化工程,两年来,我们实现了数百个大大小小的优化点。我将 StarRocks 向量化两年多的性能优化经验总结为 7 个方面 (注意,由于向量化执行…

simulink 状态空间加反馈报错

状态空间模型(可控)通过状态反馈或输出反馈可以自由配置极点和特征向量,得到理想的运动状态,通过计算得到的反馈增益矩阵K便可构建simulink模型,但常常报错,原因如下: 上图展示的是simulink模型…

状态空间方程MATLAB语句

1.连续系统 (1)使用系数矩阵获得传递函数 [num,den]ss2tf(A,B,C,D); (2)将传递函数写成因式分解(零极点)形式 [z,p,k]ss2zp(A,B,C,D) 或者 [z,p,k]tf2zp(num,den) (3)将给定形式…

基于matlab的系统状态空间转化

前段时间学习了一些关于通过系统状态方程判断系统可控性和可观测性,并由此求出其传递函数,基于传递函数判断其稳定性的一些知识。 一、常用的数学模型转换函数: 常用数学模型转换函数 ss2tf 将系统状态空间…

连续状态空间模型离散化

对于某状态空间模型: 其中: 将该连续模型离散化:(代码如下) clc;clear;close all A[-11.6028 7.1632 ;6.4909 -27.837 ]; B[3.086;5.4458]; [F,G]c2d(A,B,0.02) %0.02为采样周期 运行结果如下:&#xff0…

基于状态空间的数字控制器的设计

目录 一.目的... 2 二.内容... 2 三.实验过程与结果... 2 1.推算出控制对象的模型参数... 2 2. 状态空间的数字控制器的设计原理... 2 3、实验代码(借鉴PPT内容)... 3 4、仿真图像... 3 5、仿真结果…

人工智能:状态空间图(超详细经典例题讲解,通过例题教会你如何解决状态空间图问题)

1、定义 状态空间常记为三元组&#xff1a;<S&#xff0c;F&#xff0c;G>。 其中&#xff0c;S为初始状态的集合&#xff0c;F为操作的集合&#xff0c;G为目标状态的集合。 问题的状态空间图是一个描述该问题全部可能的状态及相互关系的有向图。 如考虑操作的代价&…

状态空间模型

&#xfeff;&#xfeff; 一、状态空间模型简述 状态空间模型是动态时域模型&#xff0c;以隐含着的时间为自变量。状态空间模型包括两个模型&#xff1a; 一是状态方程模型&#xff0c;反映动态系统在输入变量作用下在某时刻所转移到的状态&#xff1b; 二是输出或量测方程模…

什么是状态空间法

1 状态空间法 在经典控制理论中&#xff0c;在建立数学模型时是通过传递函数进行的&#xff0c;在这个过程中&#xff0c;只考虑输入和输出之间的关系&#xff0c;所以会将系统变成一个黑盒子&#xff0c;里面的内容被浓缩了。 而在现代控制理论中&#xff0c;会首先从系统中抽…

动态系统建模-状态空间方程

动态系统建模-状态空间方程 状态空间方程是现代控制理论的基础, 它以矩阵的形式表达系统状态变量、 输入及输出之间的关系。 它可以描述和处理多输入多输出(MultipleInput Multiple Output, MIMO) 的系统。 状态空间方程 单输入单输出(SingleInput Single Output,SISO) 系统…

人工智能——状态空间表示法

状态空间表示法 状态空间表示法引入问题状态空间的构成状态算符状态空间问题的解 状态空间法表示问题的步骤状态空间方法表示问题的步骤如下 利用状态空间求解问题的过程利用状态空间表示法解题示例状态空间表示法简要小结 状态空间表示法引入 状态空间表示法就是以 “ 状态空间…

传递函数与状态空间

传递函数与状态空间之间可相互转换&#xff0c;可以使用的matlab函数有 [A,B,C,D] tf2ss(NUM,DEN) [NUM,DEN] ss2tf(A,B,C,D,iu)传递函数的形式唯一&#xff0c;但状态空间的形式不唯一&#xff0c;可以有多种。 1、一阶惯性环节 时间常数为T&#xff0c;本身为低通滤波器&…

状态空间搜索

http://www.lencomputer.com/xk2008/lesson19/search_algorithm.htm 状态空间搜索是程序设计中的最基本方法之一。它通过在状态空间中的初始状态出发&#xff0c;按照一定的顺序和条件对空间中的状态进行遍历&#xff0c;最终找到目标状态。一般的状态空间搜索方法有枚举、深度…

状态空间

1. 定义 状态变量(state variables)是指在系统中所含变量个数最少的变量&#xff0c;也就是决定系统状态的最小数目的变量的有序集合&#xff0c;有时也称为状态向量&#xff08;state vector&#xff09;&#xff0c;例如表示天体运动状态的位置和速度的变量。状态变量表示系统…

状态空间树

状态空间树&#xff1a; 就是问题的解空间树&#xff0c;分为子集树和排列树 子集树 当所给的问题是从n个元素组成的集合set中找到满足某一条件的一个子集时&#xff0c;相应的解空间树称为子集。 要注意&#xff0c;这个解空间树是一个虚拟的树&#xff0c;并不是构建出来的…

matlab状态空间程序,将状态空间表示形式转换为传递函数

理想的一维振荡系统由位于两面墙壁间的两个单位质点 m1 和 m2 组成。每个质点通过一根单位弹性常量弹簧连接到最近的墙壁。另外一根弹簧连接这两个质点。传感器以 Fs=16 Hz 的频率对 a1 和 a2(质点的加速度)采样。 将总测量时间指定为 16 秒。定义采样间隔 Δt=1/Fs。 Fs = 16;…

状态空间表示

前言 本文隶属于专栏《人工智能》&#xff0c;该专栏为笔者原创&#xff0c;引用请注明来源&#xff0c;不足和错误之处请在评论区帮忙指出&#xff0c;谢谢&#xff01; 本专栏目录结构和参考文献请见人工智能 引子 人工智能的多个研究领域从求解现实问题的过程来看&#xf…

现控笔记(二):状态空间表达式

控制系统状态空间表达式 系统动态过程的两类数学描述&#xff1a; 外部描述&#xff1a;&#xff08;输入——输出描述&#xff09; 内部描述&#xff1a;状态空间描述 两个方程描述&#xff1a;状态方程&#xff08;动态&#xff09;&#xff0c;输出方程&#xff08;静态&am…

【现控】系统状态空间表达式

【现控】1 系统状态空间表达式 一、基本概念 状态&#xff1a;状态是变化的&#xff0c;是时域里的一系列变量。它可以数字、曲线或者其他什么更为抽象的东西描述。 状态变量&#xff1a;能够完全描述系统的最小一组变量。可抽象可具体。 状态空间&#xff1a;以状态变量构成…