Linux TC eBPF и параллелизм
Существует ли ограничение на количество экземпляров программ eBPF, которые ядро может запускать одновременно на нескольких процессорах (аналогично проблеме с python GIL)
В частности, могут ли программы eBPF tc работать одновременно на нескольких процессорах?
Как eBPF выполняет блокировку структур данных ядра, когда он выполняет один и тот же код на нескольких процессорах?
1 ответ
В частности, могут ли программы eBPF tc работать одновременно на нескольких процессорах?
Да (подробности см. Ниже).
Как eBPF выполняет блокировку структур данных ядра, когда он выполняет один и тот же код на нескольких процессорах?
Параллельный доступ к картам в BPF защищен механизмом RCU. Однако в настоящее время нет способа защитить параллельный код в самих программах BPF. Так, например, программа BPF, работающая на первом ядре, может обновить значение между вызовами поиска и обновления той же самой программы, работающей на втором ядре.
В некоторых случаях для повышения производительности вы можете использовать карты для каждого процессора (например, массивы для каждого процессора и хэш-карты для каждого процессора). В этом случае API для поиска, обновления и удаления остается прежним, но каждое ядро фактически имеет свою собственную копию значений карты. Это означает, что, например, если вы увеличиваете счетчик на карте, каждое ядро будет видеть свой собственный счетчик, и вам придется агрегировать их значения в пользовательском пространстве, чтобы получить общий счетчик. Конечно, это не всегда подходит для вашего случая использования.