【问题标题】:What are the limitations of bpf virtual machine and bpf map?bpf 虚拟机和 bpf map 有什么限制?
【发布时间】:2020-05-03 23:02:52
【问题描述】:

我正在使用 ebpf+XDP 做一些演示。

当我使用大内存MAP时,例如:

BPF_HASH(cache, u64, u64, 10240000);
BPF_HASH(filter1, u32, u64, 10240000);
BPF_HASH(filter2, struct XXX, u16, 10240000);

当我运行这个demo时,运行一段时间后,程序自动被杀死。

这里是错误说:

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 虚拟机限制或地图限制?

这是我运行“free -g”时的结果。

              total        used        free      shared  buff/cache   available
Mem:              3           0           3           0           0           3
Swap:             3           0           3

【问题讨论】:

  • 我无法重现。你能发布一个实际的,最小的复制案例吗?另外,您使用的是什么版本的密件抄送?

标签: linux bpf ebpf


【解决方案1】:

当您创建 BPF 映射时,会在内核空间中为这些映射分配内存。显然,它们越大,需要的内存就越多。

虽然 BPF 实际上对映射的大小没有限制(除了传递给内核以给出映射大小的 32 位无符号整数的最大值),但内核本身由于底层硬件而受到限制。如果内核完全耗尽内存,就会发生坏事。通常,它会挂起或崩溃。为避免这种情况,当内存变得稀缺时,内存不足 (OOM) 杀手会采取行动并杀死一个进程,以尝试释放内存。

据我了解,这就是您的情况。限制不是来自 BPF 或 BPF 映射,而是来自您的系统(内核)内存不足。当 kill 发生时,您可以使用dmesg 在内核日志中获取更多信息(另请参阅how to read the logs)。

所以回答你在标题中所说的问题:BPF 映射的大小不受限制,除了我们可能传递给bpf() 系统调用的最大值(uint_32,这就是4GB)。非 root 用户可能对他们可以锁定在内核中的空间量有额外的限制(root 可以在 shell 中使用 ulimit -l 或在 C 程序中使用 setrlimit() 删除这些限制)。 BPF 基础设施存在其他“限制”(堆栈大小、尾调用数量等),但我认为在这里列出所有这些限制并没有多大帮助。您可以在Cilium guide 中找到有关它们的更多信息。

【讨论】:

  • 嗨@Qeole,在内核源代码here 中,如果size >= U32_MAX - PAGE_SIZE 断言映射太大,您知道语句中有- PAGE_SIZE 的原因吗?也就是说,大小不应超过4GB - 4KB(比如拱门是amd64)而不是简单的4GB内存有什么理由吗?谢谢!
  • 是的,我在回答时错过了那张支票。在此检查移至 syscall.c 之前,它是 used to be accompanied with a comment:/* make sure there is no u32 overflow later in round_up() */。所以我知道最终的实际大小是根据用户传递的值四舍五入的,以确保它是PAGE_SIZE 的倍数。因此我们需要确保这种向上取整不会导致溢出。
猜你喜欢
  • 2023-04-11
  • 1970-01-01
  • 2020-04-21
  • 1970-01-01
  • 2021-09-28
  • 1970-01-01
  • 2020-06-21
  • 2014-08-22
  • 2020-12-28
相关资源
最近更新 更多