CN115981962A - 线程池监控方法、装置、电子设备及存储介质 - Google Patents
线程池监控方法、装置、电子设备及存储介质 Download PDFInfo
- Publication number
- CN115981962A CN115981962A CN202211732580.4A CN202211732580A CN115981962A CN 115981962 A CN115981962 A CN 115981962A CN 202211732580 A CN202211732580 A CN 202211732580A CN 115981962 A CN115981962 A CN 115981962A
- Authority
- CN
- China
- Prior art keywords
- thread pool
- thread
- execution class
- instance object
- execution
- Prior art date
- Legal status (The legal status is an assumption and is not a legal conclusion. Google has not performed a legal analysis and makes no representation as to the accuracy of the status listed.)
- Granted
Links
- 238000000034 method Methods 0.000 title claims abstract description 50
- 238000012544 monitoring process Methods 0.000 title claims abstract description 43
- 239000000523 sample Substances 0.000 claims abstract description 12
- 230000004044 response Effects 0.000 claims abstract description 9
- 238000013480 data collection Methods 0.000 claims description 12
- 238000012545 processing Methods 0.000 claims description 12
- 230000000903 blocking effect Effects 0.000 claims description 9
- 238000012806 monitoring device Methods 0.000 abstract description 3
- 238000004590 computer program Methods 0.000 description 13
- 238000004891 communication Methods 0.000 description 9
- 230000008569 process Effects 0.000 description 9
- 238000010586 diagram Methods 0.000 description 7
- 239000003795 chemical substances by application Substances 0.000 description 4
- 230000006870 function Effects 0.000 description 4
- 230000004048 modification Effects 0.000 description 4
- 238000012986 modification Methods 0.000 description 4
- 230000003287 optical effect Effects 0.000 description 4
- 238000010276 construction Methods 0.000 description 3
- 238000012946 outsourcing Methods 0.000 description 3
- 230000001960 triggered effect Effects 0.000 description 3
- 238000005516 engineering process Methods 0.000 description 2
- 230000003993 interaction Effects 0.000 description 2
- 230000004083 survival effect Effects 0.000 description 2
- 238000013473 artificial intelligence Methods 0.000 description 1
- 230000010267 cellular communication Effects 0.000 description 1
- 230000001413 cellular effect Effects 0.000 description 1
- 239000004973 liquid crystal related substance Substances 0.000 description 1
- 238000010801 machine learning Methods 0.000 description 1
- 238000004519 manufacturing process Methods 0.000 description 1
- 239000013307 optical fiber Substances 0.000 description 1
- 239000004065 semiconductor Substances 0.000 description 1
- 230000001953 sensory effect Effects 0.000 description 1
- 230000000007 visual effect Effects 0.000 description 1
Images
Classifications
-
- Y—GENERAL TAGGING OF NEW TECHNOLOGICAL DEVELOPMENTS; GENERAL TAGGING OF CROSS-SECTIONAL TECHNOLOGIES SPANNING OVER SEVERAL SECTIONS OF THE IPC; TECHNICAL SUBJECTS COVERED BY FORMER USPC CROSS-REFERENCE ART COLLECTIONS [XRACs] AND DIGESTS
- Y02—TECHNOLOGIES OR APPLICATIONS FOR MITIGATION OR ADAPTATION AGAINST CLIMATE CHANGE
- Y02D—CLIMATE CHANGE MITIGATION TECHNOLOGIES IN INFORMATION AND COMMUNICATION TECHNOLOGIES [ICT], I.E. INFORMATION AND COMMUNICATION TECHNOLOGIES AIMING AT THE REDUCTION OF THEIR OWN ENERGY USE
- Y02D10/00—Energy efficient computing, e.g. low power processors, power management or thermal management
Landscapes
- Debugging And Monitoring (AREA)
Abstract
本申请实施例提供一种线程池监控方法、装置、电子设备及存储介质;该方法包括:对于预置的多个线程池中的每一个,确定该线程池的执行类,并确定执行类的执行类字节码文件;在执行类字节码文件中构建数据采集逻辑,并在执行类字节码文件中设置拦截器,得到增强后的执行类字节码文件,将增强后的执行类字节码文件通过预置的探针加载到预置的程序虚拟机;响应于程序虚拟机为线程池创建实例对象,将增强后的执行类字节码文件注入至实例对象;响应于通过拦截器拦截到程序虚拟机运行实例对象,利用数据采集逻辑采集实例对象对应的线程池运行时的数据,以对线程池的运行状态进行监控。
Description
技术领域
本申请实施例涉及系统监控的技术领域,尤其涉及线程池监控方法、装置、电子设备及存储介质。
背景技术
在相关的线程池的监控技术中,需要对线程池及其所运行的应用程序本身进行一定程度上的修改,才能够对线程池进行监控。
进一步地,对线程池及其应用程序进行修改而非程序外包的方式,不仅将导致对线程池的监控手段十分繁琐且不灵活,还导致用户的使用应用程序时的体验较差。
基于此,需要一种能够实现避免通过修改来进行监控的方案。
发明内容
有鉴于此,本申请实施例提供了一种线程池监控方法、装置、电子设备及存储介质,以解决对线程池及其应用程序进行修改才能进行监控的问题。
基于上述目的,本申请实施例提供了一种线程池监控方法,包括:
对于预置的多个线程池中的每一个,确定该线程池的执行类,并确定所述执行类的执行类字节码文件;
在所述执行类字节码文件中构建数据采集逻辑,并在所述执行类字节码文件中设置拦截器,得到增强后的执行类字节码文件,将所述增强后的执行类字节码文件通过预置的探针加载到预置的程序虚拟机;
响应于所述程序虚拟机为所述线程池创建实例对象,将所述增强后的执行类字节码文件注入至所述实例对象;
响应于通过所述拦截器拦截到所述程序虚拟机运行所述实例对象,利用所述数据采集逻辑采集所述实例对象对应的所述线程池运行时的数据,以对所述线程池的运行状态进行监控。
进一步地,在所述执行类字节码文件中构建数据采集逻辑,包括:
构建采集所述线程池的注册信息的第一采集字段;
构建采集所述线程池的运行信息的第二采集字段;
将所述第一采集字段和所述第二采集字段嵌入至所述执行类字节码文件内。
进一步地,将所述第一采集字段和所述第二采集字段嵌入至所述执行类字节码文件内,包括:
在所述执行类中定义所述第一采集字段和所述第二采集字段;
将所述第一采集字段和所述第二采集字段作为所述执行类的对象,并在所述执行类字节码文件中进行定义;
利用所述构造器对定义后的所述第一采集字段和所述第二采集字段进行初始化。
进一步地,程序虚拟机为所述线程池创建实例对象,将所述增强后的执行类字节码文件注入至所述实例对象,包括:
通过预设的线程池管理程序,将所述多个线程池中的每一个进行实例化,得到该线程池的实例对象;
将全部所述多个线程池各自的实例对象组成线程池实例集合;
遍历所述线程池实例集合中的各个实例对象,将所述执行类字节码文件注入至运行所述各个实例对象的各个线程池。
进一步地,利用所述数据采集逻辑采集所述实例对象对应的所述线程池运行时的数据,包括:
利用所述第一采集字段,采集所述线程池的所述注册信息;
利用所述第二采集字段,采集所述线程池的所述运行信息;
根据采集到的所述注册信息和所述运行信息,判断所述线程池的运行状态是否正常。
进一步地,采集所述线程池的所述注册信息,包括:
确定所述线程池的注册标识;
采集所述线程池中常驻的线程的核心线程数量;
采集所述线程池容纳线程的最大线程数量;
确定所述线程池中线程在阻塞时的阻塞队列类型;
对于发给所述线程池的任务,采集所述线程池运行时容纳所述任务的队列容量;
为所述线程池创建堆栈,并将所述注册标识、所述核心线程数量、所述最大线程数量、所述阻塞队列类型和所述队列容量插入至所述堆栈。
进一步地,采集所述线程池的所述运行信息,
按照预定的时间间隔,执行操作:
采集所述线程池当前活跃的线程的数量;
采集所述线程池当前全部的线程的数量;
采集所述线程池容纳线程的最大线程数量;
在发给所述线程池的任务中,采集所述线程池拒绝的任务的数量;
将所述当前活跃的线程的数量、所述当前全部的线程的数量、所述最大线程数量和拒绝的任务的数量构成时序数据。
本申请实施例还提供了一种线程池监控装置,包括:执行类字节码文件确定模块、数据采集逻辑设置模块、实例对象处理模块和采集模块;
其中,所述执行类字节码文件确定模块,被配置为,对于预置的多个线程池中的每一5个,确定该线程池的执行类,并确定所述执行类的执行类字节码文件;
所述数据采集逻辑设置模块,被配置为,在所述执行类字节码文件中构建数据采集逻辑,并在所述执行类字节码文件中设置拦截器,得到增强后的执行类字节码文件,将所述增强后的执行类字节码文件通过预置的探针加载到预置的程序虚拟机;
所述实例对象处理模块,被配置为,响应于所述程序虚拟机为所述线程池创建实例对0象,将所述增强后的执行类字节码文件注入至所述实例对象;
所述采集模块,被配置为,响应于通过所述拦截器拦截到所述程序虚拟机运行所述实例对象,利用所述数据采集逻辑采集所述实例对象对应的所述线程池运行时的数据,以对所述线程池的运行状态进行监控。
本申请实施例还提供了一种电子设备,包括存储器、处理器及存储在存储器上并可在5处理器上运行的计算机程序,所述处理器执行所述程序时实现如上任意一项所述的线程池
监控方法。
本申请实施例还提供了一种非暂态计算机可读存储介质,其中,所述非暂态计算机可读存储介质存储计算机指令,所述计算机指令用于使所述计算机执行如上述线程池监控方法。
0本申请实施例中提供的一个或多个技术方案,通过对线程池的执行类注入数据采集逻
辑,来实现对执行类的增强,也就是说,通过对执行类字节码中嵌入数据采集逻辑相关的新的字节码,来得到增强后的执行类字节码文件,并基于此利用探针来将其加载至程序虚拟机,以避免对线程池及其运行的应用程序的修改。
进一步地,基于设置的探针,实现了令程序虚拟机可以在创建实例对象时,及时注入5增强后的执行类字节码文件,并在通过设置的拦截器,能够及时获知实例对象的运行,并
在其运行时,令数据采集逻辑及时介入来对运行状态下的线程池进行数据的采集,基于此,实现了以外包的方式对线程池的监控。
附图说明
0在下面结合附图对于示例性实施例的描述中,本发明的更多细节、特征和优点被公开,
在附图中:
图1示出了根据本申请示例性实施例的线程池监控方法的流程图;
图2示出了根据本申请示例性实施例的线程池监控数据流的示意图;
图3示出了根据本申请示例性实施例的数据构建采集逻辑的流程图;
图4示出了根据本申请示例性实施例的线程池监控装置的示意性框图;
图5示出了能够用于实现本申请的实施例的示例性电子设备的结构框图。
具体实施方式
下面将参照附图更详细地描述本申请的实施例。虽然附图中显示了本申请的某些实施例,然而应当理解的是,本申请可以通过各种形式来实现,而且不应该被解释为限于这里阐述的实施例,相反提供这些实施例是为了更加透彻和完整的理解本申请。应当理解的是,本申请的附图及实施例仅用于示例性作用,并非用于限制本申请的保护范围。
应当理解,本申请的方法实施方式中记载的各个步骤可以按照不同的顺序执行,和/或并行执行。此外,方法实施方式可以包括附加的步骤和/或省略执行示出的步骤。本申请的范围在此方面不受限制。
本文使用的术语“包括”及其变形是开放性包括,即“包括但不限于”。术语“基于”是“至少部分地基于”。术语“一个实施例”表示“至少一个实施例”;术语“另一实施例”表示“至少一个另外的实施例”;术语“一些实施例”表示“至少一些实施例”。其他术语的相关定义将在下文描述中给出。需要注意,本申请中提及的“第一”、“第二”等概念仅用于对不同的装置、模块或单元进行区分,并非用于限定这些装置、模块或单元所执行的功能的顺序或者相互依存关系
需要注意,本申请中提及的“一个”、“多个”的修饰是示意性而非限制性的,本领域技术人员应当理解,除非在上下文另有明确指出,否则应该理解为“一个或多个”。
本申请实施方式中的多个装置之间所交互的消息或者信息的名称仅用于说明性的目的,而并不是用于对这些消息或信息的范围进行限制。
如背景技术部分所述,相关的线程池监控方法还难以满足实际生产的需要。
申请人在实现本申请的过程中发现,相关的线程池监控方法存在的主要问题在于:在相关的线程池的监控技术中,需要对线程池及其所运行的应用程序本身进行一定程度上的修改,才能够对线程池进行监控。
进一步地,对线程池及其应用程序进行修改而非程序外包的方式,不仅将导致对线程池的监控手段十分繁琐且不灵活,还导致用户的使用应用程序时的体验较差。
基于此,本申请中的一个或多个实施例提供了线程池监控方法。
在本申请的实施例中,将JAVA语言作为线程池的运行环境,其中,线程池包括有多个线程,每个线程作为操作系统进行运算和调度时的最小单位,可见,操作系统可以将任务分配给线程池,并由线程池分配至各个线程进行执行。
以下参照附图描述本申请的方案。
参考图1,本申请一个实施例的线程池监控方法,包括以下步骤:
步骤S101、对于预置的多个线程池中的每一个,确定该线程池的执行类,并确定所述执行类的执行类字节码文件。
在本申请的实施例中,将预置的多个线程池作为被监控的线程池,基于各个线程池的构造,可以确定各个线程池的执行类,以及,关于各个执行类的执行类Class文件(执行类字节码文件)。
具体地,本实施例中预置的线程池可以通过定义多个参数,来构建线程池执行时的执行类。
其中,可以将执行类表示为ThreadPoolExecutor。
在本实施例中,在ThreadPoolExecutor类中,可以定义以下7个参数:CorePoolSize、MaximunPoolSize、KeepAliveTime、Unit、WorkQueue、ThreadFactory和Handler。
其中,CorePoolSize表示核心线程数量,也即,在该线程池中常驻的线程的数量;
MaximunPoolSize表示最大线程数量,也即,该线程池所能够容纳的线程的最大数量;
KeepAliveTime表示存活时间,具体地,表示了该线程池中的各线程在执行完任务后能够存活的时间;
Unit表示了各线程关于存活时间的计量单位,可以是例如秒或毫秒等;
WorkQueue表示该线程池的阻塞队列,具体地,当核心线程均满载时,之后的其他任务将进入到阻塞队列,并等待将其分配至线程。
ThreadFactory表示线程工厂,具体地,用于创建各个线程;
Handler表示该线程池所执行的拒绝策略,具体地,该拒绝策略被配置为,当该线程池中存在的线程数量超过上述的最大线程数量时,分配至该线程池的任务将会被拒绝。
在一些实施例中,还可以包括队列容量,并将其用于描述该线程池在运行时,所能容纳的任务的数量。
在本实施例中,基于上述定义的7个参数,可以创建该线程池的ThreadPoolExecutor类,可以看出该ThreadPoolExecutor类用于具体的定义该线程池的运行逻辑。
进一步地,在本实施例中可以使用JAVA语言来描述上述该ThreadPoolExecutor类的定义,并形成Class文件(字节码文件),也即执行类Class文件,其中,该执行类Class文件描述了ThreadPoolExecutor类中上述的各个参数。
可以看出,基于上述线程池的构建方式,可以确定该线程池的ThreadPoolExecutor类,也即执行类,并确定以代码描述该ThreadPoolExecutor类的Class文件,也即执行类Class文件。
步骤S102、在所述执行类字节码文件中构建数据采集逻辑,并在所述执行类字节码文件中设置拦截器,得到增强后的执行类字节码文件,将所述增强后的执行类字节码文件通过预置的探针加载到预置的程序虚拟机。
在本申请的实施例中,根据图2示出的线程池监控数据流的示意图,可以看出,基于上述确定的线程池的ThreadPoolExecutor类的Class文件,可以通过在该ThreadPoolExecutor类的Class文件中注入新增的字节码的方式,来注入监控线程池的逻辑,并将注入的新增的字节码视为字节码增强类,可见,注入字节码的过程可以视为对ThreadPoolExecutor类的Class文件的字节码增强过程,也即,图2示出的,在字节码注入的部分,通过预置的Class Loader类(字节码文件加载类)将字节码注入至ThreadPoolExecutor类中,其中,图2中从Class loader指向ThreadPoolExecutor的箭头表示了字节码增强的过程中,数据流的方向。
在本实施例中,基于监控线程池的需要,可以为字节码增强类定义了数据采集逻辑,也即,采集线程池相关信息的字段,并可以将采集相关信息的字段以字节码的形式注入至ThreadPoolExecutor类中的构造器;并还可以通过在该ThreadPoolExecutor类中设计拦截器,来拦截该线程池接收到的任务,以获知该线程池的运行信息。
在具体的示例中,可以通过在该ThreadPoolExecutor类中构建新的ByteBuddy,并在新构建的ByteBuddy中定义字节码增强类和并重新定义注入字节码的构造器,如上所述,并进一步在ThreadPoolExecutor类中加入拦截器。
其中,ByteBuddy是生成字节码生成和操作字节码的库,用于在JAVA应用程序运行时,创建和修改JAVA的类,而无需编译器的帮助;进一步地,Byte Buddy还允许创建任意类,并且不限于实现用于创建运行时代理的接口;可以看出,Byte Buddy提供了一种方便的应用程序界面,可以使用JAVA代理或者在构建过程中手动更改已经定义的类,或者说,对当前的类进行增强。
可以看出,基于上述的构建过程,可以得到增强后的ThreadPoolExecutor类。
进一步地,基于得到的增强后的ThreadPoolExecutor类,可以对其执行编译过程,并在编译后得到增强后的ThreadPoolExecutor类的Class文件,也即,增强后的执行类字节码文件。
进一步地,可以将增强后的执行类字节码文件通过探针重新加载至JAVA虚拟机中。
在本实施例中,可以将JAVA虚拟机作为运行本方法的计算机系统的一个具体示例。
具体地,如下字段所示:
.load(ThreadPoolExecutor.class.getClassLoader(),
ClassReloadingStrategy.fromInstalledAgent());
可以看出,在将执行类字节码文件加载至JAVA虚拟机的过程中,也即对字段中的ThreadPoolExecutor.class.进行加载时,可以通过预置的Agent(探针或者代理),来完成加载至JAVA虚拟机的过程。
可以看出,基于上述增强后的执行类字节码文件,在将其通过Agent进行加载后,可以在JAVA虚拟机运行线程池时,无需通过对实例对象,或者其他应用程序进行修改,仅通过该Agent即可对指定的线程池运行增强后的ThreadPoolExecutor类。
在本申请的其他一些实施例中,在字节码增强类中注入的监控线程池的逻辑,具体可以包括采集线程池注册信息的第一采集字段和采集线程池运行信息的第二采集字段。
如图3所示,所述在所述执行类字节码文件中构建数据采集逻辑,包括:
步骤S301、构建采集所述线程池的注册信息的第一采集字段。
在本实施例中,可以构建采集线程池的注册信息的第一采集字段,并将其注入至字节码增强类中,以从监控的多个线程池中确定当前所监控的线程池,并确定该线程池的相关注册信息。
具体地,在第一采集字段中,可以通过线程池在注册时各自的ID号码(标识号码,也即注册标识)来确定当前监控的线程池。
以如下所示的字段作为确定线程池的具体示例:
"name":"ThreadPool\/859456754\/Register"
可以看出,在该字段中,号码859456754作为该ThreadPool(线程池)的ID,Register可以视为该ID是在该线程池进行注册时生成,进一步地,将上述信息预定义为name指令。
进一步地,基于确定的线程池,可以构建对该线程池相关注册信息进行采集的字段。
其中,对相关注册信息进行采集的字段具体可以包括采集该线程池的拒绝策略、核心线程数、阻塞队列的类型、最大线程数和队列容量等。
进一步地,可以为该线程池创建堆栈,构建将上述信息插入该堆栈的逻辑。
步骤S302、构建采集所述线程池的运行信息的第二采集字段。
在本实施例中,在本实施例中,可以构建采集线程池的运行信息的第二采集字段,并将其注入至字节码增强类中,以对通过获取的线程池的运行信息来对其进行监控。
具体地,在第二采集字段中,如上所述,基于线程池的ID可以确定被监控的具体线程池,对于该线程池,可以设置固定的时间间隔,例如,每分钟采集一次,并将其作为采集周期,按照该采集周期,采集其运行时的相关运行信息,并将采集到的运行信息以Metric(时序数据)的形式上报至预置的监控平台或者其他预设的监控后台等。
其中,在每个采集周期内,可以采集该线程池中在当前采集周期内活跃的线程数、当前的总线程数、最大线程数、当前阻塞队列中的任务数,以及,在该采集周期内拒绝的任务数。
步骤S303、将所述第一采集字段和所述第二采集字段嵌入至所述执行类字节码文件内。
在本实施例中,基于前述步骤中构建的第一采集字段和第二采集字段,可以将该第一采集字段和第二采集字段作为采集线程池运行信息的数据采集逻辑,并将其以字节码的形式注入至ThreadPoolExecutor类的Class文件中,也即,嵌入至执行类字节码文件内,以得到增强后的执行类字节码文件。
步骤S103、响应于所述程序虚拟机为所述线程池创建实例对象,将所述增强后的执行类字节码文件注入至所述实例对象。
在本申请的实施例中,基于上述增强后的执行类字节码文件,在为线程池创建实例对象时,将其注入至该实例对象,以对运行该实例对象的线程池进行监控。
具体地,在本实施例中,对于构建出的多个线程池,可以通过预置的执行管理类,将对各个线程池进行实例化,也就是说,为各个线程池分配需要运行的应用程序等,基于此,可以得到为各个线程池创建的实例对象。
在一些实施例中,执行管理类可以表示为ThreadPoolManager类,
进一步地,如图2所示,可以将实例化的线程池全部放入一个集合中,并将其作为线程池实例集合。
可以看出,在该线程池实例集合中,包含有多个线程池各自的实例对象,在本实施例中可以将各个实例对象排列为定时采集队列,并作为待进行数据采集的线程池。
进一步地,基于前述步骤中构建的增强后的ThreadPoolExecutor类的Class文件,可以在JAVA虚拟机为各个线程池创建实例对象时,可以将增强后的ThreadPoolExecutor类的Class文件注入至线程池实例集合中的定时采集队列。
具体地,可以通过遍历带该定时采集队列中的各个实例对象,来将增强后的ThreadPoolExecutor类的Class文件分别注入运行各个实例对象的各个线程池。
步骤S104、响应于通过所述拦截器拦截到所述程序虚拟机运行所述实例对象,利用所述数据采集逻辑采集所述实例对象对应的所述线程池运行时的数据,以对所述线程池的运行状态进行监控。
在本申请的实施例中,基于前述步骤中在执行类中构建的拦截器,可以拦截上述运行的各个实例对象,也即,拦截到所运行的应用程序发来的任务,并根据上述步骤中的数据采集逻辑来采集运行实例对象的线程池的数据,以通过该数据对该线程池的运行情况进行监控。
在本实施例中,如上所述,各个实例对象用于描述虚拟机通过调度线程池来运行的各个应用程序,在虚拟机线程池运行各个应用程序时,该线程池将收到需要运行的任务时,通过遍历定时采集队列中的各个线程池,拦截器可以及时拦截到该任务,基于此,可以及时获知线程池所运行的任务。
基于此,在该线程池运行该任务时,可以令数据采集逻辑,也即第一采集字段和第二采集字段对该线程池运行的数据进行采集。
具体地,根据前述步骤中构建的第一采集字段,可以确定,在虚拟机运行实例对象时,增强后的ThreadPoolExecutor类可以通过该第一采集字段采集运行该实例对象的线程池的注册信息,并具体包括:ID号码(也即,注册标识)、核心线程数、最大线程数、阻塞队列类型、队列容量。
进一步地,基于前述步骤构建的堆栈,可以将上述采集的注册信息插入至该堆栈,并在该线程池出现运行问题时,通过堆栈中插入的注册信息来进行排查。
根据前述步骤中构建的第二采集字段,可以确定,在虚拟机运行实例对象时,增强后的ThreadPoolExecutor类可以在当前的采集周期内,通过该第二采集字段采集运行该实例对象的线程池的运行信息,并具体包括:当前活跃的线程的数量、当前全部的线程的数量、最大线程数量、该线程池拒绝的任务的数量。
进一步地,根据前述步骤中,在第二采集字段中构建的采集逻辑,可以将上述采集到的运行信息构成时序数据,并在该采集周期结束后,将该采集周期的时序数据上报至预置的监控平台或者预设的监控后台等。
在本实施例中,基于上述采集到的注册信息和运行信息,实时观察线程池的原型状态。
具体地,可以通过设置多个条件,并在一个或多个条件达到时,触发告警;例如,当队列数大于预设的队列阈值时,或者,当拒绝的任务数量不为0时,或者,当前活跃的线程数等于最大线程数时,触发线程池的运行告警,以令监控者能够及时获知线程池当前的满载情况。
在一些其他实施例中,对于线程池运行时的告警,也可以指定其他指令,例如,满足上述两个或者全部的条件时触发告警。
可见,本申请实施例的线程池监控方法,通过对线程池的执行类注入数据采集逻辑,来实现对执行类的增强,也就是说,通过对执行类字节码中嵌入数据采集逻辑相关的新的字节码,来得到增强后的执行类字节码文件,并基于此利用探针来将其加载至程序虚拟机,以避免对线程池及其运行的应用程序的修改。
进一步地,基于设置的探针,实现了令程序虚拟机可以在创建实例对象时,及时注入增强后的执行类字节码文件,并在通过设置的拦截器,能够及时获知实例对象的运行,并在其运行时,令数据采集逻辑及时介入来对运行状态下的线程池进行数据的采集,基于此,实现了以外包的方式对线程池的监控。
与上述任意实施例方法相对应的,本申请的实施例还提供了一种线程池监控装置。
参考图4,所述线程池监控装置400,包括:执行类字节码文件确定模块401、数据采集逻辑设置模块402、实例对象处理模块403和采集模块404。
其中,所述执行类字节码文件确定模块401,被配置为,对于预置的多个线程池中的每一个,确定该线程池的执行类,并确定所述执行类的执行类字节码文件。
所述数据采集逻辑设置模块402,被配置为,在所述执行类字节码文件中构建数据采集逻辑,并在所述执行类字节码文件中设置拦截器,得到增强后的执行类字节码文件,将所述增强后的执行类字节码文件通过预置的探针加载到预置的程序虚拟机。
所述实例对象处理模块403,被配置为,响应于所述程序虚拟机为所述线程池创建实例对象,将所述增强后的执行类字节码文件注入至所述实例对象。
所述采集模块404,被配置为,响应于通过所述拦截器拦截到上述程序虚拟机运行所述实例对象,利用所述数据采集逻辑采集所述实例对象对应的所述线程池运行时的数据,以对所述线程池的运行状态进行监控。
进一步地,数据采集逻辑设置模块402,具体被配置为:构建采集所述线程池的注册信息的第一采集字段;构建采集所述线程池的运行信息的第二采集字段;将所述第一采集字段和所述第二采集字段嵌入至所述执行类字节码文件内。
进一步地,将所述第一采集字段和所述第二采集字段嵌入至所述执行类字节码文件内,包括:在所述执行类中定义所述第一采集字段和所述第二采集字段;将所述第一采集字段和所述第二采集字段作为所述执行类的对象,并在所述执行类字节码文件中进行定义;利用所述构造器对定义后的所述第一采集字段和所述第二采集字段进行初始化。
进一步地,程序虚拟机为所述线程池创建实例对象,将所述增强后的执行类字节码文件注入至所述实例对象,包括:通过预设的线程池管理程序,将所述多个线程池中的每一个进行实例化,得到该线程池的实例对象;将全部所述多个线程池各自的实例对象组成线程池实例集合;遍历所述线程池实例集合中的各个实例对象,将所述执行类字节码文件注入至运行所述各个实例对象的各个线程池。
进一步地,采集模块404利用所述数据采集逻辑采集所述实例对象对应的所述线程池运行时的数据,具体包括:利用所述第一采集字段,采集所述线程池的所述注册信息;利用所述第二采集字段,采集所述线程池的所述运行信息;根据采集到的所述注册信息和所述运行信息,判断所述线程池的运行状态是否正常。
进一步地,采集所述线程池的所述注册信息,包括:确定所述线程池的注册标识;采集所述线程池中常驻的线程的核心线程数量;采集所述线程池容纳线程的最大线程数量;确定所述线程池中线程在阻塞时的阻塞队列类型;对于发给所述线程池的任务,采集所述线程池运行时容纳所述任务的队列容量;为所述线程池创建堆栈,并将所述注册标识、所述核心线程数量、所述最大线程数量、所述阻塞队列类型和所述队列容量插入至所述堆栈。
进一步地,采集所述线程池的所述运行信息,
按照预定的时间间隔,执行操作:
采集所述线程池当前活跃的线程的数量;
采集所述线程池当前全部的线程的数量;
采集所述线程池容纳线程的最大线程数量;
在发给所述线程池的任务中,采集所述线程池拒绝的任务的数量;
将所述当前活跃的线程的数量、所述当前全部的线程的数量、所述最大线程数量和拒绝的任务的数量构成时序数据。
本申请示例性实施例还提供一种电子设备,包括:至少一个处理器;以及与至少一个处理器通信连接的存储器。所述存储器存储有能够被所述至少一个处理器执行的计算机程序,所述计算机程序在被所述至少一个处理器执行时用于使所述电子设备执行根据本申请实施例的方法。
本申请示例性实施例还提供一种存储有计算机程序的非瞬时计算机可读存储介质,其中,所述计算机程序在被计算机的处理器执行时用于使所述计算机执行根据本申请实施例的方法。
本申请示例性实施例还提供一种计算机程序产品,包括计算机程序,其中,所述计算机程序在被计算机的处理器执行时用于使所述计算机执行根据本申请实施例的方法。
参考图5,现将描述可以作为本申请的服务器或客户端的电子设备500的结构框图,其是可以应用于本申请的各方面的硬件设备的示例。电子设备旨在表示各种形式的数字电子的计算机设备,诸如,膝上型计算机、台式计算机、工作台、个人数字助理、服务器、刀片式服务器、大型计算机、和其它适合的计算机。电子设备还可以表示各种形式的移动装置,诸如,个人数字处理、蜂窝电话、智能电话、可穿戴设备和其它类似的计算装置。本文所示的部件、它们的连接和关系、以及它们的功能仅仅作为示例,并且不意在限制本文中描述的和/或者要求的本申请的实现。
如图5所示,电子设备500包括计算单元501,其可以根据存储在只读存储器(ROM)502中的计算机程序或者从存储单元508加载到随机访问存储器(RAM)503中的计算机程序,来执行各种适当的动作和处理。在RAM 503中,还可存储设备500操作所需的各种程序和数据。计算单元501、ROM 502以及RAM 503通过总线504彼此相连。输入/输出(I/O)接口505也连接至总线504。
电子设备500中的多个部件连接至I/O接口505,包括:输入单元506、输出单元507、存储单元508以及通信单元509。输入单元506可以是能向电子设备500输入信息的任何类型的设备,输入单元506可以接收输入的数字或字符信息,以及产生与电子设备的用户设置和/或功能控制有关的键信号输入。输出单元507可以是能呈现信息的任何类型的设备,并且可以包括但不限于显示器、扬声器、视频/音频输出终端、振动器和/或打印机。存储单元504可以包括但不限于磁盘、光盘。通信单元509允许电子设备500通过诸如因特网的计算机网络和/或各种电信网络与其他设备交换信息/数据,并且可以包括但不限于调制解调器、网卡、红外通信设备、无线通信收发机和/或芯片组,例如蓝牙TM设备、WiFi设备、WiMax设备、蜂窝通信设备和/或类似物。
计算单元501可以是各种具有处理和计算能力的通用和/或专用处理组件。计算单元501的一些示例包括但不限于中央处理单元(CPU)、图形处理单元(GPU)、各种专用的人工智能(AI)计算芯片、各种运行机器学习模型算法的计算单元、数字信号处理器(DSP)、以及任何适当的处理器、控制器、微控制器等。计算单元501执行上文所描述的各个方法和处理。例如,在一些实施例中,前述的线程池监控方法可被实现为计算机软件程序,其被有形地包含于机器可读介质,例如存储单元508。在一些实施例中,计算机程序的部分或者全部可以经由ROM 502和/或通信单元509而被载入和/或安装到电子设备500上。在一些实施例中,计算单元501可以通过其他任何适当的方式(例如,借助于固件)而被配置为执行前述任意实施例的线程池监控方法。
用于实施本申请的方法的程序代码可以采用一个或多个编程语言的任何组合来编写。这些程序代码可以提供给通用计算机、专用计算机或其他可编程数据处理装置的处理器或控制器,使得程序代码当由处理器或控制器执行时使流程图和/或框图中所规定的功能/操作被实施。程序代码可以完全在机器上执行、部分地在机器上执行,作为独立软件包部分地在机器上执行且部分地在远程机器上执行或完全在远程机器或服务器上执行。
在本申请的上下文中,机器可读介质可以是有形的介质,其可以包含或存储以供指令执行系统、装置或设备使用或与指令执行系统、装置或设备结合地使用的程序。机器可读介质可以是机器可读信号介质或机器可读储存介质。机器可读介质可以包括但不限于电子的、磁性的、光学的、电磁的、红外的、或半导体系统、装置或设备,或者上述内容的任何合适组合。机器可读存储介质的更具体示例会包括基于一个或多个线的电气连接、便携式计算机盘、硬盘、随机存取存储器(RAM)、只读存储器(ROM)、可擦除可编程只读存储器(EPROM或快闪存储器)、光纤、便捷式紧凑盘只读存储器(CD-ROM)、光学储存设备、磁储存设备、或上述内容的任何合适组合。
如本申请使用的,术语“机器可读介质”和“计算机可读介质”指的是用于将机器指令和/或数据提供给可编程处理器的任何计算机程序产品、设备、和/或装置(例如,磁盘、光盘、存储器、可编程逻辑装置(PLD)),包括,接收作为机器可读信号的机器指令的机器可读介质。术语“机器可读信号”指的是用于将机器指令和/或数据提供给可编程处理器的任何信号。
为了提供与用户的交互,可以在计算机上实施此处描述的系统和技术,该计算机具有:用于向用户显示信息的显示装置(例如,CRT(阴极射线管)或者LCD(液晶显示器)监视器);以及键盘和指向装置(例如,鼠标或者轨迹球),用户可以通过该键盘和该指向装置来将输入提供给计算机。其它种类的装置还可以用于提供与用户的交互;例如,提供给用户的反馈可以是任何形式的传感反馈(例如,视觉反馈、听觉反馈、或者触觉反馈);并且可以用任何形式(包括声输入、语音输入或者、触觉输入)来接收来自用户的输入。
可以将此处描述的系统和技术实施在包括后台部件的计算系统(例如,作为数据服务器)、或者包括中间件部件的计算系统(例如,应用服务器)、或者包括前端部件的计算系统(例如,具有图形用户界面或者网络浏览器的用户计算机,用户可以通过该图形用户界面或者该网络浏览器来与此处描述的系统和技术的实施方式交互)、或者包括这种后台部件、中间件部件、或者前端部件的任何组合的计算系统中。可以通过任何形式或者介质的数字数据通信(例如,通信网络)来将系统的部件相互连接。通信网络的示例包括:局域网(LAN)、广域网(WAN)和互联网。
计算机系统可以包括客户端和服务器。客户端和服务器一般远离彼此并且通常通过通信网络进行交互。通过在相应的计算机上运行并且彼此具有客户端-服务器关系的计算机程序来产生客户端和服务器的关系。
Claims (10)
1.一种线程池监控方法,其特征在于,包括:
对于预置的多个线程池中的每一个,确定该线程池的执行类,并确定所述执行类的执行类字节码文件;
在所述执行类字节码文件中构建数据采集逻辑,并在所述执行类字节码文件中设置拦截器,得到增强后的执行类字节码文件,将所述增强后的执行类字节码文件通过预置的探针加载到预置的程序虚拟机;
响应于所述程序虚拟机为所述线程池创建实例对象,将所述增强后的执行类字节码文件注入至所述实例对象;
响应于通过所述拦截器拦截到所述程序虚拟机运行所述实例对象,利用所述数据采集逻辑采集所述实例对象对应的所述线程池运行时的数据,以对所述线程池的运行状态进行监控。
2.根据权利要求1所述的线程池监控方法,其特征在于,所述在所述执行类字节码文件中构建数据采集逻辑,包括:
构建采集所述线程池的注册信息的第一采集字段;
构建采集所述线程池的运行信息的第二采集字段;
将所述第一采集字段和所述第二采集字段嵌入至所述执行类字节码文件内。
3.根据权利要求2所述的线程池监控方法,其特征在于,所述将所述第一采集字段和所述第二采集字段嵌入至所述执行类字节码文件内,包括:
在所述执行类中定义所述第一采集字段和所述第二采集字段;
将所述第一采集字段和所述第二采集字段作为所述执行类的对象,并在所述执行类字节码文件中进行定义;
利用所述构造器对定义后的所述第一采集字段和所述第二采集字段进行初始化。
4.根据权利要求1所述的线程池监控方法,其特征在于,所述程序虚拟机为所述线程池创建实例对象,将所述增强后的执行类字节码文件注入至所述实例对象,包括:
通过预设的线程池管理程序,将所述多个线程池中的每一个进行实例化,得到该线程池的实例对象;
将全部所述多个线程池各自的实例对象组成线程池实例集合;
遍历所述线程池实例集合中的各个实例对象,将所述执行类字节码文件注入至运行所述各个实例对象的各个线程池。
5.根据权利要求2所述的线程池监控方法,其特征在于,所述利用所述数据采集逻辑采集所述实例对象对应的所述线程池运行时的数据,包括:
利用所述第一采集字段,采集所述线程池的所述注册信息;
利用所述第二采集字段,采集所述线程池的所述运行信息;
根据采集到的所述注册信息和所述运行信息,判断所述线程池的运行状态是否正常。
6.根据权利要求5所述的线程池监控方法,其特征在于,所述采集所述线程池的所述注册信息,包括:
确定所述线程池的注册标识;
采集所述线程池中常驻的线程的核心线程数量;
采集所述线程池容纳线程的最大线程数量;
确定所述线程池中线程在阻塞时的阻塞队列类型;
对于发给所述线程池的任务,采集所述线程池运行时容纳所述任务的队列容量;
为所述线程池创建堆栈,并将所述注册标识、所述核心线程数量、所述最大线程数量、所述阻塞队列类型和所述队列容量插入至所述堆栈。
7.根据权利要求5所述的线程池监控方法,其特征在于,所述采集所述线程池的所述运行信息,
按照预定的时间间隔,执行操作:
采集所述线程池当前活跃的线程的数量;
采集所述线程池当前全部的线程的数量;
采集所述线程池容纳线程的最大线程数量;
在发给所述线程池的任务中,采集所述线程池拒绝的任务的数量;
将所述当前活跃的线程的数量、所述当前全部的线程的数量、所述最大线程数量和拒绝的任务的数量构成时序数据。
8.一种线程池监控装置,包括:执行类字节码文件确定模块、数据采集逻辑设置模块、实例对象处理模块和采集模块;
其中,所述执行类字节码文件确定模块,被配置为,对于预置的多个线程池中的每一个,确定该线程池的执行类,并确定所述执行类的执行类字节码文件;
所述数据采集逻辑设置模块,被配置为,在所述执行类字节码文件中构建数据采集逻辑,并在所述执行类字节码文件中设置拦截器,得到增强后的执行类字节码文件,将所述增强后的执行类字节码文件通过预置的探针加载到预置的程序虚拟机;
所述实例对象处理模块,被配置为,响应于所述程序虚拟机为所述线程池创建实例对象,将所述增强后的执行类字节码文件注入至所述实例对象;
所述采集模块,被配置为,响应于通过所述拦截器拦截到所述程序虚拟机运行所述实例对象,利用所述数据采集逻辑采集所述实例对象对应的所述线程池运行时的数据,以对所述线程池的运行状态进行监控。
9.一种电子设备,包括:
处理器;以及
存储程序的存储器,
其中,所述程序包括指令,所述指令在由所述处理器执行时使所述处理器执行根据权利要求1-7中任一项所述的方法。
10.一种存储有计算机指令的非瞬时计算机可读存储介质,其中,所述计算机指令用于使计算机执行根据权利要求1-7中任一项所述的方法。
Priority Applications (1)
Application Number | Priority Date | Filing Date | Title |
---|---|---|---|
CN202211732580.4A CN115981962B (zh) | 2022-12-30 | 2022-12-30 | 线程池监控方法、装置、电子设备及存储介质 |
Applications Claiming Priority (1)
Application Number | Priority Date | Filing Date | Title |
---|---|---|---|
CN202211732580.4A CN115981962B (zh) | 2022-12-30 | 2022-12-30 | 线程池监控方法、装置、电子设备及存储介质 |
Publications (2)
Publication Number | Publication Date |
---|---|
CN115981962A true CN115981962A (zh) | 2023-04-18 |
CN115981962B CN115981962B (zh) | 2024-03-12 |
Family
ID=85972033
Family Applications (1)
Application Number | Title | Priority Date | Filing Date |
---|---|---|---|
CN202211732580.4A Active CN115981962B (zh) | 2022-12-30 | 2022-12-30 | 线程池监控方法、装置、电子设备及存储介质 |
Country Status (1)
Country | Link |
---|---|
CN (1) | CN115981962B (zh) |
Cited By (1)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
CN116821893A (zh) * | 2023-08-31 | 2023-09-29 | 北京华云安信息技术有限公司 | 代码执行方法、装置、电子设备和存储介质 |
Citations (7)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
CN112764992A (zh) * | 2021-01-20 | 2021-05-07 | 网银在线(北京)科技有限公司 | 线程池的监控方法、装置及设备 |
CN113076253A (zh) * | 2021-04-16 | 2021-07-06 | 北京京东拓先科技有限公司 | 一种测试方法和测试装置 |
WO2021174838A1 (zh) * | 2020-03-06 | 2021-09-10 | 平安科技(深圳)有限公司 | Web应用资源监控方法、电子设备及计算机可读存储介质 |
CN113448585A (zh) * | 2020-12-11 | 2021-09-28 | 北京新氧科技有限公司 | 一种对线程池的优化方法、装置、电子设备和存储介质 |
CN113778659A (zh) * | 2020-10-27 | 2021-12-10 | 北京京东振世信息技术有限公司 | 多线程处理方法和装置 |
CN114356713A (zh) * | 2022-01-06 | 2022-04-15 | 北京沃东天骏信息技术有限公司 | 线程池监控方法、装置、电子设备及存储介质 |
CN114500305A (zh) * | 2022-02-09 | 2022-05-13 | 杭州义益钛迪信息技术有限公司 | 设备监控方法、装置、设备、存储介质及程序产品 |
-
2022
- 2022-12-30 CN CN202211732580.4A patent/CN115981962B/zh active Active
Patent Citations (7)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
WO2021174838A1 (zh) * | 2020-03-06 | 2021-09-10 | 平安科技(深圳)有限公司 | Web应用资源监控方法、电子设备及计算机可读存储介质 |
CN113778659A (zh) * | 2020-10-27 | 2021-12-10 | 北京京东振世信息技术有限公司 | 多线程处理方法和装置 |
CN113448585A (zh) * | 2020-12-11 | 2021-09-28 | 北京新氧科技有限公司 | 一种对线程池的优化方法、装置、电子设备和存储介质 |
CN112764992A (zh) * | 2021-01-20 | 2021-05-07 | 网银在线(北京)科技有限公司 | 线程池的监控方法、装置及设备 |
CN113076253A (zh) * | 2021-04-16 | 2021-07-06 | 北京京东拓先科技有限公司 | 一种测试方法和测试装置 |
CN114356713A (zh) * | 2022-01-06 | 2022-04-15 | 北京沃东天骏信息技术有限公司 | 线程池监控方法、装置、电子设备及存储介质 |
CN114500305A (zh) * | 2022-02-09 | 2022-05-13 | 杭州义益钛迪信息技术有限公司 | 设备监控方法、装置、设备、存储介质及程序产品 |
Cited By (2)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
CN116821893A (zh) * | 2023-08-31 | 2023-09-29 | 北京华云安信息技术有限公司 | 代码执行方法、装置、电子设备和存储介质 |
CN116821893B (zh) * | 2023-08-31 | 2023-11-28 | 北京华云安信息技术有限公司 | 代码执行方法、装置、电子设备和存储介质 |
Also Published As
Publication number | Publication date |
---|---|
CN115981962B (zh) | 2024-03-12 |
Similar Documents
Publication | Publication Date | Title |
---|---|---|
CN110806923B (zh) | 一种区块链任务的并行处理方法、装置、电子设备和介质 | |
CN112286656B (zh) | 小程序模拟方法、装置、电子设备和计算机可读存储介质 | |
CN111459754B (zh) | 异常任务的处理方法、装置、介质及电子设备 | |
CN110362401A (zh) | 数据跑批方法、装置、存储介质及集群中的成员主机 | |
CN112465466B (zh) | 流程任务执行方法、装置、计算机设备和存储介质 | |
CN115981962B (zh) | 线程池监控方法、装置、电子设备及存储介质 | |
CN112925587A (zh) | 用于初始化应用的方法和装置 | |
EP4060496A2 (en) | Method, apparatus, device and storage medium for running inference service platform | |
CN114748873B (zh) | 界面渲染方法、装置、设备和存储介质 | |
CN114091672B (zh) | 分布式模型推理方法及装置、电子设备和介质 | |
CN113377614A (zh) | 调用链信息的生成方法、装置、电子设备及存储介质 | |
US20150370599A1 (en) | Processing tasks in a distributed system | |
CN111767149B (zh) | 调度方法、装置、设备及存储设备 | |
CN112835639A (zh) | 一种Hook实现方法、装置、设备、介质及产品 | |
CN112817992A (zh) | 执行更改任务的方法、装置、电子设备以及可读存储介质 | |
US20160077948A1 (en) | Method and system for monitoring health of a virtual environment | |
CN113778418A (zh) | 基于图形化编程的多线程脚本生成方法和装置 | |
CN113127162B (zh) | 自动化任务执行方法、装置、电子设备及计算机存储介质 | |
CN110704203B (zh) | 一种可中断的远程过程调用方法及装置 | |
CN112559073A (zh) | 程序启动方法、类间关系构建方法及装置、移动终端 | |
CN114386577A (zh) | 用于执行深度学习模型的方法、设备和存储介质 | |
CN113051122A (zh) | 性能数据获取方法、装置、电子设备和介质 | |
US9032425B1 (en) | System and method to boost application performance by using a proxy for executing synchronous application programming interface calls | |
CN110609756A (zh) | 读数方法、电子装置、计算机设备及存储介质 | |
WO2017210034A1 (en) | Asynchronous sequential processing execution |
Legal Events
Date | Code | Title | Description |
---|---|---|---|
PB01 | Publication | ||
PB01 | Publication | ||
SE01 | Entry into force of request for substantive examination | ||
SE01 | Entry into force of request for substantive examination | ||
GR01 | Patent grant | ||
GR01 | Patent grant |