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