Linux TC eBPF и параллелизм

Существует ли ограничение на количество экземпляров программ eBPF, которые ядро ​​может запускать одновременно на нескольких процессорах (аналогично проблеме с python GIL)

В частности, могут ли программы eBPF tc работать одновременно на нескольких процессорах?

Как eBPF выполняет блокировку структур данных ядра, когда он выполняет один и тот же код на нескольких процессорах?

1 ответ

В частности, могут ли программы eBPF tc работать одновременно на нескольких процессорах?

Да (подробности см. Ниже).

Как eBPF выполняет блокировку структур данных ядра, когда он выполняет один и тот же код на нескольких процессорах?

Параллельный доступ к картам в BPF защищен механизмом RCU. Однако в настоящее время нет способа защитить параллельный код в самих программах BPF. Так, например, программа BPF, работающая на первом ядре, может обновить значение между вызовами поиска и обновления той же самой программы, работающей на втором ядре.

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

Другие вопросы по тегам