繁体   English   中英

bpf虚拟机和bpf映射有什么限制?

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM