Нежелательная задержка, когда поток ядра выполняет больше коммуникационной работы

Мы разработали модуль ядра, который действует в основном как трафик проводной связи (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.

0 ответов

Другие вопросы по тегам