Linux内核技术eBPF浅析

引言 最近在阅读 《Linux内核观测技术BPF》这本书,非常薄的一本书却能带领我走入 Bpf 技术的世界,但是它只能起到一个入门的作用,用于工作的时候还是有点捉襟见肘,这篇文章只能当成一个较为深入的理解,不能取代系统性的学习。 当我们使用网络应用时,性能和可靠性是至关重要的。然而,由于内核网络栈的设计和实现方式,传统的用户空间网络应用在处理大量网络流量时会面临性能瓶颈。为了解决这一问题,Linux 内核引入了一种名为 eBPF(Extended Berkeley Packet Filter)的技术,它允许开发人员在内核中运行自定义的代码,从而提高网络应用程序的性能和灵活性。而下面要重点提到的 XDP(eXpress Data Path)是 eBPF 的一个子集,提供了一种快速的数据处理方法,它通过在数据包接收阶段运行代码来提高网络应用的性能。 这里有个点需要注意一下,eBPF 和 BPF 都是一种可以在Linux内核中使用的虚拟机技术,但是它们有一些不同之处,BPF 最初是一种用于数据包过滤的技术。随着时间的推移,它的功能逐渐扩展,被用于在内核中运行的各种任务,例如系统跟踪和安全审计等。BPF 程序在内核中直接执行,它可以访问内核数据结构,但是它的功能和灵活性受到了一些限制。 而 eBPF 是对 BPF 的扩展,即 “extended BPF”。它通过引入一个新的指令集,允许在内核中运行的 BPF 程序更加灵活和强大。eBPF 可以在安全的环境下执行用户定义的代码,而不会影响内核的稳定性和安全性。eBPF 还支持在内核和用户空间之间进行通信,并提供了一些新的功能,例如支持用户定义的映射和钩子程序。 总的来说,eBPF 是 BPF 的一个更加灵活和功能强大的版本,它为内核和用户空间提供了更多的通信和交互能力,同时保持了与内核的兼容性和安全性。我们入门的话会从 BPF 开始进行解析。 微服务时代Linux内核的问题 如果论起 eBpF 最出名的案例,莫过于 Cilium 了,我参考了 Cilium 项目发起人的演讲《How to Make Linux Microservice-Aware with Cilium and eBPF》,在云原生时代,为什么 eBpf 至关重要。而他其中列出了四个为什么当前 Linux 内核不适合当前的时代(背景为内核尚未对云原生做支持的时代)。 Abstractions 抽象 上图是一张和网络相关的抽象,它清晰地展示了 Linux 内核中各个部分的抽象,例如如果我们想用 Netfilter 做包过滤,那就必须要经过 socket 和 TCP 协议栈。而如果从网卡往上看的话,包需要经过 Netdevice -> traffic shaping -> Ethernet 等等才能到达上部分应用。...

March 19, 2023 · 1 min · Sxueck

祝贺站点在一周年之际获得各项技术评分优秀

年底事情太多了,加上最近 COVID-2019 的事件,我也不幸中招,一直没有时间更新博客 分数就当乐呵就行,纯当给生活增点趣味 SSL 安全评分 SSL 技术评分 A+ 级 速度 谷歌 Insights 评分满分 Gtmetrix 速度测试优秀 至此也算给 2022 画上一个极其潦草的句号(明年保证将以前的坑填完!!!)

December 24, 2022 · 1 min · Sxueck

K3s更换底层DataStore实现简易HA

前言 K3s 自带的 SQLite 应付普通的嵌入式小服务来说绰绰有余,但是对于公司这种动辄吃掉几个核的高频调度来说,虽然勉强能支撑起日常的响应,却总有时候出现奇奇怪怪的 BUG,我已经不止一次碰到了因为默认 ServiceAccount 和 Namespace 中的资源无法做实时绑定,导致 SpringCloud 一直无法正常启动的问题了,虽然可以通过万能重启做解决,但这远算不上高可用边缘部署方案 下面是官方给 K3s 画的一副简图,我们之前已经将默认的 LB 换成了 MetaLB 并表示效果非常优秀,这次我们也来缝缝补补,按照文档来说,K3s 支持以下的外接数据库 K3s supports the following datastore options Embedded SQLite PostgreSQL (certified against versions 10.7, 11.5, and 14.2) MySQL (certified against versions 5.7 and 8.0) MariaDB (certified against version 10.6.8) Etcd (certified against version 3.5.4) Embedded etcd for High Availability 因为想要为以后的 Cluster Metrics 做接口准备,所以就暂时不考虑内嵌 Etcd 的方式,而是选择自己外接,这样对于整个集群的运行状况有一个直观的了解,也方便做监控 —— K3s 砍去了太多东西换取轻量化 我们都知道 K8s 的默认 Datastore 是 Etcd,而 K3s 则是使用了一种称为 Kine 的组件将 Etcd 的 K/V 操作翻译为了关系数据库的语法,Kine 将自己的接口暴露给 K3s ApiServer,也就是说,在集群组件看起来,自己还是针对 Etcd 进行读写,然而如果我们设置真正的 Etcd Backend,Kine 会略过并直接暴露真实的 Etcd-servers 给 K3s ApiServer...

November 22, 2022 · 9 min · Sxueck

记一次服务器异常延迟问题

公司的某一台即将交付的生产环境数据库处理异步请求忽然异常缓慢,而且同事反馈说安装软件也有卡顿情况。 问题排查流程 初步尝试 首先我尝试将 PgSQL 服务进行重启,因为服务的异步处理速度延迟达到了1秒之久,况且该服务的依赖性没有那么高 $ kubectl rollout restart -n databases statefulset postgres-postgresql 结果出现了麻烦,整个 Pods 一直处于 Terminating 状态,一开始还以为是 PreStop 任务没有处理结束导致堵塞,后来发现 PgSQL 的日志已经在几分钟之前就不输出了,看起来是集群没有进行处理。 $ kubectl get event -n databases 47m Warning Unhealthy pod/postgres-postgresql-0 Liveness probe errored: rpc error: code = NotFound desc = failed to exec in container: failed to load task: no running task found: task dbd0aae87722bdababfdf720ec389aaeaab040f594b782451ea39edfbc1261bb not found: not found 47m Warning Unhealthy pod/postgres-postgresql-0 Readiness probe errored: rpc error: code = NotFound desc = failed to exec in container: failed to load task: no running task found: task dbd0aae87722bdababfdf720ec389aaeaab040f594b782451ea39edfbc1261bb not found: not found 通过查看错误事件即可发现,是清理 Container 的任务无法被正确处理,让我们手动清理一下...

October 18, 2022 · 7 min · Sxueck

浅析Linux内核中的Apparmor机制

前言 最近有在帮公司制作一个 OpenVpn Snap 安装包,然而频繁遇到了 Apparmor 错误,其实之前安装 Shadowsock 包的时候也见过,但是当时没怎么太认真探究,现在回看起来发现国内这方面的相关资料还是比较少的,本篇博文从介绍到实践由浅到深,帮助自己也帮助读者理解。 错误样例 $ sudo snap install easy-openvpn-server_0.2_amd64.snap --dangerous error: cannot perform the following tasks: - Setup snap "easy-openvpn-server" (unset) security profiles (cannot setup apparmor for snap "easy-openvpn-server": cannot unload apparmor profile: exit status 2 apparmor_parser output: File snap-update-ns.easy-openvpn-server not found, skipping... File snap.easy-openvpn-server.easy-openvpn-server not found, skipping... File snap.easy-openvpn-server.hook.configure not found, skipping... File snap.easy-openvpn-server.hook.connect-plug-firewall-control not found, skipping... File snap.easy-openvpn-server.hook.connect-plug-network-control not found, skipping... File snap....

October 15, 2022 · 2 min · Sxueck

驾考学习与总结

距离考试倒计时只剩下约 3 天,可是几乎没怎么学习,就是把 500 题刷了一遍,视频过了一遍而已,干脆和学计算机一样来个总结 扣分须知 目前国内考试基本用的是四月一日后新出的新规题目,经常会遇到视频和实际考题不一致的情况,这里重新巩固一下对于扣分的理解 扣一分的情况 最轻微或者不会造成事故的扣分,这一档次也是我们生活中时时刻刻会触犯到的 不按规定使用灯光 不系安全带 普通道路不按规定倒车/掉头,或者超速 10%-20% 违反禁令标志禁止标线(例如压线等情况) 普通客车未按规定年检就上路 货车超载不超过 30%,或者擅自改变已登记结构 做题的时候,想一下自己在路上是不是经常触碰到某些行为,或者事件发生在普通道路或者载货汽车危害不严重的时候,基本就是一分没跑了 扣三分的情况 这一类扣分行为是种类最多也是易错点最多的,如果我们想要强行总结,可以概括为 此类行为可能造成危害,且危害后果是可以预见的 开车打电话 不避让校车:小朋友多且出事情后果相当严重,但出事概率不算大 不避让行人 不按规定超车 快速与高速路段不按规定车道行驶 出故障后停车不按规定使用灯光:可能会造成后车误判导致追尾 高速行驶低于最低时速:说的就是你,五菱牌移动路障 货车违反 420 法制(开车大于 4 小时后没有休息 20 分钟):不过我感觉这个挺难界定的 不按规定安装号牌:咋地,照不到牌就没法扣你分了吗,当然前提是号牌要完好 需要AB照才能开的车没有按规定年检就上路:C照是1分 你看,3分基本都是与别人交互导致的事故,1分多是半惩戒性质,例如不打转向灯这种 同时注意,扣分体系中,高速/快速 和 普通道路 有的时候是两套规则,载客汽车 和 客运车/危险物品运输车 也是两套,涉及客运车这种即使是最轻微的未按规定年检上路,就已经从3分起扣了 3分这个区间还有一个关键区域值 – 20%-50%,将该区域套到普通道路与载客汽车上,即为3分 普通道路逆行 / 超速20%-50% 载客汽车超过核定人数 20%-50% 载货汽车超重 30%-50%: 30% 以下1分 载货汽车用来载客:对,躲货拉拉后备箱要扣三分 校车上路前未做车况检查 / 带隐患上路 扣六分的情况 六分一般会出现在出现在,一旦出事则会导致重大危险,且本身事故概率极大的场景中,亦或者是 AB 照相关车辆违规 不遵守交通信号灯,例如闯红灯 占用应急车道:会导致特种车无法及时作业 驾驶证被暂扣期间驾驶机动车 逃逸致人轻伤 / 财产损失:逃逸最轻的后果 载运危险物品车辆未按照指定的时间、线路、速度行驶或者未挂载警示标志 下面开始涉及到高速或者 50% 以上的区间...

September 29, 2022 · 2 min · Sxueck

Go Grpc使用说明书-Protoc篇

前言 熟悉这个博客的朋友都知道,我一般都不会写语言类的说明书,但这次由于网络资料参差不齐,中间走了许多弯路,特此进行一次记录 故事背景 公司的工业机器人需要做车端行为树的汇总,系统组配合那边给出来一个 Grpc 接口(C++写),我们这边调用函数,车端进行充电等行为时候会触发行为树操作,而我们负责监听即可,本来是一个非常简单的需求。 项目准备 在这里推荐写代码还是使用 Linux 或者 Mac 更好,Windows 的配置实在是太折磨人了。 我们先来看看最终的,也就是实际跑起来的项目结构: 含有注释的都是重点文件 ➜ tree . ├── compatibility.go ├── config.go ├── debug │ └── main.go # Server ├── go.mod ├── go.sum ├── grpc.go # 主要的接受监听部分代码,也可以看成 Client ├── grpc_test.go # 测试代码 ├── main.go ├── mongo.go ├── xx.api.rfi # grpc 包名,要和调用方保持一致 │ ├── behavior_tree_engine_grpc.pb.go # 主要实现的方法 │ └── behavior_tree_engine.pb.go ├── mqtt.go ├── proto │ └── behavior_tree_engine.proto # ProtoBuf 定义文件 └── README....

September 5, 2022 · 3 min · Sxueck