Процесс, запущенный как демон systemd, имеет высокую загрузку ЦП

Процесс, запущенный как демон systemd, имеет высокую загрузку ЦП

У меня есть скомпилированный исполняемый файл C++, programкоторый можно запустить как фоновый процесс через systemd.

Его также можно запустить как обычный процесс через командную строку (используется в основном для отладки).

Процесс выполняет обычные операции ввода-вывода между другими приложениями и внешним устройством. Связь с устройством происходит через TCP/IP ethernet, в то время как связь приложений представляет собой межпроцессную связь.

Проблема в том, что приложение, запущенное как автономный исполняемый файл, использует около 0,7% - 1,3% ресурсов ЦП.

Когда то же самое приложение запускается как фоновый процесс systemd, использование CPU% подскакивает до максимума, CPUQuotaразрешенного в конфигурациях. В этом случае мы установили его на 5%.

Почему это? Что-то происходит в systemd, вызывая эту проблему? Единственное различие с точки зрения кода между запуском в качестве приложения или демона заключается в том, что при запуске в качестве демона мы отправляем сердечный ритм с интервалами отправки.

решение1

Примените эти настройки:

1. Измените планировщик ввода-вывода на mq-deadline, как показано:

Убедитесь, чтопланировщик mq-deadlineзагружается при запуске путем добавления записи для него в /etc/modules-load.d/modules.conf:

echo mq-deadline >> /etc/modules-load.d/modules.conf

Затем отредактируйте /etc/default/grubи убедитесь, что планировщик крайнего срока для нескольких очередей включен:

GRUB_CMDLINE_LINUX_DEFAULT="scsi_mod.use_blk_mq=1 elevator=mq-deadline"

Когда закончите, выдайте:

sudo update-grub

Затем перезагрузитесь. Обратите внимание, чтоПланировщики с одной очередью были удалены, начиная с Linux 5.x.

Цель этого — гарантировать, что CFQ (Completely Fair Queuing) переопределен. Это может быть планировщик по умолчанию в вашем дистрибутиве Linux, хотя в последнее времянравится OpenSUSEначали устанавливать multi-queue deadline scheduler как default. Главное преимущество multi-queue deadline scheduler — это его очень низкая нагрузка на процессор.

2. Самое важное:Отключите функцию автогруппировки (которая включена по умолчанию) и измените значение(я) переменной sched_migration_cost в /etc/sysctl.conf.

Вставьте эти строки в /etc/sysctl.conf:

kernel.sched_autogroup_enabled=0
kernel.sched_migration_cost_ns = 5000000

Затем запустите sysctl -pи перезагрузите.

Я столкнулся с похожей проблемой некоторое время назад в производстве, которая была исправлена ​​с помощью настроек выше. Объяснения различных опций вэтотТема была чрезвычайно полезна, как и продолжениеаналогичный случай с Proxmox.

Связанный контент