Jump to content
Калькуляторы

Прерывания в Linux

Железо:

Product Name: PowerEdge R210

CPU:

model name: Intel® Xeon® CPU X3430 @ 2.40GHz

 

cpu0: [Package #0, Core #0]

same package as 0-3

L1 Data: 32K 8-way with 64 byte lines

L1 Instruction: 32K 4-way with 64 byte lines

L2 Unified: 256K 8-way with 64 byte lines

L3 Unified: 8192K 16-way with 64 byte lines

[shared with 0-3]

 

cpu1: [Package #0, Core #1]

same package as 0-3

L1 Data: 32K 8-way with 64 byte lines

L1 Instruction: 32K 4-way with 64 byte lines

L2 Unified: 256K 8-way with 64 byte lines

L3 Unified: 8192K 16-way with 64 byte lines

[shared with 0-3]

 

cpu2: [Package #0, Core #2]

same package as 0-3

L1 Data: 32K 8-way with 64 byte lines

L1 Instruction: 32K 4-way with 64 byte lines

L2 Unified: 256K 8-way with 64 byte lines

L3 Unified: 8192K 16-way with 64 byte lines

[shared with 0-3]

 

cpu3: [Package #0, Core #3]

same package as 0-3

L1 Data: 32K 8-way with 64 byte lines

L1 Instruction: 32K 4-way with 64 byte lines

L2 Unified: 256K 8-way with 64 byte lines

L3 Unified: 8192K 16-way with 64 byte lines

[shared with 0-3]

 

 

Установленный Debian Squeeze 6.0.6, с нативным ядром.

uname -a

Linux 2.6.32-5-amd64 #1 SMP Sun Sep 23 10:07:46 UTC 2012 x86_64 GNU/Linux

Смотрю прерывания:

cat /proc/interrupts

CPU0 CPU1 CPU2 CPU3

0: 3260 0 0 0 IO-APIC-edge timer

8: 1 0 0 0 IO-APIC-edge rtc0

9: 0 0 0 0 IO-APIC-fasteoi acpi

20: 22217465 0 0 0 IO-APIC-fasteoi ata_piix

21: 0 0 0 0 IO-APIC-fasteoi ata_piix

22: 93 0 0 0 IO-APIC-fasteoi ehci_hcd:usb1, ehci_hcd:usb2

 

Попытка прибить прерывание вручную к 2 или 4 ядрам, ни к чему не приводит, начинает обрабатываться 0 ядром,

прибить прерывание к 1 из 4 ядер работает.

 

irqbalance в рассмотрение не беру.

 

Почему прерывания сидят на первом ядре, и не расползаются по остальным?

Установка ядра старших версий ни к чему не приводит, может какие то опции нужно включить?

Понятно что эта тема уже не однократно поднималась, но все же может кто знает решение?

Edited by nsa2006

Share this post


Link to post
Share on other sites

Почему прерывания сидят на первом ядре, и не расползаются по остальным?

А накой им расползаться? Все равно, пока обработка прерывания не окончится, новое прерывание того же вектора не обработается ни на одном из ядер. А скачки одного и того же прерывания по ядрам будут сопровождаться cache miss'ами.

Share this post


Link to post
Share on other sites

Читал здесь!

https://cs.uwaterloo.ca/~brecht/servers/apic/SMP-affinity.txt

Тот же timer и aic7xxx распределяются на 4 ядра, судя по ссылке.

В моем случае timer м ata_piix сидят на 0

Share this post


Link to post
Share on other sites

Таймер, в зависимости от реализации в железе может быть как общим для всех ядрер так и для каждого ядра свой.

Share this post


Link to post
Share on other sites

Тот же timer и aic7xxx распределяются на 4 ядра, судя по ссылке.

Повторюсь: не распределяются, а скачут. Что приводит к падению производительности при их обработке, особенно - если большое кол-во прерываний (cache miss, ожидание подгрузки кода из медленной памяти...). Ибо пока обработка прерывания не окончится, по новой оно обрабатываться не будет ни тем же ядром, ни другими ядрами. Учите матчасть, ну или хотя бы внимательно читайте, что вам пишут.

Share this post


Link to post
Share on other sites

Повторюсь: не распределяются, а скачут.

Ладно пусть скачут, но как это реализовать на практике, под словом распределяется не хотел сказать что одновременно используются 4 ядра.

Хотел понять почему так, и как лучше что бы более симметрично происходила загрузка ядер а не иначе.

Из других источников находил вот к примеру:

http://centos.alt.ru/?p=26

 

http://www.gentoo.ru/content/stradaniya-po-irq

Share this post


Link to post
Share on other sites

Повторюсь: не распределяются, а скачут.

Ладно пусть скачут, но как это реализовать на практике, под словом распределяется не хотел сказать что одновременно используются 4 ядра.

Хотел понять почему так, и как лучше что бы более симметрично происходила загрузка ядер а не иначе.

Из других источников находил вот к примеру:

http://centos.alt.ru/?p=26

 

http://www.gentoo.ru/content/stradaniya-po-irq

 

1. Оставить как есть , включить RPS.

2. Если позволяет драйвер сетевой создать несколько очередей .

Share this post


Link to post
Share on other sites

1. Оставить как есть , включить RPS.

2. Если позволяет драйвер сетевой создать несколько очередей .

Я это не имел ввиду, с этими прерываниями и очередями разобрался. Интересовало другое, прерывание от того же ata_piix или ahci работающее на 0 ядре, и не скачущее по ядрам, дает перекос.

Share this post


Link to post
Share on other sites

1. Оставить как есть , включить RPS.

2. Если позволяет драйвер сетевой создать несколько очередей .

Я это не имел ввиду, с этими прерываниями и очередями разобрался. Интересовало другое, прерывание от того же ata_piix или ahci работающее на 0 ядре, и не скачущее по ядрам, дает перекос.

 

А как выглядит у вас

alex001 src # dmesg |grep -i APIC
[    0.000000] ACPI: APIC 00000000bfd63f18 0006C (v02  INTEL   DG43NB 06222004 MSFT 00010013)
[    0.000000] ACPI: Local APIC address 0xfee00000
[    0.000000] ACPI: Local APIC address 0xfee00000
[    0.000000] ACPI: LAPIC (acpi_id[0x01] lapic_id[0x00] enabled)
[    0.000000] ACPI: LAPIC (acpi_id[0x02] lapic_id[0x01] enabled)
[    0.000000] ACPI: LAPIC (acpi_id[0x03] lapic_id[0x02] enabled)
[    0.000000] ACPI: LAPIC (acpi_id[0x04] lapic_id[0x03] enabled)
[    0.000000] ACPI: IOAPIC (id[0x00] address[0xfec00000] gsi_base[0])
[    0.000000] IOAPIC[0]: apic_id 0, version 32, address 0xfec00000, GSI 0-23
[    0.006387] ..TIMER: vector=0x30 apic1=0 pin1=2 apic2=-1 pin2=-1
[    0.272793] ACPI: Using IOAPIC for interrupt routing

 

(это для системы где прерывания распределяются нормально).

Share this post


Link to post
Share on other sites

но как это реализовать на практике

Не пойму, зачем? Вам что, хочется искусственно затормозить слишком резвую систему? :) Или, может, не нравится, что ядра уходят "в спячку", снизжая частоту и потребление, и вы таким странным образом собираетесь их все загрузить? Или просто "синдром начальника" - неймется, когда кто-то без дела слоняется, охота всех занять даже в ущерб эффективности?

Share this post


Link to post
Share on other sites

Подскажите пожалуйста, как лучше настроить прерывания? Емеется сетевая карта intel 82574, с двумя очередями. Основная нагрузка - исходящий мультикаст трафик(как я понял, RPS для исходящего не нужен). Лучше каждую очередь повесить на своё ядро, или распределить равномерно по всем ядрам? (4-x ядерный intel core i5 2500).

И нормальная ли это нагрузка в powertop?

50,7% (11032,2)       <interrupt> : eth0-tx-0

Share this post


Link to post
Share on other sites

А как выглядит у вас

alex001 src # dmesg |grep -i APIC

[    0.000000] ACPI: APIC 00000000bfd63f18 0006C (v02  INTEL   DG43NB 06222004 MSFT 00010013)

[    0.000000] ACPI: Local APIC address 0xfee00000

[    0.000000] ACPI: Local APIC address 0xfee00000

[    0.000000] ACPI: LAPIC (acpi_id[0x01] lapic_id[0x00] enabled)

[    0.000000] ACPI: LAPIC (acpi_id[0x02] lapic_id[0x01] enabled)

[    0.000000] ACPI: LAPIC (acpi_id[0x03] lapic_id[0x02] enabled)

[    0.000000] ACPI: LAPIC (acpi_id[0x04] lapic_id[0x03] enabled)

[    0.000000] ACPI: IOAPIC (id[0x00] address[0xfec00000] gsi_base[0])

[    0.000000] IOAPIC[0]: apic_id 0, version 32, address 0xfec00000, GSI 0-23

[    0.006387] ..TIMER: vector=0x30 apic1=0 pin1=2 apic2=-1 pin2=-1

[    0.272793] ACPI: Using IOAPIC for interrupt routing

 

 

(это для системы где прерывания распределяются нормально).

 

У меня

 

 

dmesg |grep -i APIC

[ 0.000000] ACPI: APIC 00000000cd12c758 00072 (v03 ALASKA A M I 01072009 AMI 00010013)

[ 0.000000] ACPI: Local APIC address 0xfee00000

[ 0.000000] ACPI: Local APIC address 0xfee00000

[ 0.000000] ACPI: LAPIC (acpi_id[0x01] lapic_id[0x00] enabled)

[ 0.000000] ACPI: LAPIC (acpi_id[0x02] lapic_id[0x02] enabled)

[ 0.000000] ACPI: LAPIC (acpi_id[0x03] lapic_id[0x04] enabled)

[ 0.000000] ACPI: LAPIC (acpi_id[0x04] lapic_id[0x06] enabled)

[ 0.000000] ACPI: LAPIC_NMI (acpi_id[0xff] high edge lint[0x1])

[ 0.000000] ACPI: IOAPIC (id[0x02] address[0xfec00000] gsi_base[0])

[ 0.000000] IOAPIC[0]: apic_id 2, version 32, address 0xfec00000, GSI 0-23

[ 0.014452] Setting APIC routing to flat

[ 0.014775] ..TIMER: vector=0x30 apic1=0 pin1=2 apic2=-1 pin2=-1

[ 0.506800] ACPI: Using IOAPIC for interrupt routing

Share this post


Link to post
Share on other sites

Странно, что никто не сказал.

Я всегда считал, что прибивать IDE/SATA/SAS прерывания бесполезно, смысла мало. Вы профайлер гоняли? Есть ли там существенное количество cache misses?

Взгляните в т.ч. на:

http://www.mjmwired.net/kernel/Documentation/block/queue-sysfs.txt

ключевое слово: rq_affinity

Share this post


Link to post
Share on other sites

Join the conversation

You can post now and register later. If you have an account, sign in now to post with your account.

Guest
Reply to this topic...

×   Pasted as rich text.   Paste as plain text instead

  Only 75 emoji are allowed.

×   Your link has been automatically embedded.   Display as a link instead

×   Your previous content has been restored.   Clear editor

×   You cannot paste images directly. Upload or insert images from URL.