Работает ли сетевой стек Linux параллельно на многоядерной машине?

#network-programming #tcp #multicore #parallel-processing

#сетевое программирование #tcp #многоядерный #параллельная обработка

Вопрос:

У меня 4-ядерная машина под управлением Linux 2.6.x. Машина с одним домом (т. Е. с 1 сетевой картой).

На этой машине я запускаю 4 процесса (или, альтернативно, 4 потока в 1 процессе), которые выполняют сетевой ввод-вывод с / на 4 разных хоста в сети.

Вопрос: Смогут ли эти 4 потока сетевого ввода-вывода выполняться параллельно? Могу ли я предположить, что стек TCP / IP (включая драйвер сетевого устройства) полностью состоит из параллельного кода, который может использовать несколько ядер для полностью параллельной работы? Будут ли эти потоки когда-либо блокировать попытки получения какого-либо общего ресурса в стеке TCP / IP на любом этапе их сетевого ввода-вывода, тем самым приводя к тому, что части стека — и, следовательно, 4 потока прикладного уровня, расположенные поверх — будут частично последовательными и не полностью параллельными?

Комментарии:

1. Вероятно, было бы лучше добавить несколько сетевых адаптеров (или один сетевой адаптер с несколькими портами), поскольку вы могли бы привязать каждый порт / IRQ к другому процессору.

Ответ №1:

Да, все 4 потока будут выполнять сетевой ввод-вывод (большая блокировка ядра закончилась с Linux 2.4).

Вы заметите конфликт на машине с 64 ядрами, подобный проанализированному в этой статье (с использованием Linux 2.6.35): https://www.usenix.org/legacy/events/osdi10/tech/full_papers/Boyd-Wickizer.pdf , но с использованием всего 4 ядер и более новых ядер, вероятно, вы не заметили никаких разногласий.

PS: Даже если у вас есть набор микросхем или сетевая карта, которая отправляет прерывания только на CPU 0, прием пакетов будет распределен по всем ядрам, потому что это делается с помощью программных прерываний, которые могут быть назначены любому ядру. Вы можете использовать cat / proc / interrupts, чтобы проверить, распределяются ли прерывания сетевого оборудования по всем ядрам.