用户态应用为何需要锁定eBPF maps并调用setrlimit设置RLIMIT_MEMLOCK
为什么eBPF map内存分配在内核空间,还需要用户态设置
RLIMIT_MEMLOCK? - 内核版本历史逻辑限制
Linux 5.11之前的内核没有为eBPF子系统设计独立的内存统计机制,所有eBPF map、eBPF程序占用的不可换出内核内存,都会计入发起创建请求的用户进程的RLIMIT_MEMLOCK配额中。多数发行版默认给非特权进程的锁定内存配额仅为64KB,远不足以支撑常规eBPF map的内存需求,不通过setrlimit()调整该配额的话,创建map会直接返回ENOMEM或EPERM错误。 - 非特权进程的权限约束
即使是5.11及以上版本的内核,没有CAP_BPF、CAP_SYS_ADMIN特权的普通进程创建eBPF资源时,仍然会受RLIMIT_MEMLOCK配额限制。只有持有对应特权的进程,才会切换到cgroup eBPF内存记账规则,不受该rlimit的约束。 - 内核内存防滥用机制
RLIMIT_MEMLOCK本质是内核用于限制进程申请不可回收、不可换出内存的通用配额规则,不管内存最终分布在内核空间还是用户空间,只要是进程主动申请的锁定类内存,都会占用该配额。这个限制可以避免普通进程无节制创建eBPF map耗尽内核内存,导致整机故障。
内容的提问来源于stack exchange,提问作者joz
相关产品推荐
相关产品推荐

