Каковы ограничения виртуальной машины bpf и карты bpf? - PullRequest
0 голосов
/ 17 января 2020

Я использую 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 limit или map limit?

Вот результат, когда я запускаю "free -g".

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

1 Ответ

0 голосов
/ 17 января 2020

Когда вы создаете карты BPF, память выделяется в пространстве ядра для этих карт. Очевидно, что чем они больше, тем больше требуется памяти.

Хотя BPF практически не имеет ограничений на размер карт (кроме максимального значения для 32-битного целого числа без знака, которое передается ядру в укажите размер карты), само ядро ​​имеет ограничения из-за аппаратного обеспечения. Если бы ядру не хватило памяти, случились бы плохие вещи. Как правило, он завис бы или кра sh. Чтобы избежать этого, когда памяти становится мало, убийца из нехватки памяти (OOM) вступает в действие и убивает процесс, пытаясь освободить память.

Насколько я понимаю, это то, что происходит в вашем случае , Ограничение не из карт BPF или BPF, а просто из-за того, что вашей системе (ядру) не хватает памяти. Вы можете получить больше информации в журналах ядра с помощью dmesg, когда произойдет уничтожение (см. Также , как читать журналы ).

Итак, ответьте на вопрос, который вы сформулировали в title: BPF-карты не ограничены по размеру, кроме максимального значения, которое мы можем передать системному вызову bpf() (a uint_32, то есть около 4 ГБ). Пользователи, не являющиеся root, могут иметь дополнительные ограничения на количество места, которое они могут блокировать в ядре (root может удалить эти ограничения с помощью ulimit -l в оболочке или setrlimit() в программе C) , Существуют и другие «ограничения» для инфраструктуры BPF (размер стека, количество оконечных вызовов и т. Д. c.), Но я не думаю, что перечисление всех их здесь очень поможет. Вы можете найти больше информации о них в руководстве Cilium .

...