Help us understand the problem. What is going on with this article?

tasksetコマンドの使い方

1 tasksetコマンドとは?

指定したCPUでプロセスを動かすコマンドです。

2 環境

2.1 OS版数

[root@server ~]# cat /etc/redhat-release
CentOS Linux release 7.3.1611 (Core)

[root@server ~]# uname -r
3.10.0-514.el7.x86_64

2.2 ゲストマシンのCPU数

CPUは4つあります。

[root@server ~]# cat /proc/cpuinfo |grep processor
processor       : 0
processor       : 1
processor       : 2
processor       : 3

3 インストール方法

[root@server ~]# yum install util-linux
[root@server ~]# taskset --version
taskset from util-linux 2.23.2

4 使い方

1.指定したCPUでプロセスを動作させる方法(5章で説明)
2.動作中プロセスのCPUを変更する方法(6章で説明)

5 指定したCPUでプロセスを動作させる方法

5.1 単一CPUでプロセスを動かす方法

書式
# taskset -c X <コマンド>
    (*) XはCPUの番号(0,1,2...)を指定する。

stressコマンドの使い方はこちらを参照してください。
psコマンドの使い方はこちらを参照してください。

実行結果(cpu=0で動かした場合)
stressプロセスをCPU=0で動かす。
[root@server ~]# taskset -c 0 stress -c 1 -q &
[1] 1004

stressの親プロセス、子プロセスともにCPU=0(★)で動作していることがわかる。
[root@server ~]#  ps -C stress -o comm,pid,ppid,args,psr
COMMAND            PID   PPID COMMAND                     PSR
stress            1004    835 stress -c 1 -q              ★0  <===親プロセス
stress            1005   1004 stress -c 1 -q              ★0  <===子プロセス

tasksetでもCPUアフィニティが確認できる。親プロセス、子プロセスともにCPU=0で動作する設定であることがわかる。
[root@server ~]# taskset -pc 1004
pid 1004's current affinity list: 0
[root@server ~]# taskset -pc 1005
pid 1005's current affinity list: 0

後始末をする。
[root@server ~]# jobs
[1]+  実行中               taskset -c 0 stress -c 1 -q &
[root@server ~]# kill %1
[root@server ~]#
[1]+  Terminated              taskset -c 0 stress -c 1 -q
実行結果(cpu=3で動かした場合)
stressプロセスをCPU=3で動かす。
[root@server ~]# taskset -c 3 stress -c 1 -q &
[1] 1028

stressの親プロセス、子プロセスともにCPU=3(★)で動作していることがわかる。
[root@server ~]# ps -C stress -o comm,pid,ppid,args,psr
COMMAND            PID   PPID COMMAND                     PSR
stress            1028    835 stress -c 1 -q              ★3
stress            1029   1028 stress -c 1 -q              ★3

tasksetでもCPUアフィニティが確認できる。親プロセス、子プロセスともにCPU=3で動作する設定であることがわかる。
[root@server ~]# taskset -pc 1028
pid 1028's current affinity list: 3
[root@server ~]# taskset -pc 1029
pid 1029's current affinity list: 3

後始末をする。
[root@server ~]# jobs
[1]+  実行中               taskset -c 3 stress -c 1 -q &
[root@server ~]# kill %1
[root@server ~]#
[1]+  Terminated              taskset -c 3 stress -c 1 -q

5.2 指定した複数CPUでプロセスを動かす方法

書式
# taskset -c X,Y,Z... <コマンド>
    (*) X,Y,ZはCPUの番号(0,1,2...)を指定する。
実行結果(cpu=0,2で動かした場合)
stressプロセスをCPU=0,2で動かす。
[root@server ~]# taskset -c 0,2 stress -c 1 -q &
[1] 928

stressの親プロセスがCPU=2、子プロセスがCPU=0で動作していることがわかる。
[root@server ~]# ps -C stress -o comm,pid,ppid,args,psr
COMMAND            PID   PPID COMMAND                     PSR
stress             928    858 stress -c 1 -q                2  <===親プロセス
stress             929    928 stress -c 1 -q                0  <===子プロセス

後始末をする。
[root@server ~]# jobs
[1]+  実行中               taskset -c 0,2 stress -c 1 -q &
[root@server ~]# kill %1
[root@server ~]#
[1]+  Terminated              taskset -c 0,2 stress -c 1 -q

6 動作中プロセスのCPUを変更する方法

stressコマンドを実行する。
[root@server ~]# stress -c 4 -q&
[1] 1127

stressの親プロセスがCPU=2,子プロセスがCPU=0,1,2でそれぞれ動作していることがわかる。
[root@server ~]# ps -C stress -o comm,pid,ppid,args,psr,wchan
COMMAND            PID   PPID COMMAND                     PSR WCHAN
stress            1127    858 stress -c 4 -q                2 wait    <===親プロセス
stress            1128   1127 stress -c 4 -q                0 -       <===子プロセス
stress            1129   1127 stress -c 4 -q                0 -       <===子プロセス
stress            1130   1127 stress -c 4 -q                1 -       <===子プロセス
stress            1131   1127 stress -c 4 -q                2 -       <===子プロセス

子プロセス(PID=1128)をCPU=3で動作するようにCPUアフィニティを変更する。
[root@server ~]# taskset -pc 3 1128
pid 1128's current affinity list: 0-3
pid 1128's new affinity list: 3

子プロセス(PID=1129)をCPU=3で動作するようにCPUアフィニティを変更する。
[root@server ~]# taskset -pc 3 1129
pid 1129's current affinity list: 0-3
pid 1129's new affinity list: 3

子プロセス(PID=1130)をCPU=3で動作するようにCPUアフィニティを変更する。
[root@server ~]# taskset -pc 3 1130
pid 1130's current affinity list: 0-3
pid 1130's new affinity list: 3

子プロセス(PID=1131)をCPU=3で動作するようにCPUアフィニティを変更する。
[root@server ~]# taskset -pc 3 1131
pid 1131's current affinity list: 0-3
pid 1131's new affinity list: 3

プロセスが動作しているCPUを確認する。子プロセスは全てCPU=3で動作していることがわかる。
[root@server ~]# ps -C stress -o comm,pid,ppid,args,psr,wchan
COMMAND            PID   PPID COMMAND                     PSR WCHAN
stress            1127    858 stress -c 4 -q                2 wait
stress            1128   1127 stress -c 4 -q                3 -
stress            1129   1127 stress -c 4 -q                3 -
stress            1130   1127 stress -c 4 -q                3 -
stress            1131   1127 stress -c 4 -q                3 -

次に親プロセスが動作するCPUを変更してみる。現在はCPU=2(★)で動作していることがわかる。
[root@server ~]# ps -C stress -o comm,pid,ppid,args,psr,wchan
COMMAND            PID   PPID COMMAND                     PSR WCHAN
stress            1127    858 stress -c 4 -q              ★2 wait    <===親プロセス
stress            1128   1127 stress -c 4 -q                3 -
stress            1129   1127 stress -c 4 -q                3 -
stress            1130   1127 stress -c 4 -q                3 -
stress            1131   1127 stress -c 4 -q                3 -

親プロセス(PID=1127)をCPU=0で動作するようにCPUアフィニティを変更する。
[root@server ~]# taskset -pc 0 1159
pid 1159's current affinity list: 0-3
pid 1159's new affinity list: 0

親プロセスは、子プロセスの終了を待ってスリープしているので、動作するCPUはCPU=2(★)のままである。
[root@server ~]# ps -C stress -o comm,pid,ppid,args,psr,wchan
COMMAND            PID   PPID COMMAND                     PSR WCHAN
stress            1127    858 stress -c 4 -q              ★2 wait
stress            1128   1127 stress -c 4 -q                3 -
stress            1129   1127 stress -c 4 -q                3 -
stress            1130   1127 stress -c 4 -q                3 -
stress            1131   1127 stress -c 4 -q                3 -

後始末をする。
[root@server ~]# jobs
[1]+  実行中               stress -c 4 -q &
[root@server ~]# kill %1
[root@server ~]#
[1]+  Terminated              stress -c 4 -q

Z 参考情報

Why not register and get more from Qiita?
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away
Comments
No comments
Sign up for free and join this conversation.
If you already have a Qiita account
Why do not you register as a user and use Qiita more conveniently?
You need to log in to use this function. Qiita can be used more conveniently after logging in.
You seem to be reading articles frequently this month. Qiita can be used more conveniently after logging in.
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away
ユーザーは見つかりませんでした