命令的可交换 属性
Commutative property of the commands
我需要问这个问题只是为了仔细检查答案。
命令的顺序重要吗?例如:
这是命令吗
taskset 0x2 time echo "foo"
等于
time taskset 0x2 echo "foo"
?
我需要知道任务集后面的所有命令是否具有相同的 CPU 亲和力,或者只是紧随其后的命令。
I need to know if all the commands followed by the taskset
will have
the same CPU affinity or just the command immediately after it.
这里有一个小实验:
开始两个BG任务
$ > taskset 0x2 sleep 50 & sleep 60 &
获取他们的 PID
$ > ps
PID TTY TIME CMD
18562 pts/81 00:00:00 bash
20750 pts/81 00:00:00 sleep
20751 pts/81 00:00:00 sleep
20752 pts/81 00:00:00 ps
获取已知PID的CPU亲和度:
$ > taskset -p 20750
pid 20750's current affinity mask: 2
$ > taskset -p 20751
pid 20751's current affinity mask: 3f
所以,似乎 CPU affinity 只为第一个进程设置。
更新(试图解释以下行为):
/usr/bin/time taskset 0x2 sleep 100000
=> 只有 sleep
得到亲和掩码 2
(有点期待!)
taskset 0x2 /usr/bin/time sleep 100000
=> time
和 sleep
都得到亲和掩码 2
(需要说明!)
第二种情况,让我们调用ps -f
获取每个进程的PPID(父PID):
$> taskset 0x2 /usr/bin/time sleep 60 &
[1] 5942
$> ps -f
UID PID PPID C STIME TTY TIME CMD
user 5942 9698 0 18:19 pts/261 00:00:00 /usr/bin/time sleep 60
user 5943 5942 0 18:19 pts/261 00:00:00 sleep 60
user 5944 9698 0 18:19 pts/261 00:00:00 ps -f
user 9509 9508 0 16:19 pts/261 00:00:00 -bash
user 9698 9509 0 16:20 pts/261 00:00:00 bash
$> taskset -p 5942
pid 5942's current affinity mask: 2
$> taskset -p 5943
pid 5943's current affinity mask: 2
可以看出,sleep
的PPID(5942)对应的是/usr/bin/time
的PID(5942)。 IOW sleep
是 (已从 分叉)/usr/bin/time
的子进程。因为任何子进程都会继承父进程的配置,所以 sleep
将与 /usr/bin/time
具有相同的 CPU 亲和力。
您似乎在问两个不同的问题 - "are they equivalent?" 和 "is CPU affinity inherited?"。
首先,您列出的两个命令不是等价的。第一个:
taskset 0x2 time echo "foo"
假设 PATH
和我目前使用的主机的类似设置,相当于:
/bin/taskset 0x2 /usr/bin/time /bin/echo "foo"
生成这样的进程树:
/bin/taskset
|
\- /usr/bin/time
|
\- /bin/echo
第二个:
time taskset 0x2 echo "foo"
相当于 /bin/taskset 0x2 /bin/echo "foo"
由 bash
内置 time
包装,生成此进程树:
/bin/taskset
|
\- /bin/echo
在这种情况下,只有两个外部进程 - time
部分由 bash
在内部处理,而不是调用 /usr/bin/time
。
要回答你的第二个问题,CPU affinity 在 Linux 中继承,因此你的第一个示例会将 /usr/bin/time
和 /bin/echo
绑定到指定的 CPU 套。在第二个示例中,由于 time
是 shell 内置函数,它会受到 bash
本身上设置的任何 CPU 亲和力的影响,而不是 taskset
中的 taskset
当前命令行。
我需要问这个问题只是为了仔细检查答案。
命令的顺序重要吗?例如:
这是命令吗
taskset 0x2 time echo "foo"
等于
time taskset 0x2 echo "foo"
?
我需要知道任务集后面的所有命令是否具有相同的 CPU 亲和力,或者只是紧随其后的命令。
I need to know if all the commands followed by the
taskset
will have the same CPU affinity or just the command immediately after it.
这里有一个小实验:
开始两个BG任务
$ > taskset 0x2 sleep 50 & sleep 60 &
获取他们的 PID
$ > ps
PID TTY TIME CMD
18562 pts/81 00:00:00 bash
20750 pts/81 00:00:00 sleep
20751 pts/81 00:00:00 sleep
20752 pts/81 00:00:00 ps
获取已知PID的CPU亲和度:
$ > taskset -p 20750
pid 20750's current affinity mask: 2
$ > taskset -p 20751
pid 20751's current affinity mask: 3f
所以,似乎 CPU affinity 只为第一个进程设置。
更新(试图解释以下行为):
/usr/bin/time taskset 0x2 sleep 100000
=> 只有sleep
得到亲和掩码2
(有点期待!)taskset 0x2 /usr/bin/time sleep 100000
=>time
和sleep
都得到亲和掩码2
(需要说明!)
第二种情况,让我们调用ps -f
获取每个进程的PPID(父PID):
$> taskset 0x2 /usr/bin/time sleep 60 &
[1] 5942
$> ps -f
UID PID PPID C STIME TTY TIME CMD
user 5942 9698 0 18:19 pts/261 00:00:00 /usr/bin/time sleep 60
user 5943 5942 0 18:19 pts/261 00:00:00 sleep 60
user 5944 9698 0 18:19 pts/261 00:00:00 ps -f
user 9509 9508 0 16:19 pts/261 00:00:00 -bash
user 9698 9509 0 16:20 pts/261 00:00:00 bash
$> taskset -p 5942
pid 5942's current affinity mask: 2
$> taskset -p 5943
pid 5943's current affinity mask: 2
可以看出,sleep
的PPID(5942)对应的是/usr/bin/time
的PID(5942)。 IOW sleep
是 (已从 分叉)/usr/bin/time
的子进程。因为任何子进程都会继承父进程的配置,所以 sleep
将与 /usr/bin/time
具有相同的 CPU 亲和力。
您似乎在问两个不同的问题 - "are they equivalent?" 和 "is CPU affinity inherited?"。
首先,您列出的两个命令不是等价的。第一个:
taskset 0x2 time echo "foo"
假设 PATH
和我目前使用的主机的类似设置,相当于:
/bin/taskset 0x2 /usr/bin/time /bin/echo "foo"
生成这样的进程树:
/bin/taskset
|
\- /usr/bin/time
|
\- /bin/echo
第二个:
time taskset 0x2 echo "foo"
相当于 /bin/taskset 0x2 /bin/echo "foo"
由 bash
内置 time
包装,生成此进程树:
/bin/taskset
|
\- /bin/echo
在这种情况下,只有两个外部进程 - time
部分由 bash
在内部处理,而不是调用 /usr/bin/time
。
要回答你的第二个问题,CPU affinity 在 Linux 中继承,因此你的第一个示例会将 /usr/bin/time
和 /bin/echo
绑定到指定的 CPU 套。在第二个示例中,由于 time
是 shell 内置函数,它会受到 bash
本身上设置的任何 CPU 亲和力的影响,而不是 taskset
中的 taskset
当前命令行。