创建EBPF映射时,内存是在内核空间中分配的。内核内存永远不会被换出。那么,为什么用户空间应用程序需要用RLIMIT_MEMLOCK
调用setrlimit()
呢?
RLIMIT_MEMLOCK
是指可能被锁定到RAM中的内存量,它与用户空间内存地址范围内的分配无关。在5.11之前的内核中,eBPF对象(程序、映射、BTF对象等)所使用的内存是根据这个资源计算的,这意味着如果您在给定的时间内,或者甚至在很短的时间间隔内(考虑到在内核回收相应的内存区域之前删除对象之后有一小段延迟)创建了太多的eBPF对象,那么您可能会达到资源限制并得到一个-EPERM
作为答案。对于特权用户,调用setrlimit()
来解除对该资源的限制确实是通常的解决方案。
请注意,在Linux 5.11中,基于rlimit的记帐被基于cgroup的内存记帐所取代。rlimit有很多缺点(有关详细信息,请参阅上面链接的求职信),基于cgroup的记帐更灵活,同时允许更好的控制并提供更简单的方法来检索当前使用的内存量。它还应该反映实际的内存消耗,而对于rlimit则不一定如此。