内核能否同时在多个CPU上运行多个eBPF程序实例是否存在限制?(类似于Python的GIL问题) 特别是,eBPF tc程序能否同时在多个CPU上工作? eBPF在同时在多个CPU上运行相同代码时,如何锁定内核数据结构?
特别地,eBPF tc程序可以在多个CPU上同时工作吗?是的(见下文详细说明)。eBPF运行相同代码在多个CPU上时,对内核数据结构的锁定是如何完成的?BPF中映射的并发访问受到RCU机制的保护。然而,目前没有办法保护BPF程序本身中的并发代码。因此,例如,运行在第一个核心上的BPF程序可能会在第二个核心上运行的相同程序的查找和更新调用之间更新值。在某些情况下,为了提高性能,您可以使用每个CPU的映射(例如,每个CPU数组和每个CPU哈希表)。在这种情况下,查找、更新和删除的API保持不变,但每个核心实际上都有自己的映射值副本。这意味着,例如,如果您正在增加映射中的计数器,则每个核心将看到自己的计数器,并且您必须在用户空间聚合它们的值以获得总计数器。当然,这可能并不总是适合您的用例。