Как активировать все ksoftirqds в Linux? (о сетевом стеке ядра Linux)

У меня многоядерная карта NIC на 4-ядерном компьютере Intel, и я связываю каждую очередь карты NIC на ядре процессора (set /proc/irq/xxx/smp_affinity) Скажем, queue0 на core0, queue1 на core1 и так далее.

Говорят, что softirq будет задействовать то же ядро, что и аппаратное прерывание. Почему ksoftirqd не может работать parellelly на моей машине? Это всего лишь один поток ядра (например, ksoftirqd/2), который будет использовать 100% ядра, а другие - 0%.

когда я использую

cat /proc/interrupts | grep eth1

Я вижу, что все пакеты даже распределены по всем очередям NIC.

Обновить:

Вот решение для 100% -ной проблемы, если вы можете читать по-китайски http://hi.baidu.com/higkoo/item/42ba6c353bc8aed76d15e9c3 (см. № 7), если нет, то в каком блоге написано, что вы можете добавить еще одну карту, эта проблема будет решена

2 ответа

ksoftirqd не нужно запускать параллельно, потому что он обычно не запускает softirqs. Все softirq обычно запускаются на процессоре, где они были запрошены сразу после прерывания, которое их запрашивало.

softirqs будет запускаться на ksoftirqd только в случае потока "softirq" - после того, как ядро ​​выполнит прерывание, оно проверяет, нужно ли ему запускать anu softirqs. Если это произойдет, он запустит их. В то время, когда эти прерывания запуска разрешены, возможно, что когда вы выполняли программные команды, возникает прерывание, которое помечает их для повторного запуска. Вот почему ядро ​​будет снова проверять наличие рыночных программ после их запуска.

Должно быть очевидно, что при наличии потока прерываний это может очень быстро превратиться в оперативную блокировку - все, что мы делаем, это запускаем softirq и прерывания, а не какой-либо пользовательский код. Вот почему ядро ​​имеет "демпфирующий" механизм - если после 10 раз проверки, отмечены ли какие-либо softirq после их запуска, они все еще отмечены, ядро ​​не будет запускать softirqs в конце прерывания и вместо этого пробудит специальный поток ядра ksoftirqd, чтобы запустить их, пока не закончится потоп.

Это сторожевой механизм для обработки IRQ-потоков, и в большинстве случаев он не используется, поэтому многопоточность ksoftirqd не поможет вам в обычном случае.

ksoftirqd является основой всех процедур опроса в ядре, включая опрос сетевых очередей вашей карты.

Таким образом, запуск ksoftirqd будет влиять на то, насколько хорошо он работает. Дело в том, что это не нить вообще. Это происходит потому, что таймер запуска ksoftirqd всегда доставляется одному и тому же ядру.

Но вы задаете этот вопрос с определенной целью. Возможно, имеет смысл сначала поговорить об этой цели, а не об этой детали реализации этой цели.

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