在启动 shell 脚本时设置进程的亲和力

在启动 shell 脚本时设置进程的亲和力

我有一个脚本(.sh),我可以在其中启动这样的应用程序

#!/bin/sh
./application1 configuration1.cfg  param1 param2 param3 &

sleep 2

./application2 configuration2.cfg  param1 param2 param3 &

sleep 2

ETC

有没有一种方法可以在启动进程时分配 CPU 关联性?

事后我真的不想这样做。我可以通过 C++ 以编程方式完成此操作,但 shell 似乎是最好的方法。

那么,一旦启动,我如何验证它确实粘在该 CPU/核心上?

答案1

有一个实用程序,taskset,util-linux 的一部分,就是为了这个目的。例如:

taskset -c 0-15 script

将运行script并限制它仅使用 ID 为 0 到 15 的 CPU。

要检查您的脚本是否确实被限制在正确的 CPU 上运行,您可以查看该文件/proc/<pid>/status:它将包含名为Cpus_allowed(位图;如果允许 CPU 0,则设置最低有效位)和Cpus_allowed_list(CPU ID 列表)的条目)。

答案2

我自己正处于“学习经验”中期,但这可能是相关的。

要在特定 cpu 上在后台运行 bash 脚本,请尝试:

taskset -c 1 ./myScript &

在 myScript 中包括以下行:

echo MyScript: $$\($BASHPID\) taskset -cp $BASHPID

$BASHPID 对我来说是新的,它是:“当前 Bash 进程的进程 ID。在某些情况下,这可能与 $$ 不同。”

就我个人而言,我正在努力在特定 cpu 上在后台运行 bash 函数。

taskset -c 1 ./myFunction &

...给了我:任务集:无法执行 myFunction:没有这样的文件或目录

在经历了一些错误的开始之后

(taskset -cp 1 $BASHPID;myFunction)&

...看起来很有希望。

相关内容