Как вынудить ядро Linux “заморозиться” (или почти заморозиться) для нескольких сотен миллисекунд

На моем поле F17 я все еще имею /boot/grub/splash.xpm.gz который предназначен, чтобы быть экраном-заставкой личинки. Это содержится в fedora-logos пакет. Каталог не содержит ничто иное. Мое предположение, это будет зафиксировано рано или поздно.

17
21.08.2018, 04:16
4 ответа

Одним из вариантов для быстрого теста можно использовать ядро ​​с поддержкой KGDB и остановить ядро ​​вручную и тестирование, см. Эта ссылка .

На другой ноте вещи, которые я помню, что может вызвать ваши паузы:

  • CPUFREQ, CAT / SYS / УСТРОЙСТВО / СИСТЕМЫ / CPU / CPU0 / CPUFREQ / CPUINFO_TRANSITY_LATENCY , значение находится в NS (4000 В моем AMD FX (TM) -8120-8-ядерный процессор) не должен быть проблемой, но проверять
  • Тепловой дросселирование либо самого CPU, либо модуль регулятора напряжения.
  • Напил и / или тяжелый сетевой трафик
  • PCIE ASPM ( CAT / SYS / MODULE / PCIE_ASPM / Параметры / Политика )
  • Соглашение в буферах вашего назначения устройства (жесткий диск, NIC ...)
  • Ошибка в прошивке некоторых устройств в шине PCIe (даже если вы его не используете), вы можете попробовать выключить их с помощью / SYS / BUS / PCI / устройствах / $ устройством / Power / Control
9
27.01.2020, 19:47

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

Каждое устройство 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/drers/net/e1000e/netdev.c.c # L4643

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

1
27.01.2020, 19:47

Сначала необходимо проверить, подключен ли процесс к терминалу.

$ ps -eo comm,tty | grep fsck

Теперь, если вы по-прежнему можете видеть значение TTY рядом с вашим процессом, вы по-прежнему можете получить его вывод (из этого TTY). Текущий идентификатор TTY можно получить с помощью tty . Однако, если рядом с вашим процессом есть ? , боюсь, вы не сможете получить его вывод в любом случае (если вы не использовали что-то вроде экрана ).

Если процесс все еще подключен к работающему терминалу, можно вернуть процесс на передний план с помощью fg (в этом терминале, конечно):

$ jobs
$ fg [job ID]

задания выдадут идентификатор, связанный с запущенным процессом fsck.ext4 . Затем используйте его при вызове fg . Можно также вызвать fg без аргументов, если в фоновом режиме имеется только одно задание.

Я не знаком с fsck.ext4 , но используемый вами переключатель -t , похоже, печатает статистику (отредактируйте: также как и параметр -C 0 ). Вернув процесс на передний план, вы получите этот вывод обратно. Однако, если fsck.ext4 не был запущен с подробными параметрами, он не будет печатать ничего, независимо от того, находится ли он на переднем плане или в фоновом режиме. В этом случае можно просто проверить, выполняется ли он по-прежнему с помощью ps .

Когда вы закончите, просто нажмите Ctrl + Z , чтобы снова отправить процесс в фоновом режиме. Будьте осторожны, если процесс подключен к терминалу (то есть, если программа принадлежит сеансу управления терминала), то закрытие терминала отправит SIGHUP процессу и убьет его (если только вы не заставили fsck.ext4 игнорировать SIGHUP ).

-121--139948-

Следующее, кажется, работает просто хорошо в моем sh :

$ myvar="test"
$ echo "My var is $myvar."
My var is test.

Нет необходимости эхо значение переменной и поймать его снова в другой. Здесь приводится немного больше информации о присвоениях переменных .

Объект , OSTYPE не определен в среде sh . Вам придется передать его при выполнении сценария. Так что, вместо того, чтобы бежать...

$ /bin/sh yourscript.sh
or
$ ./yourscript.sh

Необходимо выполнить:

$ OSTYPE=$OSTYPE /bin/sh yourscript.sh
or
$ OSTYPE=$OSTYPE ./yourscript.sh

Конечно, предполагается, что родительская оболочка, в которой вводится приведенная выше команда, имеет переменную OSTYPE . В то время как bash делает, это не случай каждой оболочки. Вместо $ OSTYPE можно использовать uname :

$ OS=$(uname -o)
$ echo "My OS is $OS."
My OS is GNU/Linux.
$ echo "My OS is $(uname -o)."
My OS is GNU/Linux.

На моей машине для переменной OS устанавливается значение GNU/Linux , а не linux-gnu (которое является содержимым моего OSTYPE ).

В качестве дополнительного примечания я предполагаю, что эквивалент вашего кода может быть:

$ myvar="$(echo $OSTYPE)"
$ echo "My var is $myvar."
My var is linux-gnu
-121--244812-

Можем ли мы получить более подробную информацию о том, как ваше приложение взаимодействует с FPGA? Приложение, считывающее буфер из FPGA,или FPGA, который отправляет прерывания ядру (например, сетевым картам)?

Я ожидаю, что он откроет блок/символ в/dev, а затем свяжется с ним. Это означает, что для коммуникации между приложением и файлом/dev/XXX используется драйвер.

Я хотел бы получить результат: cat/proc/intrupts ; lsmod ; ls -al/dev/yourmod

Вот какие идеи:

  • Если используется прерывание, можно настроить CPU PIC на отключение соответствующего IRQ, а затем снова включить его. Это приведет к игнорированию каждого запроса карты (без уведомления карты об этом).
  • Если это как чтение буфера, вы можете:
    • Переведите приложение в спящий режим, чтобы данные из FPGA не считывались, а буфер заполнялся, затем будил приложение и продолжал чтение.
    • Используйте «crash» или «kgdb» для изменения значения «read» на «noop» в течение нескольких секунд, а затем снова установите его в функцию по умолчанию.

Предоставьте всю необходимую информацию.

2
27.01.2020, 19:47

Я думаю, что вы думаете не в том направлении. Ваша цель ясна.

Способ заключается не в том, чтобы остановить остальные процессы, а в том, чтобы дать вашим основным процессам приоритет планирования в режиме, близком к реальному времени. Для этого используйте nice для ваших важных процессов в пользовательском пространстве.

Более сложной проблемой является обработка прерываний PCIe, которая находится в пространстве ядра.

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

irqbalance обычно хорошо справляется с этой задачей, но вы можете настроить его поведение в соответствии с вашими потребностями.

0
27.01.2020, 19:47

Теги

Похожие вопросы