В сообщении от 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.
--
Макс