Работает ли сетевой стек Linux параллельно на многоядерном компьютере? - PullRequest
2 голосов
/ 25 мая 2011

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

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

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

1 Ответ

0 голосов
/ 16 сентября 2015

Да, все 4 потока будут выполнять сетевой IO (большая блокировка ядра закончилась с 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, чтобы увидеть, распределяются ли сетевые аппаратные прерывания по всем ядрам.

...