Как изменить привязку SMP IRQ к Ubuntu PV внутри Xen XCP?

Я хотел бы изменить привязку IRQ SMP по причинам, изложенным в этом вопросе: CPU0 завален прерываниями eth1

Но я не могу - я вижу Input/output error когда я пытаюсь написать /proc/irq/*/smp_affinity,

Пожалуйста, укажите мне HOWTO по этому вопросу. (Официальная ссылка на /proc/irq/*/ было бы круто.)

Гор детали:

Обратите внимание, что это виртуальная машина (PV domU) внутри хоста Xen XCP на основе Ubuntu.

$ uname -a
Linux MYHOST 2.6.38-15-virtual # 59-Ubuntu SMP пт 27 апреля 16:40:18 UTC 2012 i686 i686 i386 GNU / Linux

$ lsb_release -a
Модули LSB не доступны.
Идентификатор распространителя: Ubuntu
Описание:    Ubuntu 11.04
Релиз:    11.04
Кодовое название: natty

$ sudo cat / proc / irq / * / smp_affinity
01
01
01
01
01
80
80
80
80
80
80
40
40
40
40
40
40
20
20
20
20
20
20
10
10
10
10
10
10
08
08
08
08
08
08
04
04
04
04
04
04
02
02
02
02
02
02
01
01
01
01
01
01

Обновить. Детали ошибки:

$ N = $ (процессор grep -c / proc / cpuinfo)
$ echo $ N
8

$ printf% x $ ((2 ** N-1))
Ф.Ф.

$ printf %x $((2**N-1)) | sudo tee /proc/irq/*/smp_affinity
fftee: /proc/irq/288/smp_affinity: ошибка ввода / вывода
tee: /proc/irq/289/smp_affinity: ошибка ввода / вывода
tee: /proc/irq/290/smp_affinity: ошибка ввода / вывода
tee: /proc/irq/291/smp_affinity: ошибка ввода / вывода
tee: /proc/irq/292/smp_affinity: ошибка ввода / вывода
tee: /proc/irq/293/smp_affinity: ошибка ввода / вывода
tee: /proc/irq/294/smp_affinity: ошибка ввода / вывода
tee: /proc/irq/295/smp_affinity: ошибка ввода / вывода
tee: /proc/irq/296/smp_affinity: ошибка ввода / вывода
tee: /proc/irq/297/smp_affinity: ошибка ввода / вывода
tee: /proc/irq/298/smp_affinity: ошибка ввода / вывода
tee: /proc/irq/299/smp_affinity: ошибка ввода / вывода
tee: / proc / irq / 300 / smp_affinity: ошибка ввода / вывода
tee: / proc / irq / 301 / smp_affinity: ошибка ввода / вывода
tee: / proc / irq / 302 / smp_affinity: ошибка ввода / вывода
tee: / proc / irq / 303 / smp_affinity: ошибка ввода / вывода
tee: /proc/irq/304/smp_affinity: ошибка ввода / вывода
tee: /proc/irq/305/smp_affinity: ошибка ввода / вывода
tee: /proc/irq/306/smp_affinity: ошибка ввода / вывода
tee: /proc/irq/307/smp_affinity: ошибка ввода / вывода
tee: /proc/irq/308/smp_affinity: ошибка ввода / вывода
tee: /proc/irq/309/smp_affinity: ошибка ввода / вывода
tee: / proc / irq / 310 / smp_affinity: ошибка ввода / вывода
tee: / proc / irq / 311 / smp_affinity: ошибка ввода / вывода
tee: / proc / irq / 312 / smp_affinity: ошибка ввода / вывода
tee: / proc / irq / 313 / smp_affinity: ошибка ввода / вывода
tee: /proc/irq/314/smp_affinity: ошибка ввода / вывода
tee: /proc/irq/315/smp_affinity: ошибка ввода / вывода
tee: /proc/irq/316/smp_affinity: ошибка ввода / вывода
tee: /proc/irq/317/smp_affinity: ошибка ввода / вывода
tee: /proc/irq/318/smp_affinity: ошибка ввода / вывода
tee: /proc/irq/319/smp_affinity: ошибка ввода / вывода
tee: / proc / irq / 320 / smp_affinity: ошибка ввода / вывода
tee: / proc / irq / 321 / smp_affinity: ошибка ввода / вывода
tee: / proc / irq / 322 / smp_affinity: ошибка ввода / вывода
tee: / proc / irq / 323 / smp_affinity: ошибка ввода / вывода
tee: /proc/irq/324/smp_affinity: ошибка ввода / вывода
tee: /proc/irq/325/smp_affinity: ошибка ввода / вывода
tee: /proc/irq/326/smp_affinity: ошибка ввода / вывода
tee: /proc/irq/327/smp_affinity: ошибка ввода / вывода
tee: /proc/irq/328/smp_affinity: ошибка ввода / вывода
tee: /proc/irq/329/smp_affinity: ошибка ввода / вывода
tee: / proc / irq / 330 / smp_affinity: ошибка ввода / вывода
tee: / proc / irq / 331 / smp_affinity: ошибка ввода / вывода
tee: / proc / irq / 332 / smp_affinity: ошибка ввода / вывода
tee: / proc / irq / 333 / smp_affinity: ошибка ввода / вывода
tee: /proc/irq/334/smp_affinity: ошибка ввода / вывода
tee: /proc/irq/335/smp_affinity: ошибка ввода / вывода

Обновить. irqbalance бежит:

$ sudo service irqbalance status
несбалансированный запуск / запуск, процесс 560

3 ответа

Решение

Я не думаю, что перемещение прерываний на разные процессоры - особенно для обработки сетевых событий - увеличит производительность.

Произойдет обратное, поскольку сетевой код больше не может храниться в определенном процессоре.

Поэтому, пока вы не испытываете пропущенные пакеты на сетевом интерфейсе, я бы сказал - это вполне нормальное поведение для сети, которая обслуживает много пакетов.

Вам нужно уменьшить количество прерываний - их перемещение не поможет (наоборот, как я пытался обрисовать).

Я вижу два возможных решения:

  • Увеличьте размер MTU, чтобы уменьшить количество прерываний
  • Подключите vCPU 0 DomU к выделенному ЦП на Dom0 (который не используется ни одной другой виртуальной машиной или Dom0).

Update 2012-12-17: Since you asked for authoritative links - I tried to ask a general question When not to use virtualisation - I think this is one of the cases, where you are hitting general VM limits. One of the answers to the question contains a different approach: Use containers, instead of virtualization.

Надеюсь, это поможет...

Существует файл с именем Documentation/IRQ-affinity.txt в исходном коде Linux.

/proc/irq/IRQ#/smp_affinity specifies which target CPUs are permitted
for a given IRQ source. It's a bitmask of allowed CPUs. It's not allowed
to turn off all CPUs, and if an IRQ controller does not support IRQ
affinity then the value will not change from the default 0xffffffff.

Подвох в том, что битовая маска находится в шестнадцатеричном формате. Итак, если у вас N процессоров,

N=$(grep -c processor /proc/cpuinfo)

включить все IRQ для всех процессоров, где у вас есть N процессоров, которые вы можете

printf %x $((2**N-1)) | sudo tee /proc/irq/*/smp_affinity

Ядро 3.0 и позже имеет файл с именем smp_affinity_list, Этот файл занимает разделенный запятыми список процессоров или диапазонов процессоров. Допустимые примеры: 0, 2,3,5-7, 0-7, Предыдущая команда эквивалентна:

echo 0-$((N-1)) | sudo tee /proc/irq/*/smp_affinity_list

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

Только на этот конкретный вопрос - и я понятия не имею, влияет ли Ксен на этот ответ - вы получаете Input/output error сообщение, когда в драйвере устройства в данный момент не установлен обработчик для этого прерывания.

Если драйвер устанавливает обработчик на "105", например, то каталог /proc/irq/105 создан и содержит smp_affinityкроме всего прочего. Теперь вы можете написать smp_affinity, Если вы закроете устройство, каталог останется с smp_affinity, но вы больше не можете писать в него. Откройте устройство (через openили как там в конечном итоге называет request_irq в драйвере) и теперь можно писать в файл. Проверено только на RHEL/SL 6.

Если вы не знаете, открыто ли устройство в данный момент, проверьте каталог. Он будет содержать имя устройства, если оно открыто.

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