[英]What are the limitations of bpf virtual machine and bpf map?
我正在使用 ebpf+XDP 做一些演示。
当我使用大内存 MAP 时,例如:
BPF_HASH(cache, u64, u64, 10240000);
BPF_HASH(filter1, u32, u64, 10240000);
BPF_HASH(filter2, struct XXX, u16, 10240000);
当我运行这个演示时,运行一段时间后,程序自动被杀死。
这是错误说:
Out of memory: KIll process 1618 (sshd) score 0 or sacrifice child
Killed process 1618 (sshd) total-vm:625792kB, anon-rss:0kB, file-rss:4kB, shmem-rss:0kB
我不明白这个错误是什么意思。
这是系统限制还是 bpf vm 限制或映射限制?
这是我运行“free -g”时的结果。
total used free shared buff/cache available
Mem: 3 0 3 0 0 3
Swap: 3 0 3
创建 BPF 映射时,会在内核空间中为这些映射分配内存。 显然,它们越大,需要的内存就越多。
虽然 BPF 对映射的大小几乎没有限制(除了传递给内核以给出映射大小的 32 位无符号整数的最大值),但内核本身由于底层硬件而受到限制。 如果内核完全耗尽内存,坏事就会发生。 通常,它会挂起或崩溃。 为避免这种情况,当内存变得稀缺时,内存不足 (OOM) 杀手会启动并终止进程,以尝试释放内存。
据我了解,这就是您的情况。 限制不是来自 BPF 或 BPF 映射,而是来自您的系统(内核)内存不足。 当发生dmesg
时,您可以使用dmesg
在内核日志中获取更多信息(另请参阅如何读取日志)。
所以要回答标题中的问题:BPF 映射的大小不受限制,除了我们可能传递给bpf()
系统调用的uint_32
(一个uint_32
,所以大约为 4GB)。 非 root 用户可能对他们能够在内核中锁定的空间量有额外的限制(root 可以在 shell 中使用ulimit -l
或在 C 程序中使用setrlimit()
来删除这些限制)。 BPF 基础设施存在其他“限制”(堆栈大小、尾调用的数量等),但我认为在这里列出所有这些限制不会有太大帮助。 您可以在Cilium 指南中找到有关它们的更多信息。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.