Назад | Перейти на главную страницу

Как изменить SMP-сродство IRQ на Ubuntu PV domU внутри 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 Fri Apr 27 16:40:18 UTC 2012 i686 i686 i386 GNU/Linux

$ lsb_release -a
No LSB modules are available.
Distributor ID: Ubuntu
Description:    Ubuntu 11.04
Release:    11.04
Codename:   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 processor /proc/cpuinfo)
$ echo $N
8

$ printf %x $((2**N-1))
ff

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

Обновить. irqbalance это работает:

$ sudo service irqbalance status
irqbalance start/running, process 560

Есть файл с названием 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

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

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

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

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

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

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

Обновить 2012-12-17: Поскольку вы просили авторитетные ссылки - я попытался задать общий вопрос Когда не использовать виртуализацию - Думаю, это один из тех случаев, когда вы выходите за общие ограничения ВМ. Один из ответов на вопрос содержит другой подход: использовать контейнеры вместо виртуализации.

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

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

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

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

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