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

У меня есть сетевая карта с несколькими очередями на 4-ядерной машине Intel, и я привязываю каждую очередь сетевой карты к ядру процессора (установить /proc/irq/xxx/smp_affinity). Скажем, очередь0 на ядре0, очередь1 на ядре1 и так далее.

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

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

cat /proc/interrupts | grep eth1

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

Обновить:

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


person dilfish    schedule 05.12.2012    source источник


Ответы (2)


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

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

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

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

person gby    schedule 06.12.2012
comment
Благодарю за разъяснение. Есть ли решение именно для случая «потопа»? - person dilfish; 07.12.2012
comment
@dilfish да, изменение кода ядра. Вот почему это с открытым исходным кодом :-) - person gby; 09.01.2013

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

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

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

person Klaas van Gend    schedule 06.12.2012
comment
Хорошо, мой вопрос: почему у него 100% в ядре и 0% в других 3 ядрах, я хочу, чтобы все 100% были даже распределены по 4 ядрам, каждое по 25%. - person dilfish; 07.12.2012