Нежелательная задержка, когда поток ядра выполняет больше коммуникационной работы
Мы разработали модуль ядра, который действует в основном как трафик проводной связи (eth, ...) - мост WiFi. Периодически пересылает входящие проводные данные в WiFi и наоборот. Система состоит из двух устройств, работающих под управлением одного модуля ядра. При определенных условиях мы испытываем нежелательную задержку.
Модуль запускает поток ядра, который в основном выполняет:
while(1) {
schedule()
do_bridge_work()
usleep_range(200, 500)
}
Во время нормальной работы top
команда отображает:
CPU: 0% usr 19% sys 0% nic 60% idle 0% io 0% irq 19% sirq
Load average: 1.03 1.06 1.01 1/54 491
PID PPID USER STAT VSZ %VSZ %CPU COMMAND
491 2 root DW 0 0% 29% [bridge_thread]
3 2 root SW 0 0% 10% [ksoftirqd/0]
Когда диагностика активирована, поток также отправляет дополнительные диагностические проводные эти пакеты. В этом режиме пинг устройств с одной стороны на другую идет от 5-6 мс до 45-900 мс. top
затем показывает:
CPU: 0% usr 25% sys 0% nic 50% idle 0% io 0% irq 24% sirq
Load average: 1.06 1.07 1.01 1/54 491
PID PPID USER STAT VSZ %VSZ %CPU COMMAND
491 2 root DW 0 0% 35% [bridge_thread]
3 2 root SW 0 0% 14% [ksoftirqd/0]
Если дополнительный schedule()
вставляется перед usleep_range()
или, если время сна увеличивается, это резко уменьшает задержку. Я думаю, что я сузил его, чтобы сделать вывод, что RX softirq не получает время планирования, необходимое для обработки входящего трафика (NET_RX_SOFTIRQ
). Это основано на том факте, что время передачи пакетов отлично.
Мои вопросы:
1: почему время пинга увеличивается из-за большего количества работы в do_bridge_work()
(больше обработки и дополнительной передачи пакетов). Является NET_RX_SOFTIRQ
скорее всего голодали?
2: почему время пинга уменьшается при дополнительном schedule()
вставляется, или когда время сна увеличивается? Означает ли это, что 200-500 млн. Долл. США недостаточно для обработки всех ожидающих программных вычислений, а более низкие программные средства голодают? Является ли эффект добавления дополнительного schedule()
так же, как позволить другим делать больше работы, увеличивая время сна?
Версия ядра - 4.1.38, настроенная с NO_HZ, PREEMPT = y.