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