У меня есть скомпилированный исполняемый файл 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.