[Date Prev][Date Next] [Thread Prev][Thread Next] [Date Index] [Thread Index]

Re: Раздача IRQ



В сообщении от 22 Март 2007 14:24 Покотиленко Костик написал(a):
> Привет всем.
> 
> Есть роутер под приличной нагрузкой. Основная нагрузка лежит на 2
> сетевухи: eth0 и eth1
> 
> # cat /proc/interrupts
>            CPU0
>   0:   39276550          XT-PIC  timer
>   1:         44          XT-PIC  i8042
>   2:          0          XT-PIC  cascade
>   5:   62000376          XT-PIC  VIA686A, eth1
>   6:          2          XT-PIC  floppy
>   7:          0          XT-PIC  parport0
>   8:          1          XT-PIC  rtc
>  10:          0          XT-PIC  uhci_hcd:usb1, uhci_hcd:usb2, eth2
>  11:   82591804          XT-PIC  acpi, eth0, eth3
>  12:      14786          XT-PIC  i8042
>  14:     333266          XT-PIC  ide0
> NMI:          0
> LOC:          0
> ERR:          0
> MIS:          0
> 
> Как видно eth0 и eth1 сидят на своих IRQ вместе с другими устройствами.
> Возможно ли как-то монопольно посадить eth0 на одно IRQ, а eth1 на
> другое, всё остальное можно в кучу?
> 
> Кто вообще рассаживает устройства по IRQ?

Есть IRQ, которые отведены под legacy устройства, а есть IRQ, которые отведены
под остальные устройства.

Legacy устройства не могут разделять одно IRQ, так как они генерируют прерывание
по фронту (Edge interrupt). К ним относятся прерывания таймера, последовательных
и параллельных портов, флоппи, клавиатуры, RTC. Поэтому прерывания 0, 1, 2, 3, 4,
6, 7, 8, 12 забиты под эти устройства и никем не могут больше использоваться.
Теоретически некоторые номера прерываний можно поменять, но делает это как правило
BIOS, так как этот процесс весьма зависит от LPC контроллера, припаянного на мать.

К сожалению не помню точно, что касается IDE, а искать сейчас лень, но по-моему их
тоже нельзя шарить, то есть отпадают ещё 14ое и 15ое (у тебя видимо на IDE1 никого
нет, но его все равно не поюзаешь).

Контроллер прерывания у тебя PIC i8259A; на нем всего может быть 16 IRQ с номерами
от 0 до 15. Таким образом остаются незадействованными прерывания 5, 9, 10, 11 и 13.

Далее, есть шина PCI. Каждое устройство на шине PCI может иметь до четырех IRQ, для
этого на шине есть четыре отдельных линии (A,B,C,D). Но при этом, если устройство
использует меньше четырех, то оно всегда (!!!) должно использовать первые линии. Так
как большинство устройств используют только одну линию, то основная нагрузка ложиться
на первую линию. Чтобы этого не происходило делают так: у тебя есть N PCI-слотов
на мамке. У первого слота линии IRQ запаяны на A,B,C,D, у второго - на D,A,B,C, у
третьего - на C,D,A,B и т.д. Таким образом если ты вставишь две карточки в 1ый и
2ой слот, то у тебя будут использоваться разные линии IRQ, а именно A и D.

Но нужно помнить, что есть ещё "виртуальные" PCI устройства, которые напаяны на 
мать и как они садятся на линии IRQ - не известно, но куда-нибудь, да попадут.
Такие устройства - это USB, иногда встроенная видях, контроллер firewire, звуковуха
и т.д. Их привязка к IRQ зависит от чипсета.

Каждая PCI-линия IRQ отображается на определенное прерывание контроллера. Например, у тебя
PCI A - IRQ 5, PCI B - IRQ 10, PCI C - IRQ 11, а вот PCI D - невозъюзана, то ли оно на 13,
то ли на 9.

Плюс есть ещё прерывание ACPI, оно может шариться с PCI-прерываниями и у тебя оно
на IRQ 11. Но оно не дает большой нагрузки, так как срабатывает редко.

Надо заметить, что если PCI-слотов больше четырех (обычно пять), то некоторые из
них садятся на одну IRQ-линию. То есть у первого и пятого слота одно IRQ. Видимо у тебя
там сидят eth0 и eth3 соответственно.

Короче, тебе надо опытным путем определить на какую PCI-линию садятся слоты, и вставить
свои наиболее нагруженные сетевухи в те слоты:
1) с которыми меньше всего шарятся другие устройства
2) которые не шарятся между собой.

Я не знаю, что такое VIA686A, но если оно не дает почти никакой нагрузки, то eth1 я бы
там и оставил, а вот eth0 переткнул бы в другой слот, который будет использовать либо
IRQ 9, либо IRQ 13.

--
  Макс





Reply to: