【发布时间】:2018-04-09 15:22:43
【问题描述】:
内核可以在多个 CPU 上同时运行的 eBPF 程序实例的数量是否有限制(类似于 python GIL 问题)
特别是 eBPF tc 程序可以同时在多个 CPU 上运行吗?
当 eBPF 在多个 CPU 上运行相同的代码时,它是如何锁定内核数据结构的?
【问题讨论】:
标签: concurrency linux-kernel locking bpf ebpf
内核可以在多个 CPU 上同时运行的 eBPF 程序实例的数量是否有限制(类似于 python GIL 问题)
特别是 eBPF tc 程序可以同时在多个 CPU 上运行吗?
当 eBPF 在多个 CPU 上运行相同的代码时,它是如何锁定内核数据结构的?
【问题讨论】:
标签: concurrency linux-kernel locking bpf ebpf
特别是 eBPF tc 程序可以同时在多个 CPU 上运行吗?
是的(请参阅下面的详细信息)。
当 eBPF 在多个 CPU 上运行相同的代码时,它是如何锁定内核数据结构的?
BPF 中对映射的并发访问受the RCU mechanism 保护。但是,目前还没有办法保护 BPF 程序本身中的并发代码。因此,例如,在第一个内核上运行的 BPF 程序可能会在第二个内核上运行的同一程序的查找和更新调用之间更新一个值。
在某些情况下,为了提高性能,您可以使用每 CPU 映射(例如,每 CPU 数组和每 CPU 哈希图)。在这种情况下,用于查找、更新和删除的 API 保持不变,但每个核心实际上都有自己的映射值副本。这意味着,例如,如果您在地图中增加一个计数器,每个核心将看到自己的计数器,您必须在用户空间中聚合它们的值以获得总计数器。当然,这可能并不总是适合您的用例。
【讨论】: