Вопрос или проблема
ОС: Nobara Linux 41 (обновлённая версия)
Я обшарил форумы в поисках возможных решений этой проблемы, однако до сих пор не могу её исправить.
У меня есть пользовательская служба, которую я пытаюсь запустить при старте системы, однако она не выполняется при загрузке. Служба отлично работает, когда запускается вручную.
Вот эта служба:
[Unit]
Description=Режим производительности процессора
[Service]
Type=oneshot
ExecStart=bash -c 'cpupower -c all frequency-set -g performance'
Restart=on-failure
[Install]
WantedBy=default.target
Цель этой службы — установить для ядер процессора режим производительности с помощью cpupower.
Когда я запускаю
systemctl status cpuperformance.service
(название службы), я получаю:
Loaded: loaded (/etc/systemd/system/cpuperformance.service; enabled; preset: disabled)
Drop-In: /usr/lib/systemd/system/service.d
└─10-timeout-abort.conf, 50-keep-warm.conf
Active: inactive (dead) since Sun 2025-03-09 22:38:28 CDT; 12min ago
Invocation: 7c187bdfd07c49c48fd6e94ccc34a0e3
Main PID: 1442 (code=exited, status=0/SUCCESS)
Mem peak: 1.3M
CPU: 6ms
Mar 09 22:38:28 HynixPC bash[1442]: Setting cpu: 16
Mar 09 22:38:28 HynixPC bash[1442]: Setting cpu: 17
Mar 09 22:38:28 HynixPC bash[1442]: Setting cpu: 18
Mar 09 22:38:28 HynixPC bash[1442]: Setting cpu: 19
Mar 09 22:38:28 HynixPC bash[1442]: Setting cpu: 20
Mar 09 22:38:28 HynixPC bash[1442]: Setting cpu: 21
Mar 09 22:38:28 HynixPC bash[1442]: Setting cpu: 22
Mar 09 22:38:28 HynixPC bash[1442]: Setting cpu: 23
Mar 09 22:38:28 HynixPC systemd[1]: cpuperformance.service: Deactivated successfully.
Mar 09 22:38:28 HynixPC systemd[1]: Finished cpuperformance.service - CPU Performance Mode.
Это выглядит так, будто служба успешно запустилась при старте, однако если я
cat /sys/devices/system/cpu/cpu*/cpufreq/scaling_governor
, я получаю:
cat /sys/devices/system/cpu/cpu*/cpufreq/scaling_governor
powersave
powersave
powersave
powersave
powersave
powersave
powersave
powersave
powersave
powersave
powersave
powersave
powersave
powersave
powersave
powersave
powersave
powersave
powersave
powersave
powersave
powersave
powersave
powersave
Это показывает, что ядра процессора используют режим энергосбережения (powersave), а не режим производительности (performance), как это должно быть после загрузки с этой службой.
Я протестировал различные цели “WantedBy”, включая basic.target и multi-user.target. Обе они имеют ту же проблему. Каждый раз, когда я вношу изменения в службу, я выполняю sudo systemctl disable cpuperformance.service
-> sudo systemctl daemon-reload
-> sudo system enable cpuperformance.service
.
Вывод при включении службы: Created symlink '/etc/systemd/system/default.target.wants/cpuperformance.service' → '/etc/systemd/system/cpuperformance.service'.
После этого служба всё равно не запускается при старте.
Я нашёл одну подсказку, которая может показать, почему это не работает. Запустив systemctl --user list-dependencies default.target
, я получаю следующий вывод:
default.target
○ ├─drkonqi-coredump-cleanup.service
● ├─drkonqi-sentry-postman.path
● ├─unity-gtk-module.service
● └─basic.target
● ├─systemd-tmpfiles-setup.service
● ├─paths.target
● ├─sockets.target
● │ ├─dbus.socket
● │ ├─drkonqi-coredump-launcher.socket
● │ ├─pipewire-pulse.socket
● │ └─pipewire.socket
● └─timers.target
○ ├─drkonqi-coredump-cleanup.timer
○ ├─drkonqi-sentry-postman.timer
● ├─grub-boot-success.timer
● └─systemd-tmpfiles-clean.timer
Это показывает, что моя пользовательская служба cpuperformance.service не требуется default.target, что мне непонятно, так как моя служба именно это указывает.
У кого-нибудь есть идеи по этому поводу? Я ломаю голову над этим часами. Буду благодарен за любую помощь!
Существует путаница между системными и пользовательскими службами:
systemctl --user list-dependencies default.target
проверяет конфигурацию systemd пользователя, но
/etc/systemd/system/cpuperformance.service
является системной службой.
Служба явно работает. Я предполагаю, что проблема в том, что настройки изменяются (чем-то) после запуска службы. Вы можете проверить это, добавив вторую команду ExecStart
(после первой)
ExecStart=bash -c 'cat /sys/devices/system/cpu/cpu*/cpufreq/scaling_governor >/root/scaling_governor'
и проверить содержимое файла после этого.
Ответ или решение
Причина вашей проблемы в том, что ваш сервис выполняется успешно, но, скорее всего, настройки ЦПУ перезаписываются после завершения работы сервиса. Возможно, в ходе загрузки системы другой процесс устанавливает режим "powersave". Я помогу вам с теоретическими аспектами, приведу примеры и объясню возможные шаги для приложения этой информации.
Теория
Различие между системными и пользовательскими сервисами:
Системное управление сервисами в Linux осуществляется с помощью systemd, который позволяет запускать и управлять сервисами и демонами. В Linux есть два типа служб: системные и пользовательские.
- Системные сервисы находятся в
/etc/systemd/system/
и стартуют для всех пользователей при запуске системы. - Пользовательские сервисы активируются отдельными пользователями и конфигурируются через
~/.config/systemd/user/
.
Ваш сервис cpuperformance.service
был настроен как системный. Это значит, что он стартует от имени системных прав и должен быть в состоянии изменить любые настройки CPU, если они не перезаписываются позже.
Процесс загрузки системы:
Когда вы настраиваете сервис с WantedBy=default.target
, он связывается с определенной стадией загрузки системы. Default.target часто относится к пользовательскому окружению. Системные цели, такие как multi-user.target
, будут уместнее для общесистемных сервисов.
Задержка изменений:
Ваш сервис успешно настраивает режим работы CPU в ‘performance’, но изменения могут перезаписываться в фазе поздней инициализации другими системными сервисами или скриптами, которые выполняются после вашего. Файлы настроек для CPU могут быть включены в такие файловые пакеты, как tmpfiles.d
, которые перезагружают исходные значения частоты CPU.
Пример
Добавление второго этапа в ваш скрипт может помочь выявить проблемы. Например, запишите текущее состояние настроек CPU сразу после их изменения в отдельный файл:
[Service]
Type=oneshot
ExecStart=bash -c 'cpupower -c all frequency-set -g performance'
ExecStart=bash -c 'cat /sys/devices/system/cpu/cpu*/cpufreq/scaling_governor >/root/scaling_governor'
Restart=on-failure
Применение
Для решения проблемы предложу следующие шаги:
-
Проверка конфликтующих сервисов:
- Убедитесь, что никакие другие службы или скрипты не перезаписывают настройки вызовом их после выполнения вашего сервиса. Это можно сделать, просмотрев системные логи с помощью
journalctl
.
- Убедитесь, что никакие другие службы или скрипты не перезаписывают настройки вызовом их после выполнения вашего сервиса. Это можно сделать, просмотрев системные логи с помощью
-
Изменение порядка запуска:
- Задержите выполнение вашего скрипта до полной загрузки системы, добавив зависимости с целями, которые гарантируют, состояние, в котором сервер не будет переписывать настройки. Используйте
After=
в вашем файле сервиса для отсрочки выполнения.
[Unit] Description=CPU Performance Mode After=multi-user.target
- Задержите выполнение вашего скрипта до полной загрузки системы, добавив зависимости с целями, которые гарантируют, состояние, в котором сервер не будет переписывать настройки. Используйте
-
Оптимизация и тестирование:
- Используйте
ExecStartPost=
для выполнения тестирования после изменения параметров CPU и добавьте эти команды в журнал.
ExecStartPost=/usr/bin/logger "CPU governors set to performance"
- Используйте
-
Отладка в режиме загрузки:
- Переключите ваш сервис в
RemainAfterExit=yes
, чтобы оставаться активным после выполнения и вы могли видеть его состояние в любой момент.
- Переключите ваш сервис в
-
Изменение параметров ядра:
- Рассмотрите возможность изменения конфигурации пространства ядра (
/etc/default/grub
), чтобы установить параметры по умолчанию через параметра ядраcpufreq.default_governor=performance
. Обновите GRUB командойsudo grub2-mkconfig -o /boot/grub2/grub.cfg
.
- Рассмотрите возможность изменения конфигурации пространства ядра (
Эти шаги должны помочь вам исправить проблему и установить режим performance
для вашего CPU при загрузке. Убедитесь, что конфигурация настроена правильно и выследите любые возможности перезаписи настроек другими сервисами в системе.