Вопрос или проблема
Недавно я заметил, что один из моих процессоров работал с загрузкой около 85-90%, и согласно top
загрузка шла от прерываний, поэтому как в этом вопросе я использовал комбинацию dmesg
и периодически проверял /proc/interrupts
и обнаружил следующее:
CPU0 CPU1 CPU2 CPU3
0: 17 0 0 0 IR-IO-APIC 2-edge timer
1: 11548 0 2429 0 IR-IO-APIC 1-edge i8042
8: 0 0 0 1 IR-IO-APIC 8-edge rtc0
9: 7 16 0 0 IR-IO-APIC 9-fasteoi acpi
12: 14530 108887 0 0 IR-IO-APIC 12-edge i8042
16: 78464100 0 0 11702812 IR-IO-APIC 16-fasteoi idma64.0, i2c_designware.0, i801_smbus
120: 0 0 0 0 DMAR-MSI 0-edge dmar0
121: 0 0 0 0 DMAR-MSI 1-edge dmar1
Как вы можете видеть, IRQ #16 отправляет прерывания как сумасшедший (каждый раз, когда CPU пробуждается из S3, похоже, он начинает спамить другой процессор), я также обнаружил, что мой тачпад использует тот же IRQ, и если включен I2C-режим (или расширенный режим, согласно моему BIOS), он случайным образом перестает работать с следующими сообщениями (из dmesg
):
[ 167.851139] irq 16: nobody cared (try booting with the "irqpoll" option)
[ 167.851158] CPU: 2 PID: 3874 Comm: firefox Not tainted 4.15.3-300.fc27.x86_64 #1
[ 167.851160] Hardware name: Acer Aspire E5-575/Ironman_SK , BIOS V1.04 04/26/2016
[ 167.851162] Call Trace:
[ 167.851171] <IRQ>
[ 167.851185] dump_stack+0x5c/0x85
[ 167.851193] __report_bad_irq+0x30/0xc0
[ 167.851196] note_interrupt+0x235/0x280
[ 167.851198] handle_irq_event_percpu+0x51/0x70
[ 167.851201] handle_irq_event+0x27/0x50
[ 167.851204] handle_fasteoi_irq+0x6b/0x120
[ 167.851209] handle_irq+0xaf/0x120
[ 167.851214] do_IRQ+0x41/0xc0
[ 167.851219] common_interrupt+0xa2/0xa2
[ 167.851222] </IRQ>
[ 167.851224] RIP: 0010:_raw_spin_lock+0x10/0x20
[ 167.851226] RSP: 0000:ffffa85a857dfdd0 EFLAGS: 00000246 ORIG_RAX: ffffffffffffffdb
[ 167.851230] RAX: 0000000000000000 RBX: ffff8d0a268930c8 RCX: 00003ffffffff000
[ 167.851231] RDX: 0000000000000001 RSI: 8000000000000025 RDI: ffffd21648d7ca70
[ 167.851232] RBP: ffffd2164892e100 R08: 0000000000000000 R09: 0000000000171800
[ 167.851233] R10: 0000000000271800 R11: 0000000000001000 R12: 0000000000000000
[ 167.851234] R13: 8000000224b84867 R14: ffffd21648d7ca70 R15: ffff8d0a35f29810
[ 167.851244] __handle_mm_fault+0xa4c/0x1290
[ 167.851249] handle_mm_fault+0xaa/0x1f0
[ 167.851255] __do_page_fault+0x25d/0x4e0
[ 167.851262] ? SyS_mmap_pgoff+0xfb/0x250
[ 167.851264] do_page_fault+0x32/0x110
[ 167.851267] ? page_fault+0x36/0x60
[ 167.851269] page_fault+0x4c/0x60
[ 167.851272] RIP: 0033:0x7ff86dc0b205
[ 167.851273] RSP: 002b:00007ffe6493e888 EFLAGS: 00010206
[ 167.851276] handlers:
[ 167.851291] [<0000000061f0cd43>] idma64_irq [idma64]
[ 167.851296] [<000000006909bb35>] i2c_dw_isr
[ 167.851302] [<00000000ee17d26d>] i801_isr [i2c_i801]
[ 167.851304] Disabling IRQ #16
Это аппаратная проблема? Что я могу сделать?
Наконец, у меня есть возможность более подробно разобрать это, запустив lspci -nnkv
, я нашел 2 устройства, которые используют IRQ 16:
00:15.0 Signal processing controller [1180]: Intel Corporation Sunrise Point-LP Serial IO I2C Controller #0 [8086:9d60] (rev 21)
Subsystem: Acer Incorporated [ALI] Device [1025:1094]
Flags: fast devsel, IRQ 16
Memory at a132b000 (64-bit, non-prefetchable) [size=4K]
Capabilities: [80] Power Management version 3
Capabilities: [90] Vendor Specific Information: Len=14 <?>
Kernel driver in use: intel-lpss
Kernel modules: intel_lpss_pci
и:
00:1f.4 SMBus [0c05]: Intel Corporation Sunrise Point-LP SMBus [8086:9d23] (rev 21)
Subsystem: Acer Incorporated [ALI] Device [1025:1094]
Flags: medium devsel, IRQ 16
Memory at a132e000 (64-bit, non-prefetchable) [size=256]
I/O ports at 4040 [size=32]
Kernel driver in use: i801_smbus
Kernel modules: i2c_i801
Проблема, похоже, исчезает, если я выгружаю модуль intel_lpss_pci
, т.е. rmmod intel_lpss_pci
, но, конечно, тачпад перестанет работать. Но, думаю, это лучше, чем иметь процессор всегда на 100%.
Возможно, нужно добавить его в список PM приостановки, чтобы он перезагружался после цикла приостановки/размораживания.
SUSPEND_MODULES=”brcmfmac intel_lpss_pci intel_lpss_acpi”
Ответ или решение
Высокая загрузка процессора из-за IRQ #16: Проблемы и решения
Недавно вы столкнулись с проблемой высокой загрузки процессора (85-90%) из-за прерываний, связанных с IRQ #16. Давайте разберемся в деталях этой ситуации, чтобы понять, как ее можно решить.
Анализ ситуации
На основании ваших данных, IRQ #16 генерирует огромное количество прерываний. Из вывода cat /proc/interrupts
видно, что это прерывание обрабатывается на ядрах CPU0 и CPU3, где количество прерываний зафиксировано на уровне 78464100 и 11702812 соответственно. Это говорит о том, что какое-то устройство или драйвер вызывает частые и ненужные прерывания, что приводит к перегрузке процессора.
Дальнейший анализ показывает, что два устройства используют IRQ #16:
- Intel Sunrise Point-LP Serial IO I2C Controller #0
- Intel Sunrise Point-LP SMBus
Оба устройства активно работают с драйверами intel-lpss
и i2c_i801
. Интересно, что при выгрузке модуля intel_lpss_pci
ситуация с загрузкой процессора улучшается, но в этом случае прекращает работать тачпад.
Причины проблемы
- Конфликт аппаратного обеспечения: Устройства, использующие один IRQ, могут конфликтовать, что приводит к неправильной обработке прерываний.
- Ошибки драйвера: Возможно, проблема возникает из-за неэффективного драйвера, который неправильно обрабатывает прерывания.
- Биос настройки: Неправильные настройки BIOS могут также способствовать частоте прерываний.
Возможные решения
-
Обновление драйверов: Убедитесь, что у вас установлены последние версии драйверов для ваших устройств. Это может помочь устранить известные проблемы и конфликты.
-
Настройки BIOS: Войдите в настройки BIOS и посмотрите, можно ли изменить конфигурацию устройств, использующих IRQ #16. Иногда отключение определенных режимов может помочь.
-
Использование параметра
irqpoll
: Попробуйте запустить систему с параметромirqpoll
, добавив его в настройки загрузчика вашей ОС. Это может помочь в обработке прерываний более эффективно. -
Добавление модуля в suspend list: Как вы уже упомянули, можно добавить
intel_lpss_pci
в список модулей, которые выгружаются перед переходом в режим энергосбережения. Это можно сделать, добавив строку:SUSPEND_MODULES="brcmfmac intel_lpss_pci intel_lpss_acpi"
в конфигурационный файл вашего дистрибутива.
-
Замена или отключение устройства: Если указанные выше методы не помогают, возможно, стоит рассмотреть возможность замены устройства, вызывающего проблемы, или его отключения, если оно не является критически важным.
Заключение
Высокая загрузка процессора, вызванная прерываниями, является серьезной проблемой, которую можно решить с помощью анализа аппаратного обеспечения и программного обеспечения. Воспользуйтесь предложенными шагами, чтобы снизить нагрузку на процессор и улучшить общую производительность системы. Убедитесь, что вы тщательно отслеживаете изменения и их влияние на систему, чтобы найти наиболее эффективное решение для вашей конкретной ситуации.