线程死循环检测方法和装置
技术领域
本发明涉及计算机领域,尤其涉及一种线程死循环检测方法和装置。
背景技术
在Linux操作系统中,通常采用公平调度模型,在检测线程死循环时,通常采用请求响应的查询方法,即创建检测线程,该检测线程周期性向其他所有线程发送查询消息等待其他线程响应回复消息,如果在几个查询周期中,检测线程都未收到某个线程的回复消息,则认为该线程出现了死循环。其中,完全公平调度(CFS,completely fail schedule)为Linux系统进程/线程调度器的一种调度方法,特点是根据各个调度对象的权重来分配运行时间;死循环是指多线程系统中,某个线程一直在运行一小段逻辑,没有跳出该段逻辑,去执行线程应该运行的其他正常逻辑。此种情况为线程软件中不正常现场,需要排查软件错误并解决。
但是上述方案会为被检测线程带来额外系统开销,因为被检测线程需要消耗时间片用于接收并回复查询消息。
发明内容
本发明的实施例提供一种线程死循环检测方法和装置,用于解决在Linux系统的公平调度模型中根据请求响应的查询方法会消耗被检测线程资源的问题。
为达到上述目的,本发明的实施例采用如下技术方案:
第一方面,提供了一种线程死循环检测方法,应用于Linux系统的公平调度模型,该方法包括:
分别统计在[1,M]周期内的中央处理单元CPU内核利用率,M为正整数且M>1;
如果在[1,N]周期内的CPU内核利用率均大于第一门限,则获取所述[1,N]周期内的CPU占用率最高的线程作为关注线程,N为正整数且1<N<M;
分别统计在[N,M]周期内所述关注线程的CPU占用率;
如果在所述[N,M]周期内的CPU内核利用率均大于第一门限,并且所述关注线程的CPU占用率均大于第二门限,则确定所述关注线程为死循环线程。
第二方面,提供了一种线程死循环检测装置,应用于Linux系统的公平调度模型,该装置包括:
统计单元,用于分别统计在[1,M]周期内的中央处理单元CPU内核利用率,M为正整数且M>1;
获取单元,用于如果在[1,N]周期内的CPU内核利用率均大于第一门限,则获取所述[1,N]周期内的CPU占用率最高的线程作为关注线程,N为正整数且1<N<M;
所述统计单元,还用于分别统计在[N,M]周期内所述关注线程的CPU占用率;
确定单元,用于如果在所述[N,M]周期内的CPU内核利用率均大于第一门限,并且所述关注线程的CPU占用率均大于第二门限,则确定所述关注线程为死循环线程。
本发明的实施例提供的线程死循环检测方法和装置,通过检测CPU(centralprocessing unit,中央处理单元)内核利用率来判断可能发生死循环的时机,当内核利用率持续较高时检测各个线程的CPU占用率,将CPU占用率持续较高的线程判定为死循环线程,因为是通过检测内核利用率和CPU占用率来检测线程死循环,不必与被检测线程通信交互,解决了在Linux系统的公平调度模型中根据请求响应的查询方法会消耗被检测线程资源的问题。
附图说明
为了更清楚地说明本发明实施例或现有技术中的技术方案,下面将对实施例或现有技术描述中所需要使用的附图作简单地介绍,显而易见地,下面描述中的附图仅仅是本发明的一些实施例,对于本领域普通技术人员来讲,在不付出创造性劳动的前提下,还可以根据这些附图获得其他的附图。
图1为本发明的实施例提供的一种线程死循环检测方法的流程示意图;
图2为本发明的实施例提供的一种统计在[1,M]周期内的CPU内核利用率的流程示意图;
图3为本发明的实施例提供的一种获取[1,N]周期内的CPU占用率最高的线程作为关注线程的流程示意图;
图4为本发明的实施例提供的一种统计在[N,M]周期内关注线程的CPU占用率的流程示意图;
图5为本发明的实施例提供的一种线程死循环检测装置的结构示意图。
具体实施方式
下面将结合本发明实施例中的附图,对本发明实施例中的技术方案进行清楚、完整地描述,显然,所描述的实施例仅仅是本发明一部分实施例,而不是全部的实施例。基于本发明中的实施例,本领域普通技术人员在没有做出创造性劳动前提下所获得的所有其他实施例,都属于本发明保护的范围。
本发明实施例提供的线程死循环检测方法和装置,通过单独线程检测CPU(central processing unit,中央处理单元)内核利用率,当内核利用率较高时检测线程的CPU占用率,将CPU占用率持续较高的线程判定为死循环线程,不必与被检测线程通信交互,解决了在Linux系统的公平调度模型中根据请求响应的查询方法会消耗被检测线程资源的问题。
实施例1、
本发明实施例提供了一种线程死循环检测方法,应用于Linux系统的公平调度模型,参照图1中所示,该方法包括步骤S101-S104:
S101、分别统计在[1,M]周期内的CPU内核利用率,M为正整数且M>1。
在这里将M个周期的检测作为一轮,可以在满足一定条件时提前中止本轮检测。
另外,可以在系统初始化时新建单独的检测线程,用于对业务线程进行检测。对于多核CPU可以分别获取每个内核的CPU内核利用率。优选的,每个周期的时间长度可以为20秒,M可以为9。
具体的,参照图2中所示,步骤S101可以包括:S1011-S1012。
S1011、在[1,M]周期内的第i个周期的起始时刻读取/proc/stat文件,以获取第i个周期的CPU内核运行时间;在第i+1个周期的起始时刻读取/proc/stat文件,以获取第i+1个周期的CPU内核运行时间,1≤i<M。
在Linux系统中每个/proc/stat会统计当前CPU各个内核运行时间,此处的内核运行时间为绝对时间值,例如2000001秒。
S1012、根据(第i+1个周期的CPU内核运行时间-第i个周期CPU的内核运行时间)/每个周期时间长度得到第i个周期的CPU内核利用率。
即根据第i+1个周期的CPU内核运行时间减去第i个周期CPU的内核运行时间的差除以每个周期时间长度得到第i个周期的CPU内核利用率。
示例性的,对于每个周期的时间长度为20秒时,可以根据(20秒时CPU内核运行时间-0秒时CPU内核运行时间)/20秒得到第一个周期的CPU内核利用率。
S102、如果在[1,N]周期内的CPU内核利用率均大于第一门限,则获取[1,N]周期内的CPU占用率最高的线程作为关注线程,N为正整数且1<N<M。
优选的,第一门限为95%,N为2。在[1,N]周期内CPU内核利用率均大于第一门限时,可能在该内核上存在死循环任务,也可能是正常任务因为计算量较大而需要占用较高的CPU内核利用率。如果在[1,N]周期内的任一周期中出现CPU内核利用率小于第一门限,则可以确定是正常任务结束使得CPU内核利用率降低,因此退出本轮检测,重新开始新一轮的检测,即重新开始步骤S101。
具体的,参照图3中所示,获取[1,N]周期内的CPU占用率最高的线程作为关注线程可以包括步骤S1021-S1023:
S1021、在[1,N]周期内的第N-1个周期的结束时刻读取/proc/PID/stat文件,以获取所有线程在第N-1个周期的运行时间;在第N个周期的结束时刻读取/proc/PID/stat文件,以获取所有线程在第N个周期的运行时间。
具体的,对于每个线程均可以得到该线程在第N-1个周期的运行时间和在第N个周期的运行时间。
S1022、将各个线程的第N个周期的运行时间减去第N-1个周期的运行时间得到各个线程的时间差值。
具体的,将每个线程在第N个周期的运行时间减去该线程在第N-1个周期的运行时间可以得到该线程的时间差值。
S1023、获取各个线程的时间差值中的最大值,将最大值对应的线程作为关注线程。
具体的,可以根据时间差值按照从大到小对各线程进行排序,最大值对应的线程即为关注线程。
S103、分别统计在[N,M]周期内关注线程的CPU占用率。
具体的,参照图4中所示,该步骤可以包括步骤S1031-S1032:
S1031、在[N,M]周期内的第j-1个周期的结束时刻读取/proc/PID/stat文件,以获取关注线程在第j-1个周期的运行时间;在第j个周期的结束时刻读取/proc/PID/stat文件,以获取关注线程在第j个周期的运行时间,N<j≤M;
S1032、根据(关注线程在第j个周期的运行时间-关注线程在第j-1个周期的运行时间)/每个周期时间长度得到关注线程在第j个周期的CPU占用率。
S104、如果在[N,M]周期内的CPU内核利用率均大于第一门限,并且关注线程的CPU占用率均大于第二门限,则确定关注线程为死循环线程。
优选的,第二门限为60%,属于单线程的CPU占用率门限。对于[N,M]周期内的任一周期均满足CPU内核利用率均大于第一门限,并且关注线程的CPU占用率均大于第二门限,才能确定该关注线程为死循环线程。当关注线程确定存在死循环时,则搜集该线程的堆栈信息,堆栈信息收集三次,每个之间间隔1个毫秒,主要为了多次收集死循环线程的堆栈,得到清晰的线程函数调用关系,便于定位问题,同时记录CPU高和死循环线程的系统日志信息。
本发明实施例提供的线程死循环检测方法,通过检测CPU(central processingunit,中央处理单元)内核利用率来判断可能发生死循环的时机,当内核利用率持续较高时检测各个线程的CPU占用率,将CPU占用率持续较高的线程判定为死循环线程,因为是通过检测内核利用率和CPU占用率来检测线程死循环,不必与被检测线程通信交互,解决了在Linux系统的公平调度模型中根据请求响应的查询方法会消耗被检测线程资源的问题。
实施例2、
本发明实施例提供了一种线程死循环检测装置10,应用于上述线程死循环检测方法,参照图5中所示,包括:
统计单元101,用于分别统计在[1,M]周期内的中央处理单元CPU内核利用率,M为正整数且M>1;
获取单元102,用于如果统计单元101统计的在[1,N]周期内的CPU内核利用率均大于第一门限,则获取[1,N]周期内的CPU占用率最高的线程作为关注线程,N为正整数且1<N<M;
统计单元101,还用于分别统计在[N,M]周期内关注线程的CPU占用率;
确定单元103,用于如果统计单元101统计的在[N,M]周期内的CPU内核利用率均大于第一门限,并且获取单元102获取的关注线程的CPU占用率均大于第二门限,则确定关注线程为死循环线程。
在一种可能的设计中,统计单元101具体用于:
在[1,M]周期内的第i个周期的起始时刻读取/proc/stat文件,以获取第i个周期的CPU内核运行时间;在第i+1个周期的起始时刻读取/proc/stat文件,以获取第i+1个周期的CPU内核运行时间,1≤i<M;
根据所述关注线程在所述第j个周期的运行时间减去所述关注线程在所述第j-1个周期的运行时间的差除以每个周期时间长度得到所述关注线程在所述第j个周期的CPU占用率。
在一种可能的设计中,获取单元102具体用于:
在[1,N]周期内的第N-1个周期的结束时刻读取/proc/PID/stat文件,以获取所有线程在第N-1个周期的运行时间;在第N个周期的结束时刻读取/proc/PID/stat文件,以获取所有线程在第N个周期的运行时间;
将各个线程的第N个周期的运行时间减去第N-1个周期的运行时间得到各个线程的时间差值;
获取各个线程的时间差值中的最大值,将最大值对应的线程作为关注线程。
在一种可能的设计中,统计单元101具体用于:
在[N,M]周期内的第j-1个周期的结束时刻读取/proc/PID/stat文件,以获取关注线程在第j-1个周期的运行时间;在第j个周期的结束时刻读取/proc/PID/stat文件,以获取关注线程在第j个周期的运行时间,N<j≤M;
根据(关注线程在第j个周期的运行时间-关注线程在第j-1个周期的运行时间)/每个周期时间长度得到关注线程在第j个周期的CPU占用率。
由于本发明实施例中的线程死循环检测装置可以应用于上述线程死循环检测方法,因此,其所能获得的技术效果也可参考上述方法实施例,本发明实施例在此不再赘述。
需要说明的是,统计单元、获取单元、确定单元可以为单独设立的处理器,也可以集成在控制器的某一个处理器中实现,此外,也可以以程序代码的形式存储于控制器的存储器中,由控制器的某一个处理器调用并执行以上统计单元、获取单元、确定单元的功能。这里所述的处理器可以是一个中央处理器(英文全称:central processing unit,英文简称:CPU),或者是特定集成电路(英文全称:application specific integrated circuit,英文简称:ASIC),或者是被配置成实施本发明实施例的一个或多个集成电路。
应理解,在本发明的各种实施例中,上述各过程的序号的大小并不意味着执行顺序的先后,各过程的执行顺序应以其功能和内在逻辑确定,而不应对本发明实施例的实施过程构成任何限定。
本领域普通技术人员可以意识到,结合本文中所公开的实施例描述的各示例的单元及算法步骤,能够以电子硬件、或者计算机软件和电子硬件的结合来实现。这些功能究竟以硬件还是软件方式来执行,取决于技术方案的特定应用和设计约束条件。专业技术人员可以对每个特定的应用来使用不同方法来实现所描述的功能,但是这种实现不应认为超出本发明的范围。
所属领域的技术人员可以清楚地了解到,为描述的方便和简洁,上述描述的系统、装置和单元的具体工作过程,可以参考前述方法实施例中的对应过程,在此不再赘述。
在本申请所提供的几个实施例中,应该理解到,所揭露的系统、设备和方法,可以通过其它的方式实现。例如,以上所描述的设备实施例仅仅是示意性的,例如,所述单元的划分,仅仅为一种逻辑功能划分,实际实现时可以有另外的划分方式,例如多个单元或组件可以结合或者可以集成到另一个系统,或一些特征可以忽略,或不执行。另一点,所显示或讨论的相互之间的耦合或直接耦合或通信连接可以是通过一些接口,设备或单元的间接耦合或通信连接,可以是电性,机械或其它的形式。
所述作为分离部件说明的单元可以是或者也可以不是物理上分开的,作为单元显示的部件可以是或者也可以不是物理单元,即可以位于一个地方,或者也可以分布到多个网络单元上。可以根据实际的需要选择其中的部分或者全部单元来实现本实施例方案的目的。
另外,在本发明各个实施例中的各功能单元可以集成在一个处理单元中,也可以是各个单元单独物理存在,也可以两个或两个以上单元集成在一个单元中。
所述功能如果以软件功能单元的形式实现并作为独立的产品销售或使用时,可以存储在一个计算机可读取存储介质中。基于这样的理解,本发明的技术方案本质上或者说对现有技术做出贡献的部分或者该技术方案的部分可以以软件产品的形式体现出来,该计算机软件产品存储在一个存储介质中,包括若干指令用以使得一台计算机设备(可以是个人计算机,服务器,或者网络设备等)执行本发明各个实施例所述方法的全部或部分步骤。而前述的存储介质包括:U盘、移动硬盘、只读存储器(英文全称:read-only memory,英文简称:ROM)、随机存取存储器(英文全称:random access memory,英文简称:RAM)、磁碟或者光盘等各种可以存储程序代码的介质。
以上所述,仅为本发明的具体实施方式,但本发明的保护范围并不局限于此,任何熟悉本技术领域的技术人员在本发明揭露的技术范围内,可轻易想到变化或替换,都应涵盖在本发明的保护范围之内。因此,本发明的保护范围应以所述权利要求的保护范围为准。