特定のコアまたはマルチコア(たとえば、コア1)で常に実行されるように特定のプログラム(gzipなど)のCPUアフィニティを設定するにはどうすればよいですか?
ワークセットについて読みましたが、実際にプログラムを使用してプロセスを作成する前に使用できますか?
答え1
実行可能ファイルのすべての呼び出しに対してアフィニティを設定することはできません。アフィニティはカーネルによって管理され、親プロセスから子プロセスに継承されます。実行ファイルの実行中にプロセスの好みを変更するメカニズムはありません。
gzip
すべての呼び出しをCPU 1で実行するには、gzip
実際のスクリプトの前に呼び出されるラッパースクリプトを配置します。PATH
たとえば、次のようになります。~/bin/gzip
#!/bin/sh
exec taskset 1 /bin/gzip "$@"
しかし、私はこれが完全に役に立たないと思います。プロセスの好みを明示的に設定すると、速度が遅くなることがよくあります。時には、CPU集約的なタスクを特定のプロセッサに制限し、システムの反応性を向上させることが役に立つかもしれませんが、一般的に全体的に優れたnice
パフォーマンスを発揮します。ただし、実行可能ファイルへのすべての呼び出しに対して無差別にこれを行うことは、次のように聞こえます。XYの問題。
答え2
指定されたコアでのみ実行したいシングルスレッドプロセスがあります。ビデオエンコーディング(CPU集約型)を実行するため、この作業中に他のプロセスがコアサイクルを分割したくありません。私はOSを(4)コアPiのコア0、1、2に制限することでこれを達成しました。最終的な結果は、Core 3が使用されていないことです。ワークセットその上で「Movement」が実行され、「Motion」はそのコアを排他的に使用する権限を持ちます。テストされていて、うまく動作します。
CPUアフィニティを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