我有 raspberri pi 零 WH,它只有 1 个核心。
我有一个循环运行的程序,监听传入的 UDP 数据包并处理它们。对我来说至关重要的是,数据包和进一步的逻辑在 0.025 秒内处理(更清楚地说,存在永恒循环(即使没有数据包到来),无论发生什么,循环都不能超过 0.025 秒)。
如果我从终端运行我的程序,我会相当成功
sudo python3 script.py
但是,如果我使用 systemd 作为 服务 运行它,则该程序似乎没有占用足够的资源。循环未达到 0.025 秒条件。而且从 htop 看来,将我的程序作为服务运行可以减少一个线程(我不能保证这一事实,只是快速观察)。
我没有使用 systemd 服务的经验,所以问题可能出在我的配置上
[Unit]
Description=App
[Service]
ExecStart=sudo /usr/bin/python3 /home/pi/script.py
WorkingDirectory=/home/pi/
Restart=always
User=pi
[Install]
WantedBy=multi-user.target
我的问题是,这个标准行为或 systemd 服务的行为应该与从终端运行的程序相同吗?
作为 systemd 服务运行的脚本完全有可能比直接从终端运行慢 - 可能是由于不同的资源分配。例如,我希望从终端运行的脚本(即由用户显式运行)能够获得更高的优先级,因此与后台处理相比,可以获得更多的资源。
但是,您可以使用 systemd.resource-control 为您的服务分配更多资源,包括 CPU 和 RAM。
例如,您可以尝试将 CPUWeight 从默认值 100 增加到 1,000。
[Service]
CPUWeight = 1000
调整其他参数可能最终会达到你想要的执行时间。请记住,为您的服务提供更多资源可能会影响整个系统的性能。
我遇到了类似的问题,并通过创建“user.service”解决了这个问题。 将单元文件保存在:
/home/$USER/.config/system/user/<xyz>.service
然后通过以下方式启动:
systemctl --user start xyz
性能与通过登录 shell 运行它的性能相同。
在运行 GigE Vision 兼容相机的读取器时发现问题。 该脚本在作为服务运行时丢帧,但通过手动启动或 user.service 不会丢帧 事实证明这些设置是有责任的
[Service]
LimitRTPRIO=99
LimitRTPRIOSoft=99
这是任何用户服务的默认设置。当你为任何常用的 systemd 像这样设置它时,它会表现正常。非用户 systemd 的默认值为零。