Як змусити ядро ​​Linux "заморозити" (або майже заморозити) протягом кількох сотень мілісекунд


17

Ми запускаємо процес у режимі реального часу на ядрі в режимі реального часу (CentOS 6), і це, мабуть, не зміниться.

У нас є програма для потокового відео, яка вимагає близько 500 Мб / с PCIe трафіку з користувацької FPGA безперервно протягом 1,5 годин одночасно. Додаток працює досить добре - більшість часу. Однак у нас були ситуації, коли, здається, ядро ​​просто перестає реагувати на обслуговування PCIe або запитів на пам'ять до 500 мілісекунд одночасно. Це, мабуть, відбувається під час зриву вводу файлів IO з іншого потоку. Я вважаю, що неможливо спробувати повторити цю проблему, просто зробивши безліч фіктивних файлів IO з користувальницького простору, поки основний додаток працює.

Чи є спосіб змусити (імітувати) глобальне «заморожування» ядра Linux (зокрема, зупинення PCIe або всіх доступу до пам'яті DDR3 чи щось подібне), щоб ми могли відтворити цю проблему?

Наразі у внутрішній пам'яті FPGA реалізовано буферизацію до 10 мілісекунд, але цього недостатньо. Ми можемо буферувати FPGA DDR3, а потім скинути на хост, але нам потрібен метод для перевірки цієї нової функції під примусом.

Ми не хочемо, щоб ядро ​​назавжди заморожувалося або блокувалося. Ми хотіли б можливість встановити часовий інтервал.

Я шукаю щось у напрямку написання магічних значень /proc/sys/vmтимчасово, що змушує систему практично повзати, а потім повертатися назад через кілька сотень мілісекунд, але дивлюсь на кількість можливих способів її зламати не для новачків, як я ( https://www.kernel.org/doc/Documentation/sysctl/vm.txt ). Може, якась numactlмагія?


Моя думка полягає в тому, що для цього потрібно написати модуль ядра. Вам потрібно буде якось заморозити всі потоки на всіх процесорах та домовитись про перезапуск при перериванні таймера.
Жиль "ТАК - перестань бути злим"

Я не хочу заморожувати потоки, я хочу заморозити ядро! Тобто, я хочу на короткий час запобігти доступ до апаратного забезпечення (пам'яті та / або PCIe та / або диска). Якщо це не працює, я не проти робити речі дуже неоптимізованими, відключати кеш-пам'ять L1 тощо. Я просто не знаю, як це зробити.
Марк Лаката

1
А, значить, ви не хочете заморожувати ядро, ви хочете заморозити лише ту частину ядра, яка відповідає деяким обладнанням? Це теж зажадає занурення досить глибоко в ядро.
Жил 'ТАК - перестань бути злим'

Я не проти повністю заморозити ядро ​​до тих пір, поки апаратне забезпечення заморожене як частина.
Марк Лаката

1
Виявляється, проблема пов’язана з обмолотом TLB, коли хост-процесор промиває деякі буфери вводу-виводу (ми використовуємо HDF5 для запису файлів), і це трелювання TLB призводить до того, що копроцесор також бив, оскільки це система NUMA. Я думаю, що нам зараз потрібно надійний спосіб програмного спричинення обмолоту TLB протягом контрольованої кількості часу.
Марк Лаката

Відповіді:


9

Одним із варіантів зробити швидкий тест може бути використання ядра з підтримкою KGDB та зупинення ядра вручну та тестування, дивіться це посилання .

Ще одна примітка: речі, які я пам’ятаю, можуть спричинити ваші паузи:

  • cpufreq, cat /sys/devices/system/cpu/cpu0/cpufreq/cpuinfo_transition_latencyзначення вказано в ns (4000 в моєму процесорі AMD FX (tm) -8120), не повинно бути проблемою, але перевірте
  • Термічне дроселювання або самого процесора, або модуля регулятора напруги.
  • NAPI та / або великий мережевий трафік
  • PCIe ASPM ( cat /sys/module/pcie_aspm/parameters/policy)
  • Зміст у буферах пристрою призначення (жорсткий диск, нік ...)
  • Помилка прошивки деякого пристрою в шині PCIe (навіть якщо ви його не використовуєте), ви можете спробувати вимкнути їх за допомогою /sys/bus/pci/devices/$DEVICE/power/control

Чи можу я використати kdbзамість того, kgdbщоб зробити те саме? Я ніколи не використовував. Це схоже на послідовність команд "Стоп-А" на робочих станціях Sun минулого року? Якщо я просто зробимо швидкий SysRq-g, то введіть "go", чи буде у мене велика ймовірність не зламати систему? (ref: kernel.org/pub/linux/kernel/people/jwessel/kdb/… )
Марк Лаката

1
Можливо, ви зможете використовувати kdb. Будьте в курсі, що він повинен працювати з клавіатурами, підключеними до usb, але намагайтеся мати PS / 2 під рукою на всякий випадок. І це налагоджувач дуже низького рівня (земля ядра), тому, як завжди, зберігайте резервні копії, і якщо він зламається, ви можете зберегти обидві частини :).
Хорхе Нерін

Перш ніж вдаватися до налаштування ядра, я спершу спробую вивантажити невикористані модулі ядра для пристроїв PCIe, які можуть використовувати шину (графічні драйвери особливо), а також фізично видалити пристрої з системи або вимкнути їх. PCIe 1.0 x1 має пропускну здатність 250 Мб / с, а PCIe 2.0 x1 піднімається до 500 МБ / с, чи пристрій походження, так і цільовий пристрій вільний приймати таку стійку швидкість без перерв, чи у них більше смуг, щоб дозволити більше пробігу?
Хорхе Нерін

Іншим можливим джерелом відставання може бути якийсь обробник управління живленням ACPI якогось пристрою або, можливо, навіть якийсь обробник процесора SMM, який чекає зовнішньої події.
Франки

2

Чи можемо ми дізнатися більше про те, як ваша програма спілкується з FPGA? Це програма, яка зчитує буфер з FPGA або FPGA, що надсилає переривання до ядра (наприклад, мережеві карти)?

Я очікую, що він відкриє блок / char в / dev, а потім спілкуватись з ним. Це означає, що він використовує драйвер для зв'язку між програмою та файлом / dev / XXX.

Я хотів би мати вихід: cat /proc/interrupts; lsmod;ls -al /dev/yourmod

Ось ідеї:

  • Якщо він керується перериванням, ви можете встановити PIC процесорів для відключення відповідного IRQ, а потім знову включити його. Це призведе до ігнорування кожного запиту картки (без усвідомлення карти).
  • якщо це як буфер читання, ви можете:
    • Переведіть додаток у стан сну, щоб дані з FPGA не були прочитані, і ваш буфер заповниться, потім прокинете програму та продовжте прочитане.
    • Використовуйте "краш" або "kgdb", щоб змінити значення "read" на "noop" на кілька секунд, а потім поверніть його до функції за замовчуванням.

Будь ласка, надайте всю інформацію, яка може вам бути корисною.


FPGA робить запис DMA на пам'ять хоста, і під час цих періодів відключення FPGA не в змозі записувати в пам'ять хоста, тому її внутрішня резервна копія FIFO. Є хост-процес на основі повідомлень (трапляється через PCIe), але я впевнений, що це не пов'язано. В цілях перевірки мені в основному потрібен спосіб заборони апаратним засобам FPGA записувати на хост-пам'ять протягом декількох сотень мілісекунд. Я не хочу вирішувати проблему з пам’яттю, але хочу переконатися, що наша реалізація на FPGA здатна вирішити проблему з пам’яттю (до 1000 мс).
Марк Лаката

Гаразд, якщо він використовує DMA, ви можете подивитися на: kernel.org/doc/Documentation/DMA-ISA-LPC.txt докладної інформації про заяву_dma_lock () та dma_disable (). Однак вам потрібно знати адреси, які використовує ваш FPGA.
Адріан М.

1

Не впевнений, чи допомагає це. Але якщо ви можете написати модуль ядра, який викликає suspendфункцію модуля ядра іншого пристрою, це може зробити.

Кожен пристрій PCI можна призупинити відповідно до файлу заголовка http://www.cs.fsu.edu/~baker/devices/lxr/http/source/linux/include/linux/pci.h#L479

Наприклад, ось призупинення функції Intel e1000 NIC http://www.cs.fsu.edu/~baker/devices/lxr/http/source/linux/drivers/net/e1000e/netdev.c#L4643

Як я пам'ятаю, ця функція в основному використовувалася, коли система переходить у сплячий режим, драйвер пристрою повинен зберегти поточний стан роботи та вимкнутись.


дякую, але я не думаю, що це спрацює. Я не дуже хочу призупиняти пристрій, яке є ядром, яке повідомляє пристрою підготуватися до сплячки; Я хочу, щоб ядро ​​ігнорувало конкретний пристрій (в даному випадку дочірня плата FPGA), не знаючи про це (крім тривалих затримок або таймаутів) - або я хочу зупинити всі передачі пам'яті SDRAM.
Марк Лаката

0

Я думаю, що ти думаєш по неправильній лінії. Ваша мета зрозуміла.

Спосіб полягає не в тому, щоб зупинити решту процесів, а надати основним процесам пріоритет планування в режимі реального часу. Використовуйте приємне для ваших важливих для користувача-простору процесів для цього.

Більш складною проблемою є обробка переривань PCIe, яка знаходиться в просторі ядра.

Оскільки апаратне забезпечення задіяне, вам слід почати детальніше ознайомитись із залученою смугою PCIe на вашій материнській платі та тим, як це можливо підключено до певного сокета процесора.

Ірбаланс звичайно добре справляється тут, але ви можете налаштувати його поведінку відповідно до ваших потреб.

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.