Как сгенерировать мягкую блокировку в ядре Linux и как это проверить?

Вопрос или проблема

Я тестировал процедуру восстановления после “мягкой блокировки” в ядре 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>
  1. Добавьте

    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]/" в процессе выполнения.
    
  2. После загрузки установите

    dmesg -n 8 
    

    (Чтобы получить обычные сообщения dmesg ядра)

  3. На стороне получателя запустите

    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, но и корректно проверять их. Убедитесь, что ваш модуль отлажен, и учтите необходимость снижения количества выводимых лог-сообщений для корректной работы системы. При правильной настройке вы сможете увидеть ожидаемые сообщения о софт-локапах и подтвердить успешность вашей процедуры восстановления.

Оцените материал
Добавить комментарий

Капча загружается...