System.ArgumentOutOfRangeException: 索引和长度必须引用该字符串内的位置。 参数名: length 在 System.String.Substring(Int32 startIndex, Int32 length) 在 zhuanliShow.Bind() 一种针对容器的高效的监测方法技术_技高网
当前位置: 首页 > 专利查询>湖南大学专利>正文

一种针对容器的高效的监测方法技术

技术编号:41309316 阅读:5 留言:0更新日期:2024-05-13 14:53
本发明专利技术涉及一种针对容器的高效的监测方法。具体内容包括:首先构建eBPF程序,并将eBPF程序挂载到内核。然后提取监测信息中的静态部分,并在内核事件触发时获取监测信息的动态部分。之后,将监测信息压缩成二进制文件并写入磁盘。最后,在需要时解压二进制文件,以获取原本的监测信息。本发明专利技术保证了监测信息运行时的输出效率和完整性,适用于云原生、嵌入式和内核检测等领域。

【技术实现步骤摘要】

本专利技术具体涉及一种针对容器的高效的监测方法,属于计算机操作系统安全领域,主要应用于云原生、内核安全以及嵌入式等领域。


技术介绍

1、近年来,云原生生态不断壮大,云原生的概念和定义也在不断更新。其中,容器和微服务是最基础的概念。在过去,云计算应用多数运行于虚拟机上,但虚拟机存在资源浪费和维护成本高、启动速度慢的问题。容器技术则因其占用资源少、部署速度快和便于迁移等特点,助力了云原生生态的蓬勃发展。然而,容器的安全性和性能排查问题也受到挑战,需要提供一套完整的监测工具。

2、linux提供了许多函数的追踪机制,其中kprobe和tracepoint是常见的。由于容器对于版本灵活性的要求,不同内核版本下kprobe可能会失效。相比之下,tracepoint更适合针对容器进行的监测。

3、为了充分发挥tracepoint的能力,ebpf是最合适的选择。ebpf程序本身是一个标准的elf文件,可以使用c语言开发和llvm编译。通过bpf系统调用将ebpf字节码加载到内核,并通过maps将执行结果的数据信息返回至用户空间,提供了一种简便安全的方式在linux内核中运行自定义的ebpf代码,为构建一个针对容器的监测工具提供了可能。

4、tracepoint和ebpf结合为容器性能监测提供了新的可能性。tracee工具就是基于该思路开发,用于运行时安全和取证。然而,tracee存在一个问题,当内核空间触发的事件过多时,会导致缓冲区溢出,进而导致监测暂停和数据丢失。

5、因此,本专利技术针对现有监测工具存在的问题,提出了一种针对容器的高效的性能监测方法


技术实现思路

1、本专利技术给出了一种针对容器的高效的监测方法。首先构建ebpf程序,并将ebpf程序挂载到内核。然后通过静态分析提取监测信息中的静态部分,内核事件触发时获取监测信息的动态部分。之后,压缩动态信息,写入二进制文件。最后,在需要时解压二进制文件,获取原本的监测信息。

2、1、构建ebpf程序

3、系统监测是需要与系统内核交互的过程,通常需要了解内核底层知识,用复杂并且受限的c语言编写代码,对内核进行编译才能执行。本方法通过编写ebpf程序,将其加载到内核中实现系统监测,不再需要重新编译内核。具体实现步骤如下:

4、(1)构建ebpf程序

5、linux内核提供了多种hook点,比如kprobe、tracepoint等等,ebpf可利用不同的hook点将ebpf程序挂载至不同的内核位置,但无论选择哪种hook点,均不影响ebpf程序在内核态的执行流程。ebpf程序按如下执行流程构造:

6、①数据预定义:在ebpf程序挂载到指定钩子函数之前,需要导入必要的库,并创建对应的数据结构,以便内核输出数据。

7、②程序上下文预处理:ebpf程序无法直接访问内核内存,也不能任意更改内核中的数据结构,对于程序上下文之外的数据,需要选择合适的helper函数访问。例如,在一个追踪过程中,ebpf程序通过helper函数bpf_get_func_arg_cnt()访问保存被追踪函数返回值的寄存器。

8、③规则处理阶段:解析输入的事件参数,根据参数决定ebpf程序具体的监测内容,并将事件数据传递给用户态程序。

9、(2)加载ebpf程序

10、ebpf程序生成完成后还需要加载到内核中才能执行。把ebpf程序加载到内核中的工具有很多种:bpf()系统调用、bpf_prog_load()系统调用、libbpf库等等。加载ebpf程序到内核首先需要声明ebpf程序所在的路径,读取ebpf程序;其次要获取ebpf程序的文件描述符,从而执行后续ebpf程序的功能;最后关闭文件描述符,释放占有的资源,避免内存泄漏。

11、2、监测信息处理

12、一般的监测工具在钩子函数触发时,会输出过于冗余的监测信息给用户态程序,用户态程序再进行格式化输出,过量的监测信息容易引发缓冲区溢出问题,进而导致监测延迟和数据丢失等后果。为解决这一问题,本方法将监测信息分成动态和静态部分,通过静态分析提取静态部分监测信息并在运行时压缩动态部分监测信息,避免了缓冲区溢出问题,保证监测信息的运行时输出效率和完整性。具体步骤如下:

13、(1)提取静态监测信息

14、监测信息分为静态部分和动态部分。静态部分是监测信息在输出时保持不变的部分。以输出语句printf("\n->clone()by%s pid%d\n",comm,pid);为例,得到如下静态部分和动态部分:

15、

16、静态部分完全相同的监测信息属于同一种监测信息。例如”clone()by gnome-terminal-pid 3287”和”clone()by bash pid 76637”属于同一种监测信息,其具有相同的静态部分(clone()by%s pid%d)。而”clone()by bash pid 76637”和”clone()bashpid 76637”属于不同种的监测信息,需要分配不同的标识符。监测信息的动静态部分在最后的压缩文件中被分离,因此需要为动静态部分分配标识符,用于解压时动态部分查找对应的静态部分,还原监测信息。动态信息的时间戳用于解压时确定顺序,在接收到内核输出的数据时确定。

17、监测信息中的静态部分在程序运行前就已经确定,因此预先创建一个全局字典,用来保存每种监测信息的静态部分。参数类型属于静态部分,也在程序运行前确定,因此预先设计针对不同数据类型的压缩函数,将其保存到一个函数数组中,在压缩时直接根据标识符在静态信息字典中查找参数类型,调用对应的压缩函数,最大化压缩效率。

18、本专利技术提取静态信息的步骤如下:

19、①通过静态分析将监测信息分为静态和动态部分;

20、②利用字典特性为监测信息分配全局唯一标识符,将带有标识符的静态监测信息写入全局字典;

21、③根据静态信息中的参数类型设计压缩函数,保存到函数数组,该数组的索引为第二步中分配的标识符。

22、(2)压缩动态监测信息

23、一次监测过程通常会有多种监测信息输出,多种监测信息的同步读写导致了相对较低的性能。因此,本方法把动态信息的获取和压缩进行解耦合。具体做法为:每次内核事件触发时便重新分配用于动态信息获取的线程和缓冲区,而所有写入缓冲区的动态信息则以同一条压缩线程进行压缩。通过获取与压缩步骤的解耦合实现动态信息的异步读写,提高压缩效率。具体压缩步骤如下:

24、①创建二进制文件,将静态信息字典写入二进制文件头部;

25、②有内核事件触发,建立缓冲区,接收内核输出的信息,确定动态信息的值;引用缓冲区指针副本把动态信息写入缓冲区,避免cache miss;

26、③引用缓冲区指针副本,从缓冲区中顺序读取动态信息,根据标识符从函数数组中调用本文档来自技高网...

【技术保护点】

1.一种针对容器的高效的监测方法,其特征在于包括如下步骤:

2.根据权利要求1所述的一种针对容器的高效的监测方法,其特征在于本方法在压缩动态信息时有如下步骤:

3.根据权利要求1所述的一种针对容器的高效的监测方法,其特征在于本方法在二进制文件解压阶段有如下步骤:

【技术特征摘要】

1.一种针对容器的高效的监测方法,其特征在于包括如下步骤:

2.根据权利要求1所述的一种针对容器的高效的监测方法,其特征在于本方法在...

【专利技术属性】
技术研发人员:黄姚昊孙建华段国云席宁
申请(专利权)人:湖南大学
类型:发明
国别省市:

网友询问留言 已有0条评论
  • 还没有人留言评论。发表了对其他浏览者有用的留言会获得科技券。

1