栏 目 树 形 导 航
您现在的位置: 综艺大全网 >> 综艺 >> 正文 用户登录 新用户注册
创富网论坛           ★★★ 【字体:
创富网论坛
作者:佚名    综艺来源:来自网络    点击数:10    更新时间:2023/4/4    
Linux在日常的使用中已经无处不在了,从人们的手机,到电视机,再到路由器,都运行在linux内核之上,而eBPF就是Linux内核的一把瑞士军刀,通过eBPF可以在linux内核中运行程序,运维人员可以使用它对linux内核进行监控,开发者可以使用它对linux内核功能进行定制修改,做到很多以前无法实现的功能。官方的说法: eBPF is a revolutionary technology with origins in the Linux kernel that can run sandboxed programs in an operating system kernel.个人认为,简单的说,eBPF可以理解为一个框架,通过这个框架,我们可以在内核中执行自己编写的程序代码。eBPF基本概念eBPF的前身是BPF(extended Berkeley Packet Filter),BPF是内核中用来做高效过滤网络报文的,tcpdump里面就是用的BPF技术过滤报文。2014年内核3.18中eBPF第一次出现,此时的eBPF已经成为内核的顶级子系统,演进为一个通用执行引擎,允许用户在内核中运行自己的程序。挂载点(Hook)eBPF程序基于事件触发,当内核代码走到对应的挂载点就会执行挂载在此处的eBPF程序。常见的挂载点有:系统调用,内核函数进入/退出,内核跟踪点,网络数据包等等。映射(Maps)eBPF程序中用来存储数据,共享数据的结构体就是Maps,内核内置了多种类型的Maps给开发者使用,常见的有哈希表,数组,LRU,Ring buffer等等。帮助函数(Helper Calls)内核为了保证安全,运行在内核中的eBPF程序只能调用当前内核版本预定义好的函数,不能随意调用其他内核函数,函数名称都是以bpf_开头命名。例如u32 bpf_get_smp_processor_id(void),可以获取当前eBPF程序运行在哪个cpu上。加载与验证(Loader & Verification)编写好的eBPF程序需要先通过编译,生成字节码,之后通过调用bpf系统调用将字节码加载到内核,此时内核会运行自己的验证器来检验eBPF程序,确保程序是安全的,有限循环的,不会把linux系统搞坏。eBPF特点强大的内核可编程性。随着内核版本的升级,内核中可以运行eBPF程序的地方越来越多,eBPF可以做的事情也越来越多。不同内核功能加入eBPF版本列表:XDP(快速数据路径)Kernel 4.8LIRC(红外)Kernel 4.18限制100万条指令Kernel 5.2Socket lookup(控制数据包入socket)Kernel 5.9开发方便开发者不需要自己定义数据结构,直接使用现成的Maps进行存储共享数据,只需要关注具体的业务实现代码。由于eBPF程序先编译成字节码,之后内核自己校验通过之后再生成可用的内核代码,所以可以一次编译处处运行,不需要像内核模块一样,每次更新内核之后都要重新编译。可以在x86上编译mips架构上运行的eBPF字节码。免去交叉编译的痛苦。安全数据操作都是通过Maps,操作Maps的函数也是预先定义好的,不存在访问空指针。eBPF使用介绍了这么多eBPF的概念,接下来实际操作一下,看看eBPF程序如何编译和使用,这里采用原汁原味的linux源代码编译演示。使用最新的archlinux系统,其他系统也差不多,稍微按照实际情况改一下。# asp checkout linux# 准备linux内核源码# makepkg -o -d –skippgpcheck# 下载linux源代码# make mrproper# zcat /proc/config.gz >.config# make headers_install# make modules_prepare# make VMLINUX_BTF=/sys/kernel/btf/vmlinux M=samples/bpf# asp checkout linux# 准备linux内核源码# makepkg -o -d –skippgpcheck# 下载linux源代码# make mrproper# zcat /proc/config.gz >.config# make headers_install# make modules_prepare# make VMLINUX_BTF=/sys/kernel/btf/vmlinux M=samples/bpf这里把内核自带的bpf示例程序都编译出来了,在目录samples/bpf下面。这里我们具体看一个sampleip的eBPF程序,看看eBPF程序是如何编写的直接上代码:首先17到23行定义了一个maps,叫ip_map,类型是哈希,键是u64,值是u32,最大长度8192。之后定义了一个do_sample函数,函数参数类型是bpf_perf_event_data,里面有当前内核IP指令指针寄存器的内容。通过调用bpf_map_lookup_elem函数来更新ip_map。运行内核编译好的sampleip程序,默认是采样5秒,每秒采样99次,程序结束后会把ip_map采集到的信息打印出来。从这个实例中可以看出,开发的eBPF程序比传统的内核开发方便了很多,数据结构不用操心,可以调用的函数也不用操心,都是预先定义好的,只需要实现自己的业务逻辑即可。eBPF使用场景linux性能分析,性能调优上面的sampleip就是简单的内核性能分析,可以看出当前内核经常调用的函数。eBPF对于内核开销很小,可以在生产环境排查问题的时候进行精确定位,同时由于eBPF的安全性,不用担心会把内核搞挂。有兴趣的可以去看一下bcc,里面对于内核每个子系统都有对应的eBPF监控程序,非常方便。linux网络加速eBPF在这个领域中也是牛的很,底层有XDP快速数据路径,可以直接在网卡收到数据包的同时进行处理,避免内核分配skb开销,可以用来实现DDos,负载均衡,性能媲美DPDK。再往上一点内核的tc也可以hook eBPF程序实现自定义流量分类,再向上的socket层还可以调用eBPF实现动态修改socket选项,甚至tcp的拥塞算法内核也提供了eBPF挂载的地方,可以自己实现一套新的拥塞算法。安全管理systemd中使用eBPF控制服务可以监听的端口,libvirtd也使用eBPF进行设备的访问控制,社区还有eBPF控制进程允许访问的文件,允许读写哪些/sys文件。eBPF的出现让Linux内核开发变得简单,降低了内核开发门槛,为普通人了解深入linux内核提供了途径,真的是一个革命性的发明,有linux的地方就有ebpf ^^。
综艺录入:admin    责任编辑:admin 
  • 上一个综艺:

  • 下一个综艺: 没有了
  • 发表评论】【加入收藏】【告诉好友】【打印此文】【关闭窗口
    最新热点 最新推荐 相关综艺
  • 婵犵數濮烽弫鍛婃叏閻戣棄鏋侀柛娑橈攻閸欏繘鏌i幋锝嗩棄闁哄绶氶弻鐔兼⒒鐎靛壊妲紒鎯у⒔缁垳鎹㈠☉銏犵闁绘劕鐏氶崳褏绱撴担绋款暢闁稿鍊濆璇测槈閵忕姈銊︺亜閺冨倸甯舵い顐熸櫇缁辨挻鎷呴幓鎺嶅闂備礁澹婇崑鍡涘窗閹捐泛濮柍褜鍓熷濠氬磼濮樺崬顤€缂備礁顑嗙敮锟犲极瀹ュ绫嶉柛顐ゅ枔閸橀箖姊洪崫鍕垫Ъ婵炲娲樼粋鎺楀閵堝棛鍘梺绯曞墲閿氱紒妤佸笚閵囧嫰顢曢敐鍥╃杽闂佽桨鐒﹂崝娆忕暦閵娾晩鏁嗛柍褜鍓熻棢婵﹩鍏橀弨浠嬪箳閹惰棄纾规俊銈勭劍閸欏繘鏌i幋锝嗩棄缁炬儳顭烽弻锝夊箛椤掑倷绮甸梺鍝勬缁捇寮诲澶婄厸濞达絽鎲″▓銊х磽娴g瓔鍤欐俊顐g箞瀵鎮㈤崗灏栨嫽闁诲酣娼ф竟濠偽i鈧弻鐔碱敍濠婂啯鐏堝┑顔硷攻濡炶棄螞閸愩劉妲堢€规洖娲ㄩ、鍛存⒑鐠囪尙绠抽柛瀣仧閳ь剚鑹鹃柊锝夊箖濞嗘挻鍋ㄩ柣銏㈩暜缁辨娊姊绘担鍛靛綊寮甸鍕殞濡わ絽鍟悞鍨亜閹哄秶鍔嶉柛濠冨姉閳ь剝顫夊ú姗€宕濋弴銏″仼闁跨喓濮寸粻鐘测攽閻樻彃鈧崵绮旈搹鍏夊亾鐟欏嫭绀€闁绘牕鍚嬫穱濠傤潰瀹€濠冃柣鐔哥矆閸楀磭绮婚弽褜娼栨繛宸簻缁€鍫ユ煙缂佹ê绗傜紒銊ょ矙濮婃椽宕妷銉愶綁鏌熼悷鐗堝枠妤犵偛鍟撮幃鐣岀矙閸ф鏁归梻浣告惈濞层劑宕伴幘璇茬煑闁糕剝绋掗埛鎴犵磽娴h偂鎴犵矆閳ь剟姊虹粙鍖″伐婵犫偓闁秴鐒垫い鎺嶈兌閸熸煡鏌熼崙銈嗗
  • 创富网论坛
    创富网论坛
    创富网论坛
    创富网论坛
      网友评论:(只显示最新10条。评论内容只代表网友观点,与本站立场无关!)
        没有任何评论