首页
关于
Search
1
PacketForge 博客部署文档
16 阅读
2
深入 SONiC 与 SAI:从命令行到芯片的完整数据之旅
14 阅读
3
DPU 与 CPO:AI 时代的网络基础设施革命
11 阅读
4
Broadcom芯片
10 阅读
5
DPDK高性能网络
10 阅读
默认分类
交换芯片
高性能网络
AI算力网络
WebSocket高性能项目
DPDK 成长路线
①性能工程基础
②DPDK 源码深读
③用户态协议栈
④软件交换与 SONiC
⑤PCIe、虚拟化与 DPU
⑥面试与复盘
登录
Search
标签搜索
DPDK→DPU 学习路线
P0
P1
P2
P3
P5
PCIe
P4
P6
libmtcp
NUMA
mTCP
OVS
SONiC
SAI
DPU
perf
gdb
EAL
mempool
PacketForge
累计撰写
53
篇文章
累计收到
3
条评论
首页
栏目
页面
关于
最新文章
热门文章
评论最多
点赞最多
2026-08-18
P6-02 · 面试题库精选:内核 vs DPDK 对照 20 题,每题答案都指向源码行
对应路线图:Phase 6 (Day 169-196) | 母本任务 Day 515("内核 vs DPDK"对照题 20 道)出处:source/dpdk-stable-24.11.6/ 与 source/linux-stable/(v6.6)及 source/sonic-sairedis/,行号全部逐条核对过上一篇:P6-01 自研 DPU 架构 | 下一篇:P6-03 总结篇一句话定位对照题是面试题库里性价比最高的一类:一道题考两套体系,答出来等于同时证明你懂内核和懂 DPDK。与 P1 七篇的自测题不重复——P1 考"是什么、在哪一行",这 20 题考"两套设计为什么不同"。主题 1 · skb vs mbuf(Q1-3)Q1. 为什么 DPDK 不直接复用 struct sk_buff?sk_buff 要服务通用内核栈:引用计数共享(clone)、非线性 frag 页、四个协议头指针、drop reason 跟踪,结构臃肿(include/linux/skbuff.h:843 起)。mbuf 是"为线速转发重新设计":双 cache line 布局,热字段(data_off/refcnt/nb_segs/port)打包进 8 字节 rearm_data 一次 store 复位(lib/mbuf/rte_mbuf_core.h:467, 488-514,P1-04 已读)。差异根源:skb 服务"任意 socket",mbuf 服务"单一转发路径"。Q2. 为什么 skb 释放不能直接回池,mbuf 可以?skb 释放要过引用计数:skb_release_data(net/core/skbuff.c:962)检查 dataref、逐个释放 frag 页——因为 skb 可能被 clone 共享。mbuf 回池是 O(1):rte_pktmbuf_free(lib/mbuf/rte_mbuf.h:1415)塞回 per-lcore cache。本质:skb 数据被多方持有,mbuf 生命周期由应用显式管理。Q3. 两边的"零拷贝"手段各是什么?skb 侧靠 frag 列表:数据放 page,skb_shared_info 挂 nr_frags,复制只复制 skb 头。mbuf 侧两招:chain(next 串多段)和 attach 外部 buffer——rte_pktmbuf_attach(lib/mbuf/rte_mbuf.h:1165)让多个 mbuf 指向同一 extbuf。skb 的 frag 面向协议栈收包,mbuf 的 attach 面向应用层零拷贝(隧道封装/广播)。主题 2 · NAPI vs PMD(Q4-6)Q4. 内核收包路径 vs DPDK 收包路径,中间差了什么?内核:硬中断 → NAPI 调度(napi_poll,net/core/dev.c:6707)→ 软中断预算内轮询 → GRO → 协议栈 → socket 拷贝+唤醒。DPDK:应用直接 rte_eth_rx_burst → PMD 轮询描述符(ixgbe_recv_pkts,drivers/net/ixgbe/ixgbe_rxtx.c:1784)→ mbuf 交给应用。少的四样:中断上下文切换、软中断调度、GRO/socket 两层拷贝、进程唤醒。Q5. NAPI 的 budget/weight 解决什么问题?DPDK 为什么没有?每轮 poll 最多收 NAPI_POLL_WEIGHT=64 个包(include/linux/netdevice.h:2633),net_rx_action(net/core/dev.c:6816)还有总预算和 2ms 时间片——防止软中断饿死其他任务。DPDK lcore 独占,无预算,burst 上限由应用定(ixgbe_rxtx.c:1812 的 while (nb_rx < nb_pkts))——用 100% CPU 换确定性。Q6. 内核驱动的"中断合并"(interrupt moderation)是干什么的?DPDK 有吗?低负载靠中断省 CPU,高负载自动转轮询:ixgbe_update_itr(drivers/net/ethernet/intel/ixgbe/ixgbe_main.c:2517)按流量动态调 EITR 寄存器。DPDK 没有这个概念——中断直接关掉永远全速轮询,代价是 CPU 常驻 100%。这题答的是"两种哲学":自适应 vs 确定性。主题 3 · slub vs mempool(Q7-8)Q7. slub 的 per-CPU cache 和 mempool 的 per-lcore cache 是不是一回事?思想相同(本地缓存摊薄全局锁),结构不同。slub:cpu_slab->freelist 单对象栈,本地空了走 partial 链表跨 CPU 补货(get_partial,mm/slub.c:2408)。mempool:批量数组 + 1.5 倍 flushthresh 水位(struct rte_mempool_cache,lib/mempool/rte_mempool.h:90),一次从共享 ring 补货 cache_size 个。___slab_alloc(mm/slub.c:3107)与 rte_mempool_do_generic_get 的三级路径结构同构——这是 P1-02 对照的升级考法。Q8. 内核为什么不干脆把所有 skb 预分配好?三个约束:① skb 数据区大小按 MTU/协议变化,对象尺寸不固定;② 全局数量不可预知(任意 socket 都在产生包);③ 内核必须承受内存回收压力。DPDK 场景三个都反过来:固定大小、固定网卡、启动时申请全部大页,之后零分配——所以 mempool 敢预分配。主题 4 · kfifo vs rte_ring(Q9-10)Q9. kfifo 声称"无锁",和 rte_ring 的无锁是同一回事吗?不是。kfifo 的免锁前提苛刻:单生产者单消费者,且 in/out 下标各归一方独占写(__kfifo_in,lib/kfifo.c:113),连 CAS 都不用。rte_ring 支持 MP/MC:__rte_ring_do_enqueue_elem(lib/ring/rte_ring_elem_pvt.h:321-336)里生产者先 CAS 抢 head 区间(:329),数据写完 tail 才发布(:336)——多生产者免锁靠的是"先占位、后发布"。Q10. 为什么内核队列普遍要求 2 的幂大小?kfifo 用 roundup_pow_of_two(lib/kfifo.c:31)强制对齐,把回绕后的重新线性化变成位与操作;in-out 计数用 unsigned 回绕溢出,天然区分满/空。rte_ring 同理:head/tail 用 uint32 允许回绕 + mask 索引(P1-03 Q3 已证模 2^32 减法)。同一个数学技巧,两套代码都在用。主题 5 · tc flower vs rte_flow(Q11-13)Q11. 一条 tc flower 规则在内核里怎么生效?tc 命令 → netlink 下发 → 收包路径 fl_classify(net/sched/cls_flower.c:313)逐字段提取 fl_flow_key 与规则 mask 比对,命中执行 action(mirred 转发/丢弃)。全软件:每个包都要花 CPU 查表——这就是为什么 OVS 要有 EMC/dpcls 两级缓存(P3-01)。Q12. rte_flow 的 pattern/action 模型强在哪?rte_flow_create(lib/ethdev/rte_flow.c:406)的 pattern/action/attr 三元组:group 分级、priority 定序、ingress/egress 定方向。规则可直接下网卡硬件(TCAM/哈希),匹配在硬件完成;同一套 API 可软可硬、跨厂商。tc flower 做不到这个抽象高度——它的语义绑定内核转发平面。Q13. 内核也有 flow offload,和 DPDK 的差别?内核 flow_block 机制(tcf_block_offload_init,net/sched/cls_api.c:747)把 flower 规则回调给驱动下硬件,但 offload 失败要回退软件、要兼容 tc 语义。DPDK 的 rte_flow 设计第一天就面向卸载:语义即硬件语义,没有回退包袱。答出"回退负担"这个点,面试官就知道你真读过(P5-05 实测过 SW/HW 对比)。主题 6 · netlink vs sairedis(Q14-15)Q14. 内核怎么把"添加 IP 地址"这类配置下到内核?netlink:rtnetlink_rcv_msg(net/core/rtnetlink.c:6368)按消息类型分派到 do 函数,如 rtnl_newlink(net/core/rtnetlink.c:3744)直接改内核数据结构。消息即状态,全系统只有这一条通道。Q15. SONiC 为什么不用 netlink,要造 sairedis + Redis?netlink 绑定单一内核实例。SONiC 要跨容器、跨进程、厂商无关:sairedis 把 SAI API 调用序列化后写 Redis——ClientSai.cpp:488(source/sonic-sairedis/lib/)的 m_communicationChannel->set(key, entry, REDIS_ASIC_STATE_COMMAND_CREATE),syncd 订阅后翻译成硬件操作。多 ASIC、热重启、多进程协作全靠这个解耦通道。代价:多一跳 Redis,时延换灵活性。主题 7 · RPS/RFS vs 硬件分流(Q16-17)Q16. RFS 的 rps_sock_flow_table 想解决什么?DPDK 需要吗?RPS 把流分到 CPU,但应用可能在别的核上收。RFS 的全局表(rps_sock_flow_table,net/core/dev.c:4591)记住流上次被哪个 CPU 的 recvmsg 消费,收包优先送那个核——减少跨核唤醒。DPDK 不需要:轮询核就是应用核,RSS 保证同流同核(P1-07)。这题考的是"为什么 DPDK 的模型天然简化了问题"。Q17. XDP_REDIRECT 的 cpumap 和 DPDK 跨核 pipeline 的对应关系?xdp_do_redirect(net/core/filter.c:4479)把包从驱动核重定向到指定 CPU 的 per-CPU 队列——对应 DPDK pipeline 模型里 lcore 间用 rte_ring 传 mbuf。差别:内核要软中断驱动、排队在 backlog(enqueue_to_backlog,net/core/dev.c:4882),DPDK 直接批量入 ring,还免了中断唤醒。主题 8 · VFIO / vDPA(Q18-20)Q18. VFIO 做到"安全直通"靠哪三件事?① IOMMU 把设备 DMA 关进 IOVA 范围(DMA 隔离);② mmap BAR 到用户态(寄存器访问);③ 中断经 eventfd 送到用户态。vfio_pci_core_ioctl(drivers/vfio/pci/vfio_pci_core.c:1452)分发这三类请求;DPDK 侧入口是 rte_vfio_enable(lib/eal/linux/eal_vfio.c:1081)。P5-02 深读过,这里要能三句话收口。Q19. 内核 vDPA framework 和 DPDK vDPA 各干什么?内核负责控制面:__vdpa_alloc_device / vdpa_register_device(drivers/vdpa/vdpa.c:157, 265)提供抽象设备 + config_ops 回调,virtio_vdpa 把它包装成 VM 眼中的标准 virtio 设备。DPDK 负责数据面:rte_vdpa_register_device(lib/vhost/vdpa.c:74)——virtqueue 直接映射进硬件 DMA,数据搬运不经过 Host CPU(P5-04)。Q20. DPDK 早期用 UIO,为什么现在一律 VFIO?UIO 只有 mmap(uio_mmap,drivers/uio/uio.c:762),没有 IOMMU 隔离——故障/恶意设备可 DMA 任意内存,中断也不能安全路由。VFIO 有完整 IOMMU + 中断 + 生态。生产环境合规(多租户/云)是决定性理由。答这题记得补一句:UIO 至今还在内核里,只是 DPDK 新代码默认 VFIO。面试 3 问(如果只背 3 题,背这三题)Q4:能画出内核 8 步 vs DPDK 3 步的两条收包链;Q9:kfifo 与 rte_ring 的"免锁"边界(SPSC vs CAS 占位发布);Q18:VFIO 三件事——IOMMU、mmap BAR、中断。🔧 行动清单(对应母本 Day 456-546)把这 20 题并入 career/qa-kernel.md(母本 Day 515 任务),每题答案下面贴一行源码引用;Day 522 DPU 架构题 20 道写作时,以 Q18/Q19 为种子扩写 vDPA/多租户;Day 530-531 模拟面试前全文过一遍,每道题控制在 60 秒内答完要点 + 背出两个行号;面试官追问"你确定?"时,把对应源码文件当场调出来对——这就是行号式答案的底气。下一篇:P6-03 · 总结篇:18 个月,从 DPDK 用户到 DPU 架构师
2026年08月18日
1 阅读
0 评论
0 点赞
第 1/1 页 · 本页 1 条 · 共 1 条