一种基于线程的程序执行过程剖析方法和系统与流程



1.本发明涉及计算机技术领域,具体涉及一种基于线程程序执行过程剖析方法和系统


背景技术:



2.程序是为求解某个特定问题而设计的指令序列,程序中的每条指令规定机器完成一组基本操作。目前,主要是从程序代码理解程序执行过程,但是程序代码的执行涉及多个服务或组件的协同工作,例如涉及调用依赖库等实现,执行过程中可能存在依赖库漏洞或者使用依赖库接口不当导致出现一些程序执行缓慢,而仅仅从代码层面理解程序执行快慢是不能帮助开发者理解完全理解程序执行过程,因此代码层面的理解对程序优化的帮助有限;因此需要一种对程序执行过程进行剖析的方法。


技术实现要素:



3.针对现有技术中存在的上述技术问题,本发明提供一种基于线程的程序执行过程剖析方法和系统,基于线程,剖析程序执行过程中各系统调用的持续时长。
4.本发明公开了一种基于线程的程序执行过程剖析方法,所述方法包括:获取程序执行过程中线程上下文切换的时间及第一线程号;根据所述第一线程号,获取上下文切换的上一次系统调用;根据所述系统调用后的两次上下文切换时间,获得所述系统调用的持续时长。
5.优选的,根据系统调用的类型进行剖析的方法包括:
6.对所述系统调用进行分类,获得系统调用的类型;
7.根据所述类型,对系统调用的持续时长进行汇总,获得各个系统调用类型的总持续时长。
8.优选的,所述系统调用包括以下任一类型或它们的组合:输入输出类、网络类、文件类、系统挂起类和执行类。
9.优选的,利用阈值和所述总持续时长,对程序执行过程进行剖析,获得程序执行时长的影响原因。
10.优选的,利用所述总持续时长,对程序执行过程进行剖析,获得程序执行时长的影响原因。
11.优选的,基于ebpf拦截sched_switch事件,获得上下文切换的时间及第一线程号;基于ebpf获得系统调用。
12.优选的,获取拦截程序的第二线程号和执行日志,并将所述第二线程号、执行日志和第一线程号进行关联。
13.优选的,所述系统调用包括网络调用,根据网络调用后的两次上下文切换时间,获得dns查询的持续时长。
14.本发明还提供一种用于实现上述程序执行过程剖析方法的系统,包括拦截模块和
系统调用剖析模块,所述拦截模块用于获取线程上下文切换的时间及第一线程号,并根据所述第一线程号,获取上下文切换的上一次系统调用;所述系统调用剖析模块用于根据所述系统调用后的两次上下文切换时间,获得所述系统调用的持续时长;基于所述持续时长,对程序执行过程进行剖析。
15.优选的,所述系统还包括代码解析模块,所述代码解析模块用于对程序在cpu执行事件的代码进行解释。
16.优选的,所述系统还包括可视化模块,所述可视化模块用于展示程序执行过程中,各个系统调用或类型的持续时长或总持续时长。
17.与现有技术相比,本发明的有益效果为:
18.系统调用后当前线程的第一次上下文切换,为cpu执行其他线程;第二次上下文切换为系统开始执行当前线程;两次上下文切换的时差,反应了系统调用的持续时长,而各系统调用的持续时长,对程序执行的总时长具有重要的影响;通过对程序执行过程中系统调用的持续时长进行剖析,利于在执行层面对程序进行理解,利于对程序执行过程进行优化。
附图说明
19.图1是本发明的基于线程的程序执行过程剖析方法流程图;
20.图2是本发明的系统逻辑框图。
具体实施方式
21.为使本发明实施例的目的、技术方案和优点更加清楚,下面将结合本发明实施例中的附图,对本发明实施例中的技术方案进行清楚、完整地描述,显然,所描述的实施例是本发明的一部分实施例,而不是全部的实施例。基于本发明中的实施例,本领域普通技术人员在没有做出创造性劳动的前提下所获得的所有其他实施例,都属于本发明保护的范围。
22.下面结合附图对本发明做进一步的详细描述:
23.一种基于线程的程序执行过程剖析方法,如图1所示,所述方法包括:
24.步骤101:获取程序执行过程中线程上下文切换的时间及第一线程号。可以基于ebpf拦截sched_switch事件,获得上下文切换的时间及第一线程号。
25.步骤102:根据所述第一线程号,获取上下文切换的上一次系统调用。可以基于ebpf获得系统调用,例如读、写、网络调用等系统调用。该系统调用作为线程切换的原因。
26.步骤103:根据所述系统调用后的两次上下文切换时间,获得所述系统调用的持续时长;基于所述持续时长,对程序执行过程进行剖析。在程序执行过程中,应该避免系统的负荷过大,减少被动上下文切换,提高剖析的准确性。
27.系统调用后的当前线程第一次上下文切换,为系统调用过程中需要等待资源,而导致cpu执行其他线程;第二次上下文切换为系统开始执行当前线程,两次上下文切换的时差,反应了系统调用的持续时长,而各系统调用的持续时长,对程序执行的总时长具有重要的影响;通过对程序执行过程中系统调用的持续时长进行剖析,利于在执行层面对程序进行理解,利于对程序执行过程进行优化。
28.步骤103中,可以将第二次切换时间与第一次切换时间的时差作为持续时间,也可以将第二次切换时间和系统调用的时差作为持续时间。
29.步骤103中,可以根据系统调用的类型进行剖析的方法:
30.步骤201:对所述系统调用进行分类,获得系统调用的类型;
31.步骤202:根据所述类型,对系统调用的持续时长进行汇总,获得各个系统调用类型的总持续时长。
32.在一个具体实施例中,采用以下分类:read、write事件归类为输入输出类(io类);根据文件操作符,如果是socket类,为网络类;根据文件操作符,如果是file类,为文件类;针对futex将事件归类为系统挂起类;针对cpu上执行事件,归类为执行类(oncpu类),但不限于此,例如epoll类。
33.还可以利用利用阈值和所述总持续时长,对程序执行过程进行剖析,获得程序执行时长的影响原因。如文件读取的持续时长大于阈值、则表示为程序执行时长的影响原因,并对开发者进行告警,提示开发者对文件读取进行优化。
34.实施例1
35.步骤301:通过基于ebpf的拦截程序(trance),拦截操作系统的sched_switch,获得线程cpu切换事件及切换的时间点,线程cpu切换是由于程序执行过程主动让出cpu,或者执行了资源等待如网络读写,磁盘读写等操作导致线程切换。
36.改造拦截程序,记录拦截程序在每个执行生命周期中的第二线程号和日志,并将第二线程号与第一线程号相关联。拦截程序在主程序执行过程中多次被运行,因此可具有多个线程号。
37.步骤302:针对每个线程,记录发生sched_switch事件时的上一次系统调用,比如vfs.read等。从而得到线程cpu切换的原因,因为操作系统内核调度的粒度为线程粒度,所以线程切换就一定是该线程发生了什么事情。了解cpu切换的原因可以帮助开发者理解程序是如何执行的。例如发生了vfs.read系统调用导致程序线程从cpu执行状态切换成资源等待状态,可以得到导致程序线程进行切换的原因。
38.而现有的类似apm技术由于工作在应用代码层,无法内核层的事件,没有办法知道程序究竟由于何种原因从在cpu执行的状态切换成了cpu等待状态。
39.步骤303:利用拦截程序对系统调用进行解释。
40.例如在一次线程执行网络调用过程中,执行网络调用的线程进行dns域名解析/查询工作发生一次cpu切换;解析出dns后,引起cpu切换、并发生一次网络调用。通过记录线程在cpu上的切换时间点,即可得到该次系统调用持续的时间长度,比如dns域名时间比较长,那么就可以确认问题发生的原因是dns解析上,而不是网络调用和网络质量也就没有关系,可以直接发现问题根因。
41.步骤304:利用perf_event得到程序在cpu执行事件的代码解释;通过elasticsearch对程序技术过程中各系统调用的持续时长进行展示和告警。
42.在一个具体测试中,epoll的持续时长1607.5ms,网络类0.39ms,系统挂起类3.79ms,执行类44.87ms,文件类2305.56ms,其它类0.24ms。则可以剖析出epoll和文件类系统调用占用了过长的持续时长(总时长占比),应当进行优化。
43.实施例2
44.一种用于实现上述程序执行过程剖析方法的系统,如图2所示,包括拦截模块1和系统调用剖析模块2,
45.拦截模块1用于获取线程上下文切换的时间及第一线程号,并根据所述第一线程号,获取上下文切换的上一次系统调用;系统调用剖析模块2用于根据所述系统调用后的两次上下文切换时间,获得所述系统调用的持续时长;基于所述持续时长,对程序执行过程进行剖析。
46.所述系统还可以包括代码解析模块3和可视化模块4。代码解析模块3用于对程序在cpu执行事件的代码进行解释。可视化模块4用于展示程序执行过程中,各个系统调用或类型的持续时长或总持续时长。
47.以上仅为本发明的优选实施例而已,并不用于限制本发明,对于本领域的技术人员来说,本发明可以有各种更改和变化。凡在本发明的精神和原则之内,所作的任何修改、等同替换、改进等,均应包含在本发明的保护范围之内。

技术特征:


1.一种基于线程的程序执行过程剖析方法,其特征在于,所述方法包括:获取程序执行过程中线程上下文切换的时间及第一线程号;根据所述第一线程号,获取上下文切换的上一次系统调用;根据所述系统调用后的两次上下文切换时间,获得所述系统调用的持续时长。2.根据权利要求1所述的程序执行过程剖析方法,其特征在于,还包括根据系统调用的类型进行剖析的方法:对所述系统调用进行分类,获得系统调用的类型;根据所述类型,对系统调用的持续时长进行汇总,获得各个类型的总持续时长。3.根据权利要求2所述的程序执行过程剖析方法,其特征在于,所述系统调用包括以下任一类型或它们的组合:输入输出类、网络类、文件类、系统挂起类和执行类。4.根据权利要求2所述的程序执行过程剖析方法,其特征在于,利用所述总持续时长,对程序执行过程进行剖析,获得程序执行时长的影响原因。5.根据权利要求1所述的程序执行过程剖析方法,其特征在于,基于ebpf拦截sched_switch事件,获得上下文切换的时间及第一线程号;基于ebpf获得系统调用。6.根据权利要求5所述的程序执行过程剖析方法,其特征在于,通过拦截程序拦截sched_switch事件和系统调用;获取拦截程序的第二线程号和执行日志,并将所述第二线程号、执行日志和第一线程号进行关联。7.根据权利要求1所述的程序执行过程剖析方法,其特征在于,所述系统调用包括网络调用,根据网络调用后的两次上下文切换时间,获得dns查询的持续时长。8.一种用于执行如权利要求1-7任一项所述程序执行过程剖析方法的系统,其特征在于,包括拦截模块和系统调用剖析模块,所述拦截模块用于获取线程上下文切换的时间及第一线程号,并根据所述第一线程号,获取上下文切换的上一次系统调用;所述系统调用剖析模块用于根据所述系统调用后的两次上下文切换时间,获得所述系统调用的持续时长;基于所述持续时长,对程序执行过程进行剖析。9.根据权利要求8所述的系统,其特征在于,还包括代码解析模块,所述代码解析模块用于对程序cpu执行事件的代码进行解释。10.根据权利要求8所述的系统,其特征在于,还包括可视化模块,所述可视化模块用于展示程序执行过程中各个系统调用或类型的持续时长或总持续时长。

技术总结


本发明公开了一种基于线程的程序执行过程剖析方法和系统,属于计算机技术领域,所述方法包括:获取程序执行过程中线程上下文切换的时间及第一线程号;根据所述第一线程号,获取上下文切换的上一次系统调用;根据所述系统调用后的两次上下文切换时间,获得所述系统调用的持续时长。系统调用后当前线程的第一次上下文切换,为CPU执行其他线程;第二次上下文切换为系统开始执行当前线程;两次上下文切换的时差,反应了系统调用的持续时长,而各系统调用的持续时长,对程序执行的总时长具有重要的影响;通过对程序执行过程中系统调用的持续时长进行剖析,利于在执行层面对程序进行理解,利于对程序执行过程进行优化。利于对程序执行过程进行优化。利于对程序执行过程进行优化。


技术研发人员:

苌程 胡向远 蔡敏伟 王大鑫 周骏迪 宋宇杰

受保护的技术使用者:

杭州谐云科技有限公司

技术研发日:

2022.12.21

技术公布日:

2023/3/10

本文发布于:2024-09-25 11:10:09,感谢您对本站的认可!

本文链接:https://www.17tex.com/tex/4/71040.html

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系,我们将在24小时内删除。

标签:线程   所述   系统   程序
留言与评论(共有 0 条评论)
   
验证码:
Copyright ©2019-2024 Comsenz Inc.Powered by © 易纺专利技术学习网 豫ICP备2022007602号 豫公网安备41160202000603 站长QQ:729038198 关于我们 投诉建议