本发明属于计算机,涉及云原生场景下.net应用的性能优化,具体涉及一种云原生容器内.net应用热点分析的方法及装置。
背景技术:
1、云原生是一种软件架构和开发理念,旨在利用云计算环境下的优势,如弹性、可扩展性和灵活性,强调将应用程序设计、开发和部署与云服务环境无缝集成,充分利用云基础设施提供的特性,比如容器化、微服务架构、自动化部署和弹性计算等。云原生技术包括使用容器技术如docker、cri-o,编排工具如kubernetes,微服务架构,自动化运维,持续集成/持续交付(ci/cd)等。
2、云原生.net应用是使用微软开发的跨平台开源框架.net core和.net 5以上版本开发的各种类型的应用程序,包括web应用、微服务、桌面应用、云服务等。云原生.net应用提供了跨平台支持,能够在windows、linux和macos等多个操作系统上运行,支持构建微服务架构,以利用其轻量级和模块化的特性,支持容器化和云服务,例如使用docker进行打包和部署,并能够轻松部署到各种云服务提供商。
3、热点代码是在程序执行过程中频繁被调用的代码部分或函数。这些代码段通常因为被频繁执行而导致在cpu执行时间上占据较大比例,从而在性能优化方面具有重要意义。热点代码可以是在程序执行期间被频繁调用的任何部分,可以是特定的函数、循环、算法或者一组指令。这些代码通常是程序性能瓶颈的主要来源,因为它们消耗了大量的系统资源,比如cpu周期,而且可能会导致性能下降。
4、在非容器部署的场景下,当一个.net应用出现问题时,常常会依赖微软提供的dotnet-trace和dotnet-dump工具。它们专门针对.net应用提供了必要的分析功能,可以获取应用程序的堆栈信息以及其他关键数据。此外,还有一些第三方分析工具可以在进程启动时通过加载特定的环境变量来启动分析工具,从而帮助诊断问题。
5、然而,在云原生容器化部署中,情况稍有不同,当前技术无法提供在云原生容器环境中程序运行时实时进行热点代码分析的解决方案,可能情况包括:
6、1)由于dotnet-trace、dotnet-dump或其他类似工具可能并未预先部署在容器内部,因此无法直接使用这些工具。
7、2)在提前预先部署工具在容器内部的情况下,这种方法也存在一个限制,需在应用程序启动时立即启动分析器,即分析器必须存在于应用程序进程的整个生命周期中,如果应用程序启动时没有加载分析器,无法在运行时实时地追加分析器并捕捉和分析问题。
技术实现思路
1、针对当前技术无法在云原生容器环境中程序运行时实时进行热点代码分析的问题,本发明提供了一种云原生容器内.net应用热点分析的方法及装置,实现一种动态的、无需中断应用进程运行的技术,来对运行在云原生容器环境中的.net应用程序进行热点代码分析,从而有效地优化云原生容器环境中.net应用程序的性能监控和调优能力。
2、本发明提供的一种云原生容器内.net应用热点分析的方法,包括如下步骤:
3、步骤1:在kubernetes的每个node节点上部署分析器daemonset,分析器daemonset包含分析器和附加器两部分,设置分析器daemonset具备root权限以访问节点上的进程和资源;
4、步骤2:daemonset部署成功之后,启动一个扫描进程,获取node节点上的所有进程列表,遍历每个进程,通过/proc/[pid]/maps获取进程加载的模块列表,通过模块列表识别进程是否属于.net应用;
5、步骤3:daemonset对识别出的每个.net应用进程,记录进程的属性,包括进程标识符pid、启动时间、启动命令参数以及加载的模块列表,然后对每个.net应用进程执行步骤4-步骤9;
6、步骤4:将附加器和分析器的副本复制到容器内部的指定路径/proc/[pid]/root下;
7、步骤5:进入.net应用进程的命名空间;
8、步骤6:获取应用进程在容器内运行时的用户身份uid和gid以及容器内进程的pid,标记容器内进程pid为a;
9、步骤7:使用.net应用进程的用户身份uid和gid运行附加器,动态将分析器附加到pid为a的.net应用进程,分析器通过.net接口采集热点代码数据;
10、步骤8:分析器将定时收集的热点代码数据发送到采集分析中心;
11、步骤9:在分析器结束任务后,在应用进程a内卸载分析器模块,并删除容器内附加器和分析器的副本。
12、所述的步骤1中,分析器daemonset设置有读取宿主机proc文件的权限以及写入容器namespace的权限。
13、所述的步骤6中,利用linux内核的namespace命名空间技术,获取/proc/[pid]/status文件中的uid列表、gid列表和nspid列表,从uid列表的最后一列获取容器进程运行时的用户身份uid,从gid列表的最后一列获取容器进程运行时的用户组身份gid,从nspid列表的最后一列获取容器内进程pid。
14、所述的步骤7包含如下步骤:
15、步骤7.1:启动附加器进程,附加器进程利用iclrprofiling::attachprofiler接口将分析器加载到指定进程,即pid为a的.net应用进程,在分析器加载动作完成后,附加器进程退出;分析器开启分析功能,定时执行步骤7.2和7.3,采集热点代码数据;
16、步骤7.2:分析器利用icorprofilerinfo4::enumthreads接口枚举进程a内所有的托管线程,记录本次线程集合切片,记录线程信息包括线程id、线程名称等,构造线程生命周期图,包括线程id、线程名称、创建时间和销毁时间等属性信息;
17、步骤7.3:遍历本次线程集合切片内所有的线程,利用icorprofilerinfo2::dostacksnapshot接口获取线程的瞬时代码堆栈方法列表。遍历每个线程的瞬时代码堆栈方法列表,构造热点代码数据,包括热点线程图、热点方法图和热点堆栈图;其中,热点线程图记录线程id、线程名称、运行时刻和运行状态;热点方法图记录方法函数名称、程序集名称、方法类名以及运行时长;热点堆栈图记录片段大小、片段入口方法函数名称、片段程序集名称、片段方法类名以及运行时长。
18、相应地,本发明提供了一种云原生容器内.net应用热点分析装置,包括分析器和附加器两部分。附加器是一个辅助程序,当被启动后,附加器进程利用iclrprofiling::attachprofiler接口将分析器的dll文件加载到被分析的应用进程中,在分析器加载成功后,附加器进程退出。
19、分析器通过.net接口采集应用进程的热点代码数据,包括如下:
20、(1)利用icorprofilerinfo4::enumthreads接口枚举进程内所有的托管线程,记录本次线程集合切片,线程集合切片中记录线程id和名称,对比上次线程集合切片,构造线程生命周期图,记录线程id、线程名称、创建时间和销毁时间;
21、(2)遍历本次线程集合切片内所有的线程,利用icorprofilerinfo2::dostacksnapshot接口获取线程的瞬时代码堆栈方法列表,获取热点代码数据,包括热点线程图、热点方法图和热点堆栈图;其中,热点线程图记录热点线程id、名称、运行时刻和运行状态;热点方法图记录热点方法的函数名称、程序集名称、方法类名及运行时长;热点堆栈图记录热点片段的大小、片段入口方法函数名称、片段程序集名称、片段方法类名及运行时长;
22、所述装置部署在kubernetes的每个node节点上,具备root权限。
23、相比现有技术,本发明的优点与积极效果在于:
24、(1)本发明方法和装置着重于在云原生容器中实现对.net应用程序的热点代码分析,分析器在需要时才被引入容器内部,并且能够在应用程序运行时进行动态附加,在分析结束后进行动态卸载,并删除在容器内部的分析器文件副本,这意味着确保了应用环境的清洁性,避免污染应用的运行环境,并可以避免对容器或应用程序的中断或重启,从而确保了服务的连续性和稳定性,节省了不必要的由于分析和监控而带的性能开销。本发明方法和装置使得针对性能问题的诊断和分析更为便捷和即时,有助于快速定位和解决热点代码相关的性能瓶颈或问题。
25、(2)本发明方法和装置从宿主机即可获取容器应用进程的用户身份uid和gid,并使用.net应用进程的用户身份uid和gid运行附加器,保证了分析器和.net应用进程身份和权限的统一,避免由于权限原因导致分析失败。
26、(3)本发明方法和装置能分析获取.net应用的线程生命周期、热点线程、热点方法、热点堆栈等多维度数据,可获取丰富的热点数据。
1.一种云原生容器内.net应用热点分析的方法,包括如下步骤:
2.根据权利要求1所述的方法,其特征在于,所述的步骤1中,分析器daemonset使用kubernetes yaml文件定义,设置有读取宿主机proc文件的权限以及写入容器namespace的权限。
3.根据权利要求1所述的方法,其特征在于,所述的步骤6中,利用linux内核的namespace命名空间技术,获取/proc/[pid]/status文件中的uid列表、gid列表和nspid列表,从uid列表的最后一列获取容器进程运行时的用户身份uid,从gid列表的最后一列获取容器进程运行时的用户组身份gid,从nspid列表的最后一列获取容器内进程pid。
4.根据权利要求1所述的方法,其特征在于,所述的步骤7包括:
5.根据权利要求4所述的方法,其特征在于,所述的步骤7.2中,分析器遍历上次线程集合切片内所有的线程,若某线程在本次线程集合切片内不存在,则认为该线程已销毁,记录该线程的销毁时间;分析器遍历本次线程集合切片内所有的线程,若某线程在上次线程集合切片内不存在,则认为该线程是新建线程,获取线程名称,并记录线程创建时间。
6.根据权利要求4所述的方法,其特征在于,所述的步骤7.3包括:
7.一种云原生容器内.net应用热点分析的装置,其特征在于,该装置包含分析器和附加器两部分;
8.根据权利要求7所述的装置,其特征在于,所述的装置,在部署成功后,启动一个扫描进程,获取所在node节点上的所有进程列表,遍历每个进程,访问路径为/proc/[pid]/maps的文件获取进程加载的模块列表,检测模块列表判断进程是否属于.net应用;对识别出的每个.net应用进程,记录进程属性,并复制分析器和附加器的副本到对应.net应用进程在容器内的路径/proc/[pid]/root下;所述装置进入.net应用进程的命名空间,获取.net应用进程在容器内运行时的用户身份uid和组身份gid,以及容器内进程pid,标记容器内进程pid为a,使用获取的.net应用进程的用户身份uid和gid运行附加器,附加器动态将分析器附加到pid为a的.net应用进程中;分析器定时收集热点代码数据发送到采集分析中心;在分析器结束分析任务后,在进程a内卸载分析器模块,并删除在容器内的附加器和分析器的副本。
9.根据权利要求7或8所述的装置,其特征在于,所述的装置,分析器中判别热点线程、热点方法和热点堆栈的方式如下:
