- Вопрос или проблема
- softlockup_panic включен
- softlockup_panic выключен
- Ответ или решение
- Как вызвать софт-локап в ядре Linux и как его проверить
- Шаг 1: Настройка параметров ядра
- Шаг 2: Создание модуля ядра для генерации софт-локапа
- Шаг 3: Вставка модуля и ожидание софт-локапа
- Шаг 4: Проверка логов на наличие сообщений
- Шаг 5: Настройка netconsole для получения логов
- Заключение
Вопрос или проблема
Я тестировал процедуру восстановления после “мягкой блокировки” в ядре Linux. Я установил параметр /proc/sys/kernel/softlockup_panic в 1.
И я создал модуль ядра, как описано в приведенной ниже ссылке. https://github.com/saiyamd/softlockup_test
Когда я вставил модуль, моя система Linux перезагружается после короткого зависания. Если я установлю /proc/sys/kernel/softlockup_panic в 0, моя система Linux остается в состоянии зависания и никогда не перезагружается. Похоже, схема перезагрузки при возникновении мягкой блокировки работает, но я не вижу сообщений в журнале, таких как “BUG: soft lockup – CPU#2 stuck for 20s!”.
Несмотря на то, что происходит перезагрузка, я не совсем уверен, что это правильная процедура тестирования для генерации мягкой блокировки и процедуры восстановления от мягкой блокировки.
Пожалуйста, дайте мне знать, если я делаю что-то неправильно или если вы видите какое-либо мое недопонимание. Спасибо,
softlockup_panic включен
“Восстановление” здесь включает панику ядра и перезагрузку системы. Перезагрузка ожидается, так как параметр установлен на on
.
softlockup_panic выключен
Вы правильно сгенерировали мягкую блокировку. При нормальных обстоятельствах вы бы увидели сообщение, подобное “BUG: soft lockup – CPU#2 stuck for 20s!”. Причина, по которой вы ничего не видите, в том, что ваш модуль ядра вызывает printk в жестком цикле. Предполагая, что вы вообще можете использовать систему при такой высокой нагрузке по вводу-выводу, ваш модуль будет конкурировать с другими потоками ядра за журналы. Поэтому вы не видите никаких сообщений о мягкой блокировке.
Предложенное решение: обновите ваш бесконечный цикл, чтобы использовать переменную-счетчик, чтобы печатать сообщения только каждые X итераций, где X составляет не менее 10,000,000 (<- отчасти произвольное). Пример ниже основан на переполнении беззнакового целого числа.
unsigned int i;
for (i=0; ; i++) {
if (i == 0) {
printk("сообщение\n");
}
}
Если у вас нет последовательной консоли, вы можете использовать netconsole для отслеживания мягкой блокировки.
Синтаксис netconsole:
netconsole=<LOCAL_PORT>@<SENDER_IP_ADDRESS>/<SENDER_INTERFACE>,<REMOTE_PORT>@<RECEIVER_IP_ADDRESS>/<STEP_1_MAC_ADDRESS>
-
Добавьте
netconsole [email protected]/enp0s3,[email protected]/14:ab:c5:83:50:36 loglevel=8
в аргумент загрузки.
Илиsudo modprobe netconsole netconsole="[email protected]/enp0s3,[email protected]/14:ab:c5:83:50:36"
в процессе выполнения.
Илиsudo modprobe netconsole netconsole="6666@/enp0s3,[email protected]/" в процессе выполнения.
-
После загрузки установите
dmesg -n 8
(Чтобы получить обычные сообщения dmesg ядра)
-
На стороне получателя запустите
netcat -l -u 6666
Примечание :
Закомментируйте printk
в цикле while(1), иначе консоль будет затоплена сообщениями. Через 20 секунд или больше вы увидите сообщение о мягкой блокировке. Пример ниже
watchdog: BUG: soft lockup – CPU#0 stuck for 23s! [softlockup_thre:3444]
while(1) {
printk(KERN_INFO “%s:%d\n”,func,LINE);
}
Ответ или решение
Как вызвать софт-локап в ядре Linux и как его проверить
Вам необходимо провести тестирование процедуры восстановления от софт-локапа в ядре Linux, и вы уже сделали шаги к этому, изменив параметры в /proc/sys/kernel/softlockup_panic
и используя модуль ядра. Ниже мы подробно рассмотрим, как правильно генерировать софт-локап, а также способы его верификации.
Шаг 1: Настройка параметров ядра
Для начала, убедитесь, что параметр /proc/sys/kernel/softlockup_panic
установлен в 1
. Это заставит систему перезагрузиться в случае возникновения софт-локапа. Параметр softlockup_panic
устанавливается следующим образом:
echo 1 | sudo tee /proc/sys/kernel/softlockup_panic
Если вы хотите просто протестировать семантику софт-локапа без перезагрузки, установите значение на 0
.
Шаг 2: Создание модуля ядра для генерации софт-локапа
Созданный вами модуль ядра должен содержать бесконечный цикл. Однако, чтобы избежать большого количества операций вывода (IO), которые могут затруднить просмотр логов, было бы целесообразно внедрить счетчик. Например:
#include <linux/module.h>
#include <linux/kernel.h>
#include <linux/init.h>
static int __init softlockup_test_init(void) {
unsigned int i;
for (i = 0; ; i++) {
if (i % 10000000 == 0) {
printk(KERN_INFO "Count: %u\n", i);
}
}
return 0;
}
static void __exit softlockup_test_exit(void) {
printk(KERN_INFO "Module unloaded\n");
}
module_init(softlockup_test_init);
module_exit(softlockup_test_exit);
MODULE_LICENSE("GPL");
Этот код выводит сообщение в лог только каждые 10 миллионов итераций, что снизит нагрузку на систему и позволит избежать конкуренции за вывод логов с другими процессами.
Шаг 3: Вставка модуля и ожидание софт-локапа
После компиляции и вставки модуля используйте insmod
:
sudo insmod softlockup_test.ko
При этом kernel должен начать превышать лимит времени выработки. Если параметр softlockup_panic
установлен в 1
, система должна перезагрузиться без вашего вмешательства.
Шаг 4: Проверка логов на наличие сообщений
Проверить логи на наличие сообщений о софт-локапе можно с помощью dmesg
или journalctl
. Если модуль корректно работает и вызывает софт-локап, вы должны увидеть сообщение примерно следующего содержания:
watchdog: BUG: soft lockup - CPU#0 stuck for 23s! [необходимо_указать_поток_или_параметры]
Чтобы убедиться, что вы видите обновления журнала в реальном времени, настройте netconsole
, если у вас нет доступа к последовательной консоли:
Шаг 5: Настройка netconsole для получения логов
Для того чтобы использовать netconsole, добавьте параметры при загрузке системы. Пример команды может выглядеть следующим образом:
sudo modprobe netconsole netconsole="6666@/enp0s3,<REMOTE_IP_ADDRESS>/YOUR_MAC_ADDRESS"
На принимающей машине запустите программу netcat
:
nc -l -u 6666
Установите уровень логируемых сообщений:
dmesg -n 8
Заключение
Следуя описанным шагам, вы сможете не только генерировать софт-локапы в ядре Linux, но и корректно проверять их. Убедитесь, что ваш модуль отлажен, и учтите необходимость снижения количества выводимых лог-сообщений для корректной работы системы. При правильной настройке вы сможете увидеть ожидаемые сообщения о софт-локапах и подтвердить успешность вашей процедуры восстановления.