Я хотел бы изменить привязку 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
Я не думаю, что перемещение прерываний на разные процессоры - особенно для обработки сетевых событий - повысит производительность.
Произойдет обратное, поскольку сетевой код больше не может храниться в конкретном процессоре.
Я бы сказал, что до тех пор, пока вы не сталкиваетесь с отброшенными пакетами на вашем сетевом интерфейсе, это вполне нормальное поведение для сети, обслуживающей множество пакетов.
Вам нужно уменьшить количество прерываний - их перемещение не поможет (наоборот, как я пытался обрисовать).
Я вижу два возможных решения:
Обновить 2012-12-17: Поскольку вы просили авторитетные ссылки - я попытался задать общий вопрос Когда не использовать виртуализацию - Думаю, это один из тех случаев, когда вы выходите за общие ограничения ВМ. Один из ответов на вопрос содержит другой подход: использовать контейнеры вместо виртуализации.
Надеюсь, это поможет...
Но я хотел бы получить авторитетный ответ о том, почему конфигурация сродства не работает. Меня беспокоит, что все, кажется, предполагают, что это возможно, но я не могу этого сделать.
Просто по этому конкретному вопросу - и я понятия не имею, влияет ли Xen на этот ответ - вы получаете Input/output error
сообщение, если ни один драйвер устройства в настоящее время не имеет установленного обработчика для этого прерывания.
Если драйвер устанавливает обработчик, например, на '105', тогда каталог /proc/irq/105
создается и содержит smp_affinity
, среди прочего. Теперь вы можете написать smp_affinity
. Если закрыть устройство, каталог останется с smp_affinity
, но писать на него больше нельзя. Откройте устройство (через open
, или что-то еще request_irq
в драйвере), и теперь вы можете писать в файл. Проверено только на RHEL / SL 6.
Если вы не знаете, открыто ли устройство в данный момент, проверьте каталог. Он будет содержать имя устройства, если оно открыто.