为什么用户空间应用程序应该锁定 Ebpf 映射?

Why should userspace applications lock Ebpf maps?

创建 EBPF 映射时,内存在内核中分配 space。并且内核内存永远不会被换出。那么,为什么用户space应用程序需要用RLIMIT_MEMLOCK调用setrlimit()

RLIMIT_MEMLOCK指的是可以锁定到RAM中的内存量,它并不特定于用户space内存地址范围内的分配。在 5.11 之前的内核上,用于 eBPF 对象(程序、映射、BTF 对象等)的内存是根据此资源计算的,这意味着如果您在给定时间或什至在很短的时间间隔内创建了太多它们(鉴于在内核回收相应内存区域之前删除对象后有一小段延迟),您可能会达到资源限制并得到 -EPERM 作为答案。对于特权用户,调用 setrlimit() 解除对该资源的限制确实是通常的解决方法。

请注意,在 Linux 5.11 中,rlimit-based accounting was dropped in favour of cgroup-based memory accounting。 rlimit 有许多缺点(有关详细信息,请参阅上面链接的求职信),并且基于 cgroup 的记帐更加灵活,同时允许更好的控制并提供更简单的方法来检索当前使用的内存量。它还应该反映实际的内存消耗,而 rlimit 不一定是这种情况。