SOFTIRQ_LATENCY_SPIKE
Linux / DevOps
Диагностика задержек Softirq и высокой нагрузки ksoftirqd в Linux
- Процессы ядра
[ksoftirqd/0],[ksoftirqd/1]потребляют до 100% CPU. - В выводе
topзначение%siпревышает 20-30%. - Задержки (Jitter) в обработке TCP/UDP пакетов, резкое падение сетевой пропускной способности.
1. Анализ распределения типов Softirq
watch -n 1 cat /proc/softirqsОпределите, какой вектор непрерывно растет: NET_RX (прием сети), NET_TX (передача), BLOCK (дисковый I/O), TIMER (таймеры ядра) или RCU.
2. Проверка сетевого аппаратного оффлоадинга сетевой карты
ethtool -k eth0 | grep -E "generic-|tcp-segmentation|receive-offload"Включение аппаратной разгрузки очередей (GRO, GSO, TSO):
ethtool -K eth0 gro on gso on tso on3. Увеличение размера очереди пакетов ядра
Отредактируйте /etc/sysctl.d/99-network-backlog.conf:
# Максимальное количество пакетов в очереди на обработку до передачи сокету
net.core.netdev_max_backlog = 10000
# Бюджет обработки пакетов softirq за один проход NAPI
net.core.netdev_budget = 600
net.core.netdev_budget_usecs = 4000sysctl --system4. Трассировка функций softirq через perf
perf top -e irq:softirq_entry
Практический опыт инженера:
Если ksoftirqd утилизирует CPU из-за вектора NET_RX, увеличьте размер кольцевого буфера драйвера: ethtool -G eth0 rx 4096 tx 4096.
Частые вопросы (FAQ)
Какую роль выполняет демон ksoftirqd?
Когда отложенные прерывания (softirq) не успевают обработаться в аппаратном контексте прерывания за отведенный таймаут, ядро делегирует их демону ksoftirqd/X для обработки в контексте планировщика задач.
Почему NET_RX является самым частым виновником нагрузки ksoftirqd?
При сетевом SYN-флуде или обработке сотен тысяч мелких сетевых пакетов (Packet per Second, PPS) сетевая карта засыпает ядро прерываниями, перегружая кольцевые буферы драйвера (Ring Buffers).