mirror of
https://github.com/eunomia-bpf/bpf-developer-tutorial.git
synced 2026-10-29 03:34:44 +08:00
Fix egress tutorial prose checks
This commit is contained in:
@@ -735,7 +735,7 @@ refusing to replace the existing root qdisc on IFACE
|
||||
|
||||
This lesson implements one aggregate FIFO. It has no fairness, per-flow isolation, per-cgroup policy, classes, priorities, ECN, burst budget, or congestion-control integration. The queue limit counts packets, and rate accounting uses `qdisc_skb_cb(skb)->pkt_len`. The first packet after an idle period may depart immediately.
|
||||
|
||||
Rate and queue limit stay fixed for one invocation. Global queue and BSS state also limit one loader process to one root qdisc instance. The loader stops whenever exclusive creation reports `-EEXIST`; it does not inspect, preserve, stack, or restore the conflicting qdisc.
|
||||
Rate and queue limit stay fixed for one invocation. Global queue and BSS state also limit one loader process to one root qdisc instance. The loader stops whenever exclusive creation reports `-EEXIST`. It does not inspect, preserve, stack, or restore the conflicting qdisc.
|
||||
|
||||
The CLI is duration bounded. It is not a daemon, controller, metrics exporter, or persistent policy manager. Duration-based exit and SIGTERM cleanup were tested. SIGINT uses the same handler but was not tested separately. Cleanup is not guaranteed after SIGKILL or another abnormal process failure, and host-crash and reboot behavior were not tested.
|
||||
|
||||
|
||||
@@ -1,6 +1,6 @@
|
||||
# eBPF 教程:用 BPF Qdisc 控制出口流量
|
||||
|
||||
实验服务突然向 veth 接口发送一阵流量。队列随之增长,延迟开始抖动,部分报文消失了,却没有留下清晰的丢包统计。遇到这种情况,我们需要把突发限制在已知速率内,给队列设定上限,还要知道报文究竟已经发出,还是在队列中被丢弃。本课实现的 `egress_pacer` 就是这样一个小工具。它使用 Linux 6.16 引入的 BPF `struct_ops` 注册一个 FIFO qdisc,为每个报文计算允许发送的时间,并在运行结束时报告入队、出队、字节数和丢包统计。加载器采用独占创建;如果操作返回 `-EEXIST`,它就拒绝继续。测试中安装冲突 `pfifo` 的场景会触发这条路径。
|
||||
实验服务突然向 veth 接口发送一阵流量。队列随之增长,延迟开始抖动,部分报文消失了,却没有留下清晰的丢包统计。遇到这种情况,我们需要把突发限制在已知速率内,给队列设定上限,还要知道报文究竟已经发出,还是在队列中被丢弃。本课实现的 `egress_pacer` 就是这样一个小工具。它使用 Linux 6.16 引入的 BPF `struct_ops` 注册一个 FIFO qdisc,为每个报文计算允许发送的时间,并在运行结束时报告入队、出队、字节数和丢包统计。加载器采用独占创建。如果操作返回 `-EEXIST`,它就拒绝继续。测试中安装冲突 `pfifo` 的场景会触发这条路径。
|
||||
|
||||
这个示例面向受控的 veth、TAP 或 IFB 接口,不是通用物理网卡上的生产调度器。读完后,你会理解 BPF qdisc 如何持有 skb、qdisc watchdog 如何避免忙等待,以及用户态如何在一个有时限的实验中安装并移除 qdisc。
|
||||
|
||||
@@ -645,7 +645,7 @@ next_departure_ns = eligible_ns + interval_ns
|
||||
|
||||
工具打印 `READY` 后,以 100 ms 为间隔休眠,直到持续时间结束或信号处理函数设置 `exiting`。SIGINT 和 SIGTERM 共用这个处理函数。集成测试覆盖按时长退出与 SIGTERM,没有另外执行一遍 SIGINT。
|
||||
|
||||
清理流程先调用 `bpf_tc_hook_destroy`,再读取 `skel->bss->stats`。成功移除 qdisc 时,reset 会处理残留队列,因此 `SUMMARY` 包含清理阶段的丢包。如果移除失败,加载器会报告错误,打印当时可读到的 BSS 统计并返回失败;操作者仍需检查并恢复接口。最后,加载器销毁 skeleton,并注销 `struct_ops` link。
|
||||
清理流程先调用 `bpf_tc_hook_destroy`,再读取 `skel->bss->stats`。成功移除 qdisc 时,reset 会处理残留队列,因此 `SUMMARY` 包含清理阶段的丢包。如果移除失败,加载器会报告错误,打印当时可读到的 BSS 统计并返回失败。操作者仍需检查并恢复接口。最后,加载器销毁 skeleton,并注销 `struct_ops` link。
|
||||
|
||||
## 编译和运行
|
||||
|
||||
@@ -733,7 +733,7 @@ refusing to replace the existing root qdisc on IFACE
|
||||
|
||||
本课只实现一个聚合 FIFO,没有公平调度、每流隔离、每 cgroup 策略、类别、优先级、ECN、突发预算或拥塞控制集成。队列上限统计报文数,速率计算使用 `qdisc_skb_cb(skb)->pkt_len`。接口空闲后的第一个报文可以立即发出。
|
||||
|
||||
一次运行中的速率和队列上限保持固定。全局队列与 BSS 状态也意味着一个加载器进程只能管理一个 root qdisc 实例。独占创建返回 `-EEXIST` 时,加载器会停止;它不会检查、保留、堆叠或恢复冲突的 qdisc。
|
||||
一次运行中的速率和队列上限保持固定。全局队列与 BSS 状态也意味着一个加载器进程只能管理一个 root qdisc 实例。独占创建返回 `-EEXIST` 时,加载器会停止。它不会检查、保留、堆叠或恢复冲突的 qdisc。
|
||||
|
||||
这个命令行工具只运行指定时长,不是守护进程、控制器、指标导出器或持久策略管理器。测试覆盖了按时长退出和 SIGTERM 清理。SIGINT 使用同一个信号处理函数,但没有单独测试。SIGKILL 或其他异常终止后不保证完成清理,宿主机崩溃与重启后的行为也没有测试。
|
||||
|
||||
|
||||
Reference in New Issue
Block a user