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

Приоритеты прерываний в Linux

Есть две идентичные машины отличающиеся только по части HDD. Машины занимаются маршрутизацией, трафик небольшой порядка 600 Мбит в пике. На одной из машин заметил странную вещь, при выполнении по крону задачи /etc/cron.d/sysstat, а именно:

# generate a daily summary of process accounting at 23:53
53 23 * * * root /usr/lib/sa/sa2 -A

появляются дропы на интерфейсах, больше всего на eth1.

Прерывания прибиты так:

  0: 1125295995 1099841777 1097040001 1141488491    IO-APIC-edge  timer
 1:          1          0          0          2    IO-APIC-edge  i8042
 6:          2          0          1          0    IO-APIC-edge  floppy
 8:          0          0          1          2    IO-APIC-edge  rtc
 9:          0          0          0          0   IO-APIC-level  acpi
12:          0          1          2          1    IO-APIC-edge  i8042
14:       6066       6092   45713472    1264945    IO-APIC-edge  ide0
15:          7          7          7          5    IO-APIC-edge  ide1
50:          0          0          0          0   IO-APIC-level  uhci_hcd:usb6
74:         81          0          0          0       PCI-MSI-X  eth0
82: 2552560099          0          0          0       PCI-MSI-X  eth0-rx-0
90:         17 2348549222          0          0       PCI-MSI-X  eth0-rx-1
98:         17          0 2497617730          0       PCI-MSI-X  eth0-rx-2
106:         17          0          0 4083078233       PCI-MSI-X  eth0-tx-0
114:          3          0          0          0       PCI-MSI-X  eth1
122:         14          0 3989438735          0       PCI-MSI-X  eth1-rx-0
130:         14 4103082365          0          0       PCI-MSI-X  eth1-tx-0
177:          0          0          0          0   IO-APIC-level  ehci_hcd:usb1
217:          0          0          0          0   IO-APIC-level  ehci_hcd:usb2, uhci_hcd:usb5
225:          0          0          0          0   IO-APIC-level  uhci_hcd:usb3, uhci_hcd:usb7
233:          0          0          0          0   IO-APIC-level  uhci_hcd:usb4, ata_piix
NMI:          0          0          0          0 
LOC:  168084626  168067551  147237631  167789047 
ERR:          0
MIS:          0

 

В целом проблем с производительностью нет, машинка справляется. Но смущает эта странная фишка.

В связи с этим вопрос, есть ли возможность устанавливать приоритет для прерываний?

У меня подозрения как раз на HDD. Похоже проблема возникает когда пишутся даныне sysstat в /var/log/sa

Share this post


Link to post
Share on other sites

Нет, прерывания выполняются по таймеру, по очереди, поэтому понятия приоритета отсутствует. В вашем случае попробуйте вынести ide0 на кокретный процессор. Но в вашем примере мало данных чтобы утверждать однозначно, что это поможет.

 

Еще как вариант, увеличьте ring buffer для сетевой, чтобы если пакеты не были забраны у карты, они оставались в буфере. Ну и queue length на интерфейсе подкрутите. Эти все манипуляции, однако, приведут к увеличению RTT во время дисковой активности, если причина в ней, конечно.

Share this post


Link to post
Share on other sites

Нет, прерывания выполняются по таймеру, по очереди, поэтому понятия приоритета отсутствует. В вашем случае попробуйте вынести ide0 на кокретный процессор. Но в вашем примере мало данных чтобы утверждать однозначно, что это поможет.

 

Еще как вариант, увеличьте ring buffer для сетевой, чтобы если пакеты не были забраны у карты, они оставались в буфере. Ну и queue length на интерфейсе подкрутите. Эти все манипуляции, однако, приведут к увеличению RTT во время дисковой активности, если причина в ней, конечно.

С прерываниями понятно. Видимо приоритезация возможна только на rt-ядрах. Все остальное подкручено и ring buffer и queue length. Попробую по вашему совету выделить ide0 в отдельное прерывание и посмотреть что из этого выйдет.

Share this post


Link to post
Share on other sites

Я когда-то тоже руками распределял прерывания. А года два назад обнаружил, что irqbalance неплохо справляется с этой задачей в автоматическом режиме.

Share this post


Link to post
Share on other sites

Я когда-то тоже руками распределял прерывания. А года два назад обнаружил, что irqbalance неплохо справляется с этой задачей в автоматическом режиме.

 

irqbalance может вам некисло потрепать нервы на роутере. Его нужно обязательно отключать.

Share this post


Link to post
Share on other sites

Согласен, на роутере нужно отключать irqbalance и governer ставить в preference, либо совсем не использовать cpuspeed.

 

Как ни странно, но выделение для ide0 отдельного прерывания сняло проблему. В связи с этим вопрос, с чего вдруг такое поведение, ведь на соседней машине такого нет. Как писал выше отличаются только HDD :) Первый раз с таким сталкиваюсь. Получается либо сам HDD либо шлейф.

Share this post


Link to post
Share on other sites

Как ни странно, но выделение для ide0 отдельного прерывания сняло проблему. В связи с этим вопрос, с чего вдруг такое поведение, ведь на соседней машине такого нет. Как писал выше отличаются только HDD :) Первый раз с таким сталкиваюсь. Получается либо сам HDD либо шлейф.

 

На одной машине ide на другой sata? Значит драйвер диска занимает процессор на время прерывания так долго, что успевают потеряться пакеты. Чем он может занимать - например, пересылкой данных при отключенном dma.

Сделайте hdparm -d /dev/hda

Share this post


Link to post
Share on other sites

Как ни странно, но выделение для ide0 отдельного прерывания сняло проблему. В связи с этим вопрос, с чего вдруг такое поведение, ведь на соседней машине такого нет. Как писал выше отличаются только HDD :) Первый раз с таким сталкиваюсь. Получается либо сам HDD либо шлейф.

 

На одной машине ide на другой sata? Значит драйвер диска занимает процессор на время прерывания так долго, что успевают потеряться пакеты. Чем он может занимать - например, пересылкой данных при отключенном dma.

Сделайте hdparm -d /dev/hda

На самом деле оба диска SATA, но системой определились как IDE, что странно.

Там где все в порядке, этот:

http://www.nix.ru/autocatalog/hdd_seagate/HDD_320_SATAII_Seagate_Barracuda_7200.11_ST3320613AS_3.5_74606.html

 

Там где есть проблема, этот:

http://www.nix.ru/autocatalog/hdd_seagate/HDD_SATAII_Seagate_Maxtor_Barracuda_7200.10_DiamondMax_21_3250310AS_3.5_66197.html

 

DMA не используется в обоих случаях.

# hdparm -d /dev/hdc

/dev/hdc:
using_dma    =  0 (off)

# hdparm -d /dev/hda

/dev/hda:
using_dma    =  0 (off)

Share this post


Link to post
Share on other sites

using_dma = 0 (off)

Включить DMA: hdparm -d1 /dev/hda. Ещё бывает полезно сделать -c1 (включить IDE 32-bit IO).

 

DMA не используется в обоих случаях.

 

У меня на sata дисках нет опции using_dma, так как доступ к дискам через scsi. Даже диски называются sdx. Посмотрите на нормальной машине /proc/interrupts, там растет ide, или acpi, или ещё что (ata_piix у меня на старой машинке).

Edited by aabc

Share this post


Link to post
Share on other sites

Вы умудрились заюзать какой-то legacy драйвер, видать он действительно в эмуляции PIO работает и убивает всю систему при любой дисковой активности.

Ищите какой драйвер используется и почему.

Share this post


Link to post
Share on other sites

Ну почему же, может и в биосе включен пио режим (как в этом случае линь себя поведет? скорее всего не будет насильно дма включать?), или compatible mode для контроллера... Плата, как я понял, с ich7 с сата в режиме IDE...

Share this post


Link to post
Share on other sites

Create an account or sign in to comment

You need to be a member in order to leave a comment

Create an account

Sign up for a new account in our community. It's easy!

Register a new account

Sign in

Already have an account? Sign in here.

Sign In Now
Sign in to follow this