Автор Тема: Interrupts  (Прочетена 1926 пъти)

rers32e

  • Напреднали
  • *****
  • Публикации: 12
    • Профил
Interrupts
« -: Aug 12, 2006, 13:33 »
Здравейте ,
Имам продакшън рутер шейпещ към 300-400Мбита трафик и вечерно време забелязвам следния проблем:
cat /proc/interrupts
           CPU0       CPU1       CPU2       CPU3
  0:    8819518    8711776    8817554    8757001    IO-APIC-edge  timer
  1:        149        154        140        121    IO-APIC-edge  i8042
  8:          1          0          0          0    IO-APIC-edge  rtc
  9:          0          0          0          0   IO-APIC-level  acpi
 14:          3          3          4          3    IO-APIC-edge  ide0
 17:      81386      80959      82569      81670   IO-APIC-level  3w-xxxx
 18: 1242117631 1236081794 1227890464 1249202608   IO-APIC-level  eth0
 19: 1012144064 1015984715 1017899450 1006577983   IO-APIC-level  eth1
 20:  734133270  736519563  742605480  732676275   IO-APIC-level  eth2
NMI:          0          0          0          0
LOC:   34787462   34787461   35108105   35108104
ERR:          0
MIS:          0

А именно - броя на прекъсвания започва да се начислява в/у LOC: ,а не върху IRQ18,19,20, което от своя страна води до използване само на единия процесор, което за мен е неоптимален вариант. Позвам ядро 2.6.17.7 с подръжка на SMP , е1000-7.2.7-NAPI с InterruptThrottleRate=40000 - прави впечатление , че въпреки него интерфейсите генерират към 50000-70000 прекъсвания. Минава ми през ума да прехвърля примерно единия интерфейс да използва CPU2 , докато другите 2 - CPU0 -  това дали би имало някакъв ефек ?
Какво всъщност ознавава LOC: в /proc/interrupts? Има ли някаква формула по която се изчислява максимума прекъсвания които могат да бъдат обработени от даден процесор?
Мерси предварително
Активен

VladSun

  • Напреднали
  • *****
  • Публикации: 2166
    • Профил
Interrupts
« Отговор #1 -: Aug 14, 2006, 01:28 »
По какво съдиш, че почва да се начислява само на ЛОК? Според мен няма начин да стане това. Пробва ли все пак да разхвърляш ЛАН-ките по различни процесори - файда има ли?

//офф
Другото интересно нещо ми е малките стойности за иде0 - изобщо имаш ли ИДЕ хард?
При мен нормална ситуация е:
Примерен код

cat /proc/interrupts
           CPU0       CPU1
  0:   94842014          0    IO-APIC-edge  timer
  7:          0          0    IO-APIC-edge  parport0
  9:          0          0   IO-APIC-level  acpi
 14:     659715          0    IO-APIC-edge  ide0
 16: 2951429549          0   IO-APIC-level  eth0
 17:       1903 2993704371   IO-APIC-level  eth1
NMI:          0          0
LOC:   94839359   94839358
ERR:          0
MIS:          0




Активен

KISS Principle ( Keep-It-Short-and-Simple )
http://openfmi.net/projects/flattc/
Има 10 вида хора на този свят - разбиращи двоичния код и тези, които не го разбират :P

teleport

  • Напреднали
  • *****
  • Публикации: 134
    • Профил
Interrupts
« Отговор #2 -: Aug 14, 2006, 08:55 »
Примерен код
# uptime; uname -a; cat /proc/interrupts
 08:23:58  up 68 days, 18:22,  1 user,  load average: 0.00, 0.00, 0.00
Linux localhost 2.4.21-37.0.1.ELsmp #1 SMP Thu Jan 19 14:12:32 EST 2006 i686 i686 i386 GNU/Linux
           CPU0       CPU1
  0:  297067754  297065631    IO-APIC-edge  timer
  1:          2          0    IO-APIC-edge  keyboard
  2:          0          0          XT-PIC  cascade
  8:          1          0    IO-APIC-edge  rtc
 14:    4539123    4565109    IO-APIC-edge  libata
 15:          0          0    IO-APIC-edge  libata
 17:         16 4203563684   IO-APIC-level  eth0
 18: 4293456416          0   IO-APIC-level  eth1
 22:          4          0   IO-APIC-level  eth2
NMI:          0          0
LOC:  594146143  594146141
ERR:          0
MIS:          0

# ifconfig eth0; ifconfig eth1
eth0      Link encap:Ethernet  HWaddr 00:0E:0C:6C:2D:FC
          UP BROADCAST RUNNING MULTICAST  MTU:1500  Metric:1
          RX packets:3102048767 errors:22199 dropped:44398 overruns:22199 frame:0
          TX packets:4294603844 errors:0 dropped:0 overruns:0 carrier:0
          collisions:0 txqueuelen:1000
          RX bytes:1956326203 (1865.6 Mb)  TX bytes:1636420539 (1560.6 Mb)
          Base address:0xd000 Memory:f9020000-f9040000

eth1      Link encap:Ethernet  HWaddr 00:0E:0C:6C:25:5E
          UP BROADCAST RUNNING MULTICAST  MTU:1500  Metric:1
          RX packets:1356452328 errors:6762 dropped:13520 overruns:6760 frame:1
          TX packets:3417082839 errors:0 dropped:0 overruns:0 carrier:0
          collisions:0 txqueuelen:1000
          RX bytes:141766993 (135.1 Mb)  TX bytes:387999112 (370.0 Mb)
          Base address:0xd100 Memory:f9040000-f9060000


Intel PRO/1000 MT, драйвер 6.3.9-NAPI. Вечер стига до 350Mbit в посока, като в рутинг таблицата има около 2000 реда. Натоварването на процесора е от htb шейпъра. Резултатите с 2.6 кернел са значително по-лоши. Възможния максимум с PRO/1000  MT/GT на 32 битови pci слотове е около 450Mbit в посока или около 80000 пакета/сек. Над тези стойности дроповете на RX се увеличават драстично.

Машина със същата цел, само че с 2 карти PRO/1000 на pci-express x1, 180000 реда в рутинг таблицата:

Примерен код
# uptime; uname -a; cat /proc/interrupts; ifconfig eth0; ifconfig eth1
 08:45:18  up 76 days, 19:53,  1 user,  load average: 0.00, 0.00, 0.00
Linux localhost 2.4.21-40.ELsmp #1 SMP Wed Mar 15 14:21:45 EST 2006 i686 i686 i386 GNU/Linux
           CPU0       CPU1
  0:  326664344  337133811    IO-APIC-edge  timer
  1:          2          0    IO-APIC-edge  keyboard
  2:          0          0          XT-PIC  cascade
  8:          1          0    IO-APIC-edge  rtc
 16: 3396082819          0   IO-APIC-level  eth0
 17:          3 3728210731   IO-APIC-level  eth1
 19:     342053      85640   IO-APIC-level  libata
NMI:          0          0
LOC:  663808328  663808326
ERR:          0
MIS:          0
eth0      Link encap:Ethernet  HWaddr 00:30:48:56:38:9A
          UP BROADCAST RUNNING MULTICAST  MTU:1500  Metric:1
          RX packets:679750298 errors:0 dropped:0 overruns:0 frame:0
          TX packets:478645042 errors:0 dropped:0 overruns:0 carrier:0
          collisions:0 txqueuelen:1000
          RX bytes:2952401267 (2815.6 Mb)  TX bytes:510105197 (486.4 Mb)
          Base address:0x4000 Memory:ed200000-ed220000

eth1      Link encap:Ethernet  HWaddr 00:30:48:56:38:9B
          UP BROADCAST RUNNING MULTICAST  MTU:1500  Metric:1
          RX packets:2601377632 errors:0 dropped:0 overruns:0 frame:0
          TX packets:2628241103 errors:0 dropped:0 overruns:0 carrier:0
          collisions:0 txqueuelen:1000
          RX bytes:1667154036 (1589.9 Mb)  TX bytes:3937128298 (3754.7 Mb)
          Base address:0x5000 Memory:ed300000-ed320000
Активен

  • Гост
Interrupts
« Отговор #3 -: Aug 14, 2006, 11:02 »
Значи има два варианта да се вдигне прекъсване - единият вариант е хардуерно (мрежова карта при получаване на пакет примерно) - х86 архитектурите си имат контролер на прекъсванията, който поема такива сигнали и ги предава към процесора(ите). Тези прекъсвания са ти от тип io-apic edge / io-apic level (разликата между двете е за електротехници '<img'> )

Другия вариант е софтуерно прекъсване - такива се дефинират на ниво кърнъл и много прост пример за това ти е всеки един syscall. Тези се изобразяват в полето LOC: (това е брояч за този тип прекъсвания, отново за всеки процесор)

Съдейки по твоите данни, прекъсванията се обработват равномерно по отделните процесори (има си IRQ load balancing btw).

Ако имаш натоварени мрежови интерфейси, тогава както си предположил има файда от това да се дедикейт-ва хардуерно прекъсване на конкретен процесор. Така много по-добре се възползваш от L1 кеша, освен което, при фрагментация на пакетите ще се налага за всеки получен фрагмент от целия пакет да се върти известна информация от единия към другия процесор.

Дедикейт-ването е лесно:
echo <CPU#> > /proc/irq/<IRQ#>/smp_affinity

Иначе нямам много ясна идея защо при по-големи натоварвания, броят на софтуерните прекъсвания скача толкова. Може би ако пейстнеш изхода на sar -a мога да ти кажа повече по въпроса. Имам предположение, че като се натовари мрежата се стига до някакъв момент, в който се лог-ва нещо свързано с трафика (нямам идея как стои въпроса при теб). Оттам вероятно идват тези syscalls.
Активен

VladSun

  • Напреднали
  • *****
  • Публикации: 2166
    • Профил
Interrupts
« Отговор #4 -: Aug 14, 2006, 11:50 »
Цитат (Guest @ Авг. 14 2006,11:02)
Дедикейт-ването е лесно:
echo <CPU#> > /proc/irq/<IRQ#>/smp_affinity

Малка поправка:

параметъра, който ти си дал - CPU#, не е номер на процесора, а битова маска за това кои процесори да се ползват (при това в hex код). Ако трябва да се ползва само един процесор, то:
CPU0 = 01
CPU1 = 02
CPU2 = 04
CPU3 = 08

Ако ще се ползват всички процесори - ff.
Ако ще се ползва прим. CPU0 и CPU3, то 01+08 = 09 (а не 0А както отбелязва gat3way по-долу '<img'> )

ПП: Задължително трябва да се махнат редовете от сорта на
Примерен код
append="noapic nolapic"
от lilo.conf

Това при мен ми създаде 30 мин. чудене що аджеба не става smp_affinity.



Активен

KISS Principle ( Keep-It-Short-and-Simple )
http://openfmi.net/projects/flattc/
Има 10 вида хора на този свят - разбиращи двоичния код и тези, които не го разбират :P

  • Гост
Interrupts
« Отговор #5 -: Aug 14, 2006, 12:27 »
Всъщност да, в грешка съм бил, прав си. Само малко си объркал бинарната математика де '<img'>

1001(bin - дигнати  1 и 4 бит) = 2^3+2^0=9(dec)=9(hex)

т.е echo 9 > blabla
Активен

VladSun

  • Напреднали
  • *****
  • Публикации: 2166
    • Профил
Interrupts
« Отговор #6 -: Aug 14, 2006, 14:00 »
/off
'<img'> E... нямах калкулатор с HEX '<img'>
Активен

KISS Principle ( Keep-It-Short-and-Simple )
http://openfmi.net/projects/flattc/
Има 10 вида хора на този свят - разбиращи двоичния код и тези, които не го разбират :P

vladou

  • Напреднали
  • *****
  • Публикации: 61
    • Профил
Interrupts
« Отговор #7 -: Aug 16, 2006, 18:37 »
Дай малко повече информация за това, какви са ти мрежовите карти, които са монтирани в машината. Параметрите на драйвера RxDescriptors, TxDescriptors.
Аз лично не мисля, че ще имаш някакъв реално добър резултат  ако използващ СМП_АФИНИТИ, поради простата причина, че имаш много добър IRQ load balance от чипсета. Използването на  Л1 кеша е немислимо, за разлика от Л2, но при XEON-ите е малко по-различно, защото е кохерентен.
Дай малко повече информация и за CPU load-a. Можеш да експериментираш и с пускане и спиране на Hyper Treading-a.
Активен

Professional server builder
ADSYS group team

  • Гост
Interrupts
« Отговор #8 -: Aug 16, 2006, 20:46 »
Хм, виждам че се занимаваш доста с интел-ски хардуер, може ли да задам няколко въпроса?

- Как така се прави хардуерен irq loadbalancing? Смисъл interrupt controler-a на дъното си има логика дето ги пръска по всеки процесор...наистина ми е интересно, не съм хардуерист..
- Каква е връзката с хайпертрединг-а, смисъл този irq schedulling взима под предвид  hyperthreading-a някак си карайки паралелно един процесор да обработва няколко прекъсвания (ако процесора не е многоядрен де, но това все пак е друг случай)

Иначе за rx/tx descriptors мога да се обзаложа че са 64, освен ако не са пипани...но как може това да е вързано с увеличен брой soft interrupts при натоварвания, хммм..

Не се заяждам, наистина ми е много интересно, хардуерните работи за жалост не ги разбирам достатъчно, а бих искал да ги разбирам '<img'>
Активен

vladou

  • Напреднали
  • *****
  • Публикации: 61
    • Профил
Interrupts
« Отговор #9 -: Aug 30, 2006, 15:13 »
Ами не е ли по-добре да го направим това на бира в Кривото всяка сряда. Малко ще ми е доста трудно да напиша всички аспекти на това.
А ако някои репи може и статия да поспретне по върпоса. Аз мога да помогна с тестов хардуер.
Активен

Professional server builder
ADSYS group team