我有一个脚本(.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)&
...看起来很有希望。