Чтение файла уничтожает сетевые прерывания

#linux #filesystems #mips #jffs2

#linux #файловые системы #mips #jffs2

Вопрос:

У меня очень странная проблема с платой, основанной на процессоре MIPS и Linux 2.6. Для всех входящих пакетов Ethernet есть прерывания сетевого адаптера. Если я отправлю 10.000 пакетов, я смогу увидеть, что произошло 10.000 прерываний сетевого адаптера.

 START SYSTEM

SEND 10k PACKETS

/mnt/system # cat /proc/interrupts
          CPU0       
24:      10000         MIPS  NIC
29:       7192         MIPS  timer
30:          0         MIPS  UART1
31:       3092         MIPS  serial

ERR:          0
  

Однако после того, как я открываю и закрываю файл (заполненный нулями или обычный) в файловой системе, генерируется гораздо меньше сетевых прерываний. Например, всего 2-7 тыс. прерываний для 10 тыс. пакетов. Это отрицательно сказывается на производительности системы, но после перезагрузки все с прерываниями сетевого адаптера снова работает нормально.

 START SYSTEM

std::fstream f;
f.open("/mnt/system/myfile");
f.close(); 

WAIT FOR SOME TIME

SEND 10k PACKETS

/mnt/system # cat /proc/interrupts
          CPU0       
24:       2045         MIPS  NIC
29:       7192         MIPS  timer
30:          0         MIPS  UART1
31:       3092         MIPS  serial

ERR:          0
  

Файловая система — jffs2, а флэш-накопитель — 32M ИЛИ последовательное устройство.
Почему чтение файла убивает прерывания сетевого адаптера до перезагрузки?

Комментарии:

1. 1) Это не C, возможно, C ! 2) Ваш вопрос неясен. 3) Есть ли вообще проблема?

2. 1) На самом деле, я пробовал различные способы чтения файла, например, хвост Linux создает ту же проблему 2) обновлено 3) да, потому что существует корреляция между количеством прерываний и производительностью обработки пакетов устройства

3. То есть вы имеете в виду, что меньше прерываний означает меньшую производительность? Приходило ли вам в голову, что доступ к файлам также загружает процессор и, возможно, использует прерывания?

4. Я открываю файл, затем закрываю его, затем жду 5 минут, а затем отправляю 10 тыс. пакетов. Генерируется только 2 тыс. сетевых прерываний. Я знаю, это звучит смешно, но, возможно, у кого-то была похожая проблема,

5. Не уверен, когда это было введено, но вы также можете видеть эффекты NAPI. Когда загрузка прерывания пакета становится проблемой, ядро отключает прерывание и выделяет поток ядра для опроса сетевого адаптера, который продолжается до тех пор, пока поток опроса больше не будет получать новые пакеты. Это более эффективно, чем прерывания все время, но если система также использует 100% CPU для других задач, она потеряет пакеты. Но в этот момент вам нужно будет назначить приоритеты потоков в реальном времени и признать, что ваш процессор недостаточно быстр для работы.

Ответ №1:

Предостережение: возможно, это не полное решение, но у меня есть несколько идей. Может потребоваться дополнительная информация / тестирование.

Когда вы не делаете [система не делает] ничего другого, драйвер сетевого адаптера достаточно быстро реагирует на прерывание, и ISR завершит обработку одного пакета до поступления следующего пакета. (т. Е.) Существует взаимно однозначная связь между входящими пакетами и прерываниями сетевого адаптера.

Если у вас есть другие системные действия, это может задержать ввод в ISR драйвера сетевого адаптера. Кроме того, это другое действие может замедлить обработку в драйвере сетевого адаптера из-за конкуренции за ресурсы (например, блокировки, kmalloc и т. Д.)

Между тем, поступает больше сетевых пакетов. Когда ISR сетевой карты вводится окончательно / окончательно, он видит, что на рассмотрении находится несколько пакетов. Он обработает их все, не покидая ISR. Таким образом, он может обрабатывать (например) 5 пакетов при каждом прерывании, поэтому количество прерываний уменьшается в 5 раз.

Это то, что делают большинство «умных» сетевых карт и драйверов. Это фактически улучшает пропускную способность при интенсивном сетевом трафике. Обычно меньшее количество прерываний сетевого адаптера — это хорошо, потому что это уменьшает затраты времени на повторный вход / выход из ISR.

Это действительно зависит от скорости поступления пакетов и [среднего] интервала.

Итак, реальный вопрос: «Когда количество прерываний уменьшается, вы теряете пакеты / данные или просто видите потерю производительности?»

И как вы измеряете разницу в производительности системы?

Используется ли рассматриваемая файловая система иначе (например, это корневая fs)? Или ваша программа, открывающая файл, является единственным доступом к fs [кроме его монтирования]

Я не знаком с jffs2 или с вашим драйвером flash, поэтому я бы спросил, подозреваете ли вы, что кто-то из них делает что-то, что отключает прерывания на длительный период времени?


Обновить:

Я только что заметил, что вы используете Linux версии 2.6, что ядру примерно 10 лет. Срок его службы давно истек, поэтому, вероятно, он не получает исправлений ошибок для драйверов, если их не предоставляет поставщик платформы.

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

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