eBPF技术在操作系统动态跟踪中的应用研究_第1页
eBPF技术在操作系统动态跟踪中的应用研究_第2页
eBPF技术在操作系统动态跟踪中的应用研究_第3页
eBPF技术在操作系统动态跟踪中的应用研究_第4页
eBPF技术在操作系统动态跟踪中的应用研究_第5页
已阅读5页,还剩2页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

近年来,随着物联网、大数据、云计算等新技术的广泛落地,大量创新应用被构建在底层操作系统之上,而此类应用一旦出现需深入排查才能定位的复杂问题,往往要求技术人员深入了解系统的底层运行情况和技术原理,否则不仅难以精准定位问题根源,甚至还可能丧失对整个生产系统的掌控力。针对这一问题,业界研究人员多年来开展了各类尝试,包括设置断点、增加输出信息、实施静态插桩等,但上述静态跟踪技术大多需要执行停止服务、修改代码或重新编译等操作,从而耗费大量的时间和精力。对此,动态跟踪技术的出现成功克服了上述缺点,既不需要停止服务,也无需修改程序代码。一、动态跟踪技术概述本质上讲,动态跟踪技术是一种操作系统级别的调试技术,旨在从操作系统的内核态及用户态实现深入跟踪和分析,从而方便、快捷地定位故障问题。1.基本原理动态跟踪技术一般是基于操作系统内核实现,因此对整个操作系统拥有绝对的控制权限,而异常和事件机制则是动态跟踪技术的实现基础,即当操作系统运行过程中出现异常时,会产生特定事件,且不同异常对应着不同的处理方式。例如,操作系统中的常见异常包括中断、陷阱、故障等。其中,中断通常是由CPU外部设备引发的异常,因其并非由专门的指令产生,所以可以认为这是一种异步行为,从而使动态跟踪具备了技术可行性;陷阱是一种由程序主动发起的异常,比如进程从用户态切换到内核态时会执行系统调用,而这一过程如果产生错误即可能引发故障,此时处理器会将控制权交给故障处理程序。实际上,不论处置哪种异常通常都会遵循一个基本的处理机制,即异常产生时首先会触发异常码,然后相关指令会从操作系统提供的异常码表中查询此异常码对应的处理程序并触发,最后再返回异常位置继续执行。操作系统异常事件处理机制如图1所示。图1操作系统异常事件处理机制结合上述机制,动态跟踪技术实现系统运行情况跟踪即是借助了此类陷阱异常,而对陷阱的处理程序则通常被称为“探针”。例如,部分探针是在程序或操作系统内核代码中事先定义,只有在显示开启后才运行,因此被称为“静态探针”。静态探针主要包括在操作系统内核中使用的跟踪点,以及在应用程序中使用的用户静态定义跟踪探针。此外,另有部分探针是在程序或操作系统内核运行时动态添加,不需要显示开启,因此被称为“动态探针”。动态探针的预定义位置通常位于程序的函数入口及出口处,以断点形式存在,当程序执行到断点位置时会自动转入动态跟踪处理函数,从而实现动态跟踪的目的。实际运行时,根据预定义断点的位置及处理机制,动态探针通常可分为Kprobe、Kretprobe、Uprobe以及Uretprobe等四类。其中,Kprobe跟踪的断点位置在操作系统内核代码的函数入口处,可实现对系统内核相关函数的动态跟踪(如函数名及传递给函数的参数、寄存器、堆栈等系统信息)。Kretprobe跟踪的断点位置在系统内核代码的函数出口处,主要作用是探测内核函数的退出状态、函数执行耗时、性能统计等。Uprobe和Uretprobe的原理分别类似于Kprobe以及Kretprobe,不同之处在于它们主要用于对用户态函数的动态跟踪,而不是跟踪操作系统的内核态函数。2.动态跟踪工具目前,在主流的Linux操作系统中,最常用的动态跟踪工具主要有Ftrace、SystemTap以及eBPF技术等。其中,Ftrace提供了基本的静态、动态跟踪点,能够跟踪函数的入口及出口,其静态探针需要开启相关的内核配置选项,且Ftrace的动态探针利用Mcount机制,可在编译内核时预先在每个函数的入口处保留若干个字节,并在内核运行时动态地将这些保留字节替换成待执行的指令。与Ftrace不同,SystemTap会主动对内核进行动态解析,并将探测点处的代码替换成中断指令,然后在对trap的处理中完成对系统内核的跟踪。相较而言,SystemTap不仅可跟踪函数入口、函数出口,还能够在函数的任意位置进行跟踪,且具有良好的用户态调试符号自动加载机制。本文所述的动态跟踪技术主要起源于1992年出现的伯克利数据包过滤器(BerkeleyPacketFilter,BPF)技术,BPF技术起初主要用于捕捉和过滤符合特定规则的网络包,其通过在内核层面运行基于寄存器的虚拟机,并在此虚拟机上运行BPF过滤程序,可大幅提高网络包过滤速度。二、eBPF技术简介与传统的BPF技术相比,eBPF(extendedBerkeleyPacketFilter)的主要特点是增加了寄存器的数量,即由传统BPF的2个寄存器增加到10个寄存器,且操作不再局限于32位寄存器(也可支持64位寄存器),并增加了更加灵活的map类型。简而言之,eBPF技术基于事件机制,可在指定探针被触发时执行对应的eBPF程序,eBPF技术架构如图2所示。图2eBPF技术架构具体而言,eBPF程序代码可以由LLVM或GCC编译为字节码,并通过bpf()系统调用加载到内核中,此后eBPF提供的验证器会进行安全性检查,保证只有内核安全的代码才会被执行,从而避免对内核产生不良影响。实际操作中,在eBPF程序跟踪的内核事件被触发后,eBPF字节码程序将借助eBPFmap或Perf_event与用户态程序进行交互,从而实现对系统的动态跟踪。其间,由于eBPF程序不能随便调用内核中的任意函数,因此高版本的系统内核一般会提供eBPF程序可以调用的帮助函数,助力eBPF程序更为方便、安全地与内核进行交互。三、eBPF技术在系统动态跟踪中的应用eBPF技术在用于系统动态跟踪时,不仅能够动态跟踪、过滤网络流量包,还可以对操作系统的CPU、内存、网络等各种资源进行观测。以操作系统的CPU资源动态跟踪为例,在对CPU进行动态观测时,通常要先了解CPU的调度策略,且现代操作系统内核中一般有多个CPU调度器,不同的调度器也会对应不同类型的工作负载,如Linux系统中最常用的完全公平调度器,其旨在实现一种名为hard-learned的启发式学习规则,目的是让短暂运行的进程抢占长期运行的任务。对此,采用eBPF技术对CPU进行动态跟踪,有助于提高CPU调度性能以及增强调度策略的灵活性,并实现较高的CPU调度效率。同时,为达成上述目标,eBPF技术增加了新的程序类型bpf_prog_type_sched,该程序通过挂载到不同的挂载点,实现了对CPU进行动态跟踪的目的。实际应用中,eBPF技术可以跟踪的CPU相关事件源包括内核函数、系统调用、软中断、工作队列事件以及时间采样等,并能够提取堆栈跟踪来显示事件产生的原因。例如,当出现CPU使用率过高的情况时,传统工具只能查看哪个进程在占用CPU,并不能深入查询到底层信息,而基于eBPF技术,可以深入跟踪占用CPU的内核级函数并生成火焰图,从操作系统层面分析CPU占用原因,基于eBPF技术动态跟踪CPU的火焰图示例如图3所示。同时,在动态跟踪系统内存时,eBPF技术还可以跟踪多种内存相关事件,包括用户及内核内存分配、堆(heap)扩展、页分配、共享内存函数等,并借助动态插桩技术在与内存相关的内核函数处插桩。以glibc库为例,libc.so动态库中的memory_malloc_retry可以对系统中的内存分配情况进行动态跟踪。此外,当定位网络抖动问题时,分析范围除了应用层面还会涉及网络协议栈、内核等内容,而基于eBPF技术,可以对内核中网络协议栈的对应事件进行观测和跟踪,从而更加灵活地监控网络底层的重传和抖动现象。图3基于eBPF技术跟踪CPU的火焰图示例综上所述,本文在简要分析动态跟踪技术的基本

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

最新文档

评论

0/150

提交评论