Сообщения printk в драйвере pcie заполняют память.

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

Я работаю с устройством PCIe и соответствующим драйвером ядра PCIe. Назовем его pci_driver.c

pci_driver.c наполнен сообщениями printk, подобными этим:

printk(KERN_INFO "pcie_demo: :RD ADDR:   0x%08X\n",(virt_base+bulk_rw.start_addr));
printk(KERN_WARNING"pcie_demo: %s: Init: Устройство не включено.\n", gDrvrName);

Когда я загружаю драйвер и запускаю приложение, я заметил, что размер файла /var/log/syslograpid быстро увеличивается до 20 ГБ и больше. Я читал в некоторых вопросах, что это указывает на проблему, но на самом деле мое приложение работает без сбоев, так что я думаю, что это не является особой проблемой; скорее, сообщения ядра от printk просто сохраняются в файле syslog и накапливаются очень быстро (что и следовало ожидать от карты PCIe).

На данный момент я очищаю память с помощью этой команды время от времени:

truncate -s 0 /var/log/syslog

и удаляю ротационные файлы: syslog.*

Я пробовал такой подход:
Как мне ограничить размер моего syslog?

Чтобы ограничить размер syslog, но без особого успеха… syslog продолжает расти без каких-либо ограничений.

Что меня интересует, так это устойчивое решение, которое ограничит размер syslog и других файлов журналов в /var/log. Я предпочитаю встроенное решение, а не скрипт, выполняющийся в фоновом режиме.

Большое спасибо.

Да, ваше решение не является устойчивым, поскольку вам постоянно нужно удалять syslog. Сначала давайте убедимся, что вы правильно используете logrotate, прежде чем пробовать другие решения:

В редакторе с правами sudo перейдите в /etc/logrotate.d/rsyslog

например, если мы хотим ротацию каждые 100 МБ, это должно выглядеть так:

/var/log/syslog
{
    size 100M
    rotate 4
    compress
    missingok
    notifempty
    delaycompress
    postrotate
        /usr/lib/rsyslog/rsyslog-rotate
    endscript
}

Мы проверяем, что он запланирован на регулярное выполнение; если нет, добавьте его:

cat /etc/cron.daily/logrotate

Затем мы тестируем, и это должно работать

sudo logrotate -f /etc/logrotate.conf

Ответ или решение

Решение проблемы с переполнением журнала syslog при использовании printk в драйвере PCIe

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

Понимание проблемы

Функция printk в Linux используется для вывода сообщений в системный журнал. Когда количество логируемых сообщений значительно превышает норму, размер файла журнала может быстро расти. Хотя ваше приложение функционирует корректно, чрезмерное использование printk может создавать проблемы с производительностью и занимать значительное количество дискового пространства.

Первоначальные шаги

Для начала убедитесь, что вы используете logrotate — утилиту, которая управляет ротацией логов. Инструкция по настройке ротации представлена ниже:

  1. Откройте файл конфигурации logrotate для rsyslog:

    sudo nano /etc/logrotate.d/rsyslog
  2. Измените параметры ротации журнала:
    Добавьте или измените секцию для /var/log/syslog следующим образом:

    /var/log/syslog {
       size 100M
       rotate 4
       compress
       missingok
       notifempty
       delaycompress
       postrotate
           /usr/lib/rsyslog/rsyslog-rotate
       endscript
    }
    • size 100M: ротация будет происходить при достижении 100 МБ.
    • rotate 4: хранить 4 сжатых ротационных файла.
    • compress: сжимать старые журналы для экономии места.
  3. Проверьте, что logrotate настроен на регулярное выполнение:
    Убедитесь, что в /etc/cron.daily/logrotate настроен запуск logrotate ежедневно.

  4. Тестируйте конфигурацию:
    Вы можете принудительно запустить logrotate для проверки работоспособности:

    sudo logrotate -f /etc/logrotate.conf

Оптимизация использования printk

Кроме настройки логирования, рассмотрите возможность оптимизации количества сообщений printk, чтобы снизить общий объем логируемых данных:

  • Используйте различные уровни важности: Измените уровни логирования с KERN_INFO на менее частые уровни, такие как KERN_DEBUG там, где это возможно, чтобы уменьшить количество записей в системе. Например:

    printk(KERN_DEBUG "pcie_demo (DEBUG): RD ADDR: 0x%08X\n", (virt_base + bulk_rw.start_addr));
  • Условное логирование: Используйте макросы, чтобы выводить информацию только при необходимости (например, для отладки):

    #ifdef DEBUG
    printk(KERN_INFO "pcie_demo: RD ADDR: 0x%08X\n", (virt_base + bulk_rw.start_addr));
    #endif
  • Логируйте только при необходимости: Добавьте условия для вывода сообщений только в случае ошибок или важных событий, например:

    if (!device_enabled) {
      printk(KERN_WARNING "pcie_demo: %s: Init: Device not enabled.\n", gDrvrName);
    }

Заключение

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

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

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