Вопрос или проблема
Я работаю с устройством 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
— утилиту, которая управляет ротацией логов. Инструкция по настройке ротации представлена ниже:
-
Откройте файл конфигурации
logrotate
дляrsyslog
:sudo nano /etc/logrotate.d/rsyslog
-
Измените параметры ротации журнала:
Добавьте или измените секцию для/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: сжимать старые журналы для экономии места.
-
Проверьте, что
logrotate
настроен на регулярное выполнение:
Убедитесь, что в/etc/cron.daily/logrotate
настроен запускlogrotate
ежедневно. -
Тестируйте конфигурацию:
Вы можете принудительно запустить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
, позволит вам избежать переполнения логов и эффективно управлять размерами файлов в системе. Такие меры не только помогут вам поддерживать порядок в журнале, но и повысят общую эффективность работы вашей системы.