Правила форума Гаранты форума
Размещение рекламы AMX-X компилятор

Здравствуйте, гость Вход | Регистрация

Наши новости:

14-дек
24-апр
10-апр
11-апр

Linux interrupts SMP

, Прерывания от системного таймера грузят только CPU0
Статус пользователя L_O_T_U_S
сообщение 15.5.2012, 0:32
Сообщение #1


Стаж: 17 лет

Сообщений: 555
Благодарностей: 32
Полезность: 89

Debian 6.03 amd64
Код
           CPU0       CPU1       CPU2       CPU3       CPU4       CPU5       CPU6       CPU7
  0:        125          0          0          0          0          0          0          0   IO-APIC-edge      timer
  1:          2          0          0          0          0          0          0          0   IO-APIC-edge      i8042
  5:          0          0          0          0          0          0          0          0   IO-APIC-edge      parport0
  8:          1          0          0          0          0          0          0          0   IO-APIC-edge      rtc0
  9:          0          0          0          0          0          0          0          0   IO-APIC-fasteoi   acpi
12:          4          0          0          0          0          0          0          0   IO-APIC-edge      i8042
16:         28          0          0          0          0          0          0          0   IO-APIC-fasteoi   ehci_hcd:usb1
19:      14420          0          0          0          0          0          0          0   IO-APIC-fasteoi   ata_piix, ata_piix
23:         28          0          0          0          0          0          0          0   IO-APIC-fasteoi   ehci_hcd:usb2
28:      19247          0          0          0          0          0          0          0   PCI-MSI-edge      eth0-rx-0
29:       8791          0          0          0          0          0          0          0   PCI-MSI-edge      eth0-tx-0
30:          2          0          0          0          0          0          0          0   PCI-MSI-edge      eth0
NMI:          0          0          0          0          0          0          0          0   Non-maskable interrupts
LOC:     269079     260077     257467     249107     253817     258134     259216     254614   Local timer interrupts
SPU:          0          0          0          0          0          0          0          0   Spurious interrupts
PMI:          0          0          0          0          0          0          0          0   Performance monitoring interrupts
PND:          0          0          0          0          0          0          0          0   Performance pending work
RES:      10465      11382      10409      10274      10276      10324      11180      10606   Rescheduling interrupts
CAL:         26         20         25         28         27         27         22         28   Function call interrupts
TLB:        153        165        111        113         64         69         49         62   TLB shootdowns
TRM:          0          0          0          0          0          0          0          0   Thermal event interrupts
THR:          0          0          0          0          0          0          0          0   Threshold APIC interrupts
MCE:          0          0          0          0          0          0          0          0   Machine check exceptions
MCP:          4          4          4          4          4          4          4          4   Machine check polls
ERR:          7
MIS:          0

cat /proc/irq/0/smp_affinity
ff
cat /sys/devices/system/clocksource/clocksource0/current_clocksource
tsc
На других серверах прерывания от таймера (irq 0) обрабатываются всеми CPU и их кол-во ничтожно мало:

Код
cat /proc/interrupts
           CPU0       CPU1       CPU2       CPU3
  0:       6374       5798       6369       5844   IO-APIC-edge      timer
  9:          0          0          0          0   IO-APIC-fasteoi   acpi
14:          0          0          0          0   IO-APIC-edge      ata_piix
15:          0          0          0          0   IO-APIC-edge      ata_piix
16:          0          0          0          0   IO-APIC-fasteoi   uhci_hcd:usb5
18:          0          0          0          0   IO-APIC-fasteoi   uhci_hcd:usb4
19:     724106     677568     724901     676228   IO-APIC-fasteoi   ata_piix, uhci_hcd:usb3
23:         10          9         10         10   IO-APIC-fasteoi   ehci_hcd:usb1, uhci_hcd:usb2
79: 1056044290          2 1055924526          0   PCI-MSI-edge      eth1
80:          0 3371465553          1 3371183698   PCI-MSI-edge      eth0
NMI:          0          0          0          0   Non-maskable interrupts
LOC: 3358006264 2708537017 3306706609 2491989335   Local timer interrupts
SPU:          0          0          0          0   Spurious interrupts
CNT:          0          0          0          0   Performance counter interrupts
PND:          0          0          0          0   Performance pending work
RES:       2418       3978       4110       3360   Rescheduling interrupts
CAL:        132        112        131        123   Function call interrupts
TLB:     107845     358113     109483     360469   TLB shootdowns
ERR:          0
MIS:          0


Куда копать?

Отредактировал: L_O_T_U_S, - 15.5.2012, 0:42
Перейти в начало страницы         Просмотр профиля    Отправить личное сообщение
   Цитировать сообщение
Статус пользователя Grape Fruit
сообщение 15.5.2012, 21:05
Сообщение #2


Стаж: 16 лет

Сообщений: 505
Благодарностей: 286
Полезность: 802

Прерывания вообще-то идут не от системного таймера, а от контроллера прерываний. Таймер работает в режиме 0 и нужен лишь для формирования временных интервалов (к примеру, на нем построены системные часы). Далее от таймера через OUT0 (мб другой вывод) ---> IRQ0 идет сигнал на контроллер прерываний...т.е. идет обращение к подпрограмме обслуживания прерываний (проблема может быть в ней). После этого контроллер через INT связывается с процессором. Почему он идет только к CPU0: проблема может быть в архитектуре микропроцессорной системы (вряд ли), подпрограмме (ассемблер) или непосредственно в управляющем слове, которое грузится в контроллер для установки его режима работы.

Если кратко, то вот из-за чего может быть данная проблема с точки зрения МПС. Как ее решить - я затрудняюсь ответить... Может быть гуру подскажут.

Отредактировал: Grape Fruit, - 15.5.2012, 21:11
Перейти в начало страницы         Просмотр профиля    Отправить личное сообщение
Поблагодарили 1 раз
   + Цитировать сообщение
Статус пользователя 330863
сообщение 15.5.2012, 22:20
Сообщение #3


Стаж: 16 лет

Сообщений: 4358
Благодарностей: 1079
Полезность: 497

L_O_T_U_S,
прерывания можно перебросить по ядрам
Перейти в начало страницы         Просмотр профиля    Отправить личное сообщение
   + Цитировать сообщение
Статус пользователя Grape Fruit
сообщение 15.5.2012, 22:40
Сообщение #4


Стаж: 16 лет

Сообщений: 505
Благодарностей: 286
Полезность: 802

То что это проблема управления - понятно. А как организовать переброс? Есть какая-то настройка или нужна замена подпрограммы?

Отредактировал: Grape Fruit, - 15.5.2012, 22:41
Перейти в начало страницы         Просмотр профиля    Отправить личное сообщение
Поблагодарили 1 раз
   + Цитировать сообщение
Статус пользователя 330863
сообщение 16.5.2012, 5:56
Сообщение #5


Стаж: 16 лет

Сообщений: 4358
Благодарностей: 1079
Полезность: 497

смотрим командой
Код
# cat /proc/interrupts
           CPU0       CPU1       CPU2       CPU3       CPU4       CPU5       CPU6       CPU7
  0:      11450          0          0          0          0          0          0          0   IO-APIC-edge      timer

берём нужный идентификатор (первая цифра) к примеру 0 и делаем так
Код
echo XX > /proc/irq/0/smp_affinity


дополнительная инфа http://www.opennet.ru/openforum/vsluhforumID1/88874.html
Перейти в начало страницы         Просмотр профиля    Отправить личное сообщение
Поблагодарили 2 раз
   + Цитировать сообщение
Статус пользователя L_O_T_U_S
сообщение 19.5.2012, 23:14
Сообщение #6


Стаж: 17 лет

Сообщений: 555
Благодарностей: 32
Полезность: 89

echo 1 > /proc/irq/0/smp_affinity
-bash: echo: write error: Input/output error
Перейти в начало страницы         Просмотр профиля    Отправить личное сообщение
   + Цитировать сообщение
Статус пользователя c0rax
сообщение 20.5.2012, 0:18
Сообщение #7


Стаж: 18 лет

Сообщений: 1077
Благодарностей: 530
Полезность: 884

Цитата(L_O_T_U_S @ 20.5.2012, 0:14) *
echo 1 > /proc/irq/0/smp_affinity
-bash: echo: write error: Input/output error

Код
echo "1" > /proc/irq/0/smp_affinity

Эх.. пора бы уже /dev/brain включить, при таком uptime пользования Linux

Отредактировал: c0rax, - 20.5.2012, 0:19
Перейти в начало страницы         Просмотр профиля    Отправить личное сообщение
   + Цитировать сообщение
Статус пользователя L_O_T_U_S
сообщение 20.5.2012, 1:15
Сообщение #8


Стаж: 17 лет

Сообщений: 555
Благодарностей: 32
Полезность: 89

-bash: echo: write error: Input/output error
(
Перейти в начало страницы         Просмотр профиля    Отправить личное сообщение
   + Цитировать сообщение
Статус пользователя 330863
сообщение 6.6.2012, 15:25
Сообщение #9


Стаж: 16 лет

Сообщений: 4358
Благодарностей: 1079
Полезность: 497

Нашёл случайно скрипт который распределяет прерывания по ядрам, очень полезно для большого числа прерываний связанных с сетевыми платами)

Код
#!/bin/sh
#
#  irq2smp -- distribute hardware interrupts from Ethernet devices by CPU cores.
#
#  Should be called from /etc/rc.local.
#
ncpus=`grep -ciw ^processor /proc/cpuinfo`
test "$ncpus" -gt 1 || exit 1

n=0
for irq in `cat /proc/interrupts | grep eth | awk '{print $1}' | sed s/\://g`
do
    f="/proc/irq/$irq/smp_affinity"
    test -r "$f" || continue
    cpu=$[$ncpus - ($n % $ncpus) - 1]
    if [ $cpu -ge 0 ]
    then
        mask=`printf %x $[2 ** $cpu]`
        echo "Assign SMP affinity: eth$n, irq $irq, cpu $cpu, mask 0x$mask"
        echo "$mask" > "$f"
        let n+=1
    fi
done
Перейти в начало страницы         Просмотр профиля    Отправить личное сообщение
Поблагодарили 1 раз
   + Цитировать сообщение
  Тема закрытаНачать новую тему
 
0 пользователей и 1 гостей читают эту тему: