如何设置特定程序(例如 gzip)的 CPU 关联性以始终在特定核心或多个核心(例如核心 1)上运行?
我读到了有关任务集的内容,但是可以在实际使用程序并创建进程之前使用它吗?
答案1
您无法为可执行文件的所有调用设置关联性。亲和力由内核管理并从父进程继承到子进程,没有任何机制可以在执行可执行文件时更改进程的亲和力。
如果您希望所有调用都gzip
在 CPU 1 上运行,请gzip
在 中的实际脚本之前放置一个名为的包装脚本PATH
,例如~/bin/gzip
:
#!/bin/sh
exec taskset 1 /bin/gzip "$@"
但我觉得这完全没用。显式设置进程的亲和力通常会使速度变慢。有时,将 CPU 密集型任务限制在某些处理器上并让系统更具反应性可能会很有用,尽管nice
总体上通常会做得更好。但是,对可执行文件的所有调用不加区别地执行此操作听起来像是XY问题。
答案2
我有一个单线程进程,我想在指定的核心上专门运行。它进行视频编码(这是 CPU 密集型的),因此不希望其他进程在发生这种情况时对核心周期进行时间切片。我通过将操作系统限制在 (4) 核心 Pi 上的核心 0,1 和 2 来实现这一点。最终结果是核心 3 现在未使用,当任务集将“运动”固定在其上执行,“运动”拥有核心的独占使用权。它经过测试并且效果很好。
我编写的脚本用于将 CPU Affinity 自动化为 SystemD 服务单线程下面提供了流程,可以根据您自己的目的进行相应调整。完成后,只需将其粘贴到文件中,对其进行 chmod 700 即可。希望这可以帮助您解决我必须解决的相同问题 - Terrence Houlahan
#!/bin/bash
# Backup system.conf before we modify it with sed:
cp -p /etc/systemd/system.conf /etc/systemd/system.conf.ORIGINAL
# Default allows OS to use ALL cores- we restrict it to only first 3 of 4 cores:
sed -i "s/#CPUAffinity=1 2/CPUAffinity=0 1 2/" /etc/systemd/system.conf
# We pin process motion to remaining core #3:
cat <<'EOF'> /home/pi/scripts/set-cpu-affinity.sh
#!/bin/bash
# Note: the number following cp is the CPU/core number in this case 3
taskset -cp 3 $(pgrep motion|cut -d ' ' -f2)
EOF
chmod 700 /home/pi/scripts/set-cpu-affinity.sh
chown pi:pi /home/pi/scripts/set-cpu-affinity.sh
# Now we configure script to run as a service to make CPU affinity persistent across reboots:
cat <<EOF> /etc/systemd/system/set-cpu-affinity.service
[Unit]
Description=Set CPU Affinity for the Motion process after it starts on boot
Wants=motion.service
After=motion.service
[Service]
User=root
Group=root
Type=oneshot
ExecStart=/home/pi/scripts/set-cpu-affinity.sh
[Install]
WantedBy=multi-user.target
EOF
chmod 644 /etc/systemd/system/set-cpu-affinity.service
systemctl enable set-cpu-affinity.service
chown -R pi:pi /home/pi