web-dev-qa-db-ja.com

Linux:どのプロセスがどのコアに固定されているかを知る方法は?

現在どのコアにプロセスが固定されているかを知る方法はありますか?

他のユーザーによって実行されたプロセスも出力にリストされます。

または、プロセスをコアに固定しようとしても、必要なコアにすでにプロセスが固定されている場合は失敗する可能性はありますか?

PS:対象のプロセスは、特定のコアで現在実行されているだけでなく、特定のコアにビンを固定している必要があります

PS:これは重複ではありません。もう1つの質問は、1つのプロセスが1つのCPUを排他的に使用する方法です。ここでは、プロセスが特定のコアに固定されていることを検出する方法を尋ねています(つまり、使用方法ではなく、cpusetが使用されました)。

4
daruma

自分への回答:Linux(およびMacの場合は自作)パッケージのhwlocからのhwloc-bind。 Cf. https://www.open-mpi.org/projects/hwloc/tutorials/20130115-ComPAS-hwloc-tutorial.pdf 一部のドキュメント。

0
daruma

通常の状況下では、Linuxプロセスは特定のコアに明示的に固定されていません。これを行う理由は通常ありませんが、可能です。

tasksetを使用してプロセスアフィニティを管理するか、フィールド 'psr'でpsを使用して、現時点でどのCPUでどのプロセスが実行されているかを表示できます。

プロセス27395の現在のCPUアフィニティを確認します。

$ ps -o psr 27395
PSR
  6

プロセス27395のアフィニティリストを確認します。

$ taskset -pc 27395
pid 27395's current affinity list: 0-7

プロセス27395とCPU 3のアフィニティを設定します

$ taskset -pc 3 27395
pid 27395's current affinity list: 0-7
pid 27395's new affinity list: 3

プロセス27395の現在のCPUアフィニティを確認します。

$ ps -o psr 27395
PSR
  3

プロセスがCPUに固定されているかどうかを確認するには、プロセス識別子をループして、それらに対してtaskset -pを実行します。

$ for pid in $(ps -a -o pid=); do taskset -pc $pid 2>/dev/null; done
pid 1803's current affinity list: 0-7
pid 1812's current affinity list: 0-7
pid 1986's current affinity list: 0-7
pid 2027's current affinity list: 0-7
pid 2075's current affinity list: 0-7
pid 2083's current affinity list: 0-7
pid 2122's current affinity list: 0-7
pid 2180's current affinity list: 0-7
pid 2269's current affinity list: 0-7
pid 2289's current affinity list: 0-7
pid 2291's current affinity list: 0-7
pid 2295's current affinity list: 0-7
pid 2300's current affinity list: 0-7
pid 2302's current affinity list: 0-7
pid 3872's current affinity list: 0-7
pid 4339's current affinity list: 0-7
pid 7301's current affinity list: 0-7
pid 7302's current affinity list: 0-7
pid 7309's current affinity list: 0-7
pid 13972's current affinity list: 0-7
7
Pedro

最初にターミナルを開き、cat /proc/cpuinfoを実行してすべてのコアを一覧表示します。コア0 = 1番目のコア、コア1 = 2番目のコア...

その後

CORENUM=0
ps -e -o pid,psr,cpu,cmd | grep -E  "^[[:space:]][[:digit:]]+[[:space:]]+${CORENUM}"

コア1(CORENUM=の0を目的のコア番号に置き換えます)が割り当てられているものを確認します。

1
Fido-X

現在割り当てられているvCPU

-Fpsに切り替えて、プロセスが現在実行されているコア(vCPU)を確認します。 PSR列は、以下を示します。

$ man ps
...
       psr         PSR       processor that process is currently assigned to.
...

たとえば:

$ ps -Fae | head
UID         PID   PPID  C    SZ   RSS PSR STIME TTY          TIME CMD
root          1      0  0 211946 655576 13 Oct17 ?       00:51:28 /usr/lib/systemd/systemd --system --deserialize 14
root          2      0  0     0     0  16 Oct17 ?        00:00:02 [kthreadd]
root          6      2  0     0     0   0 Oct17 ?        00:50:36 [ksoftirqd/0]
root          7      2  0     0     0   0 Oct17 ?        00:02:04 [migration/0]
root          8      2  0     0     0   0 Oct17 ?        00:00:00 [rcu_bh]
root          9      2  0     0     0   0 Oct17 ?        02:02:22 [rcu_sched]
root         10      2  0     0     0   5 Oct17 ?        00:00:00 [lru-add-drain]
root         11      2  0     0     0   0 Oct17 ?        00:00:10 [watchdog/0]
root         12      2  0     0     0   1 Oct17 ?        00:00:09 [watchdog/1]

同様のことがtopを使用して実行でき、Pフィールドを選択することで追加できます。 f

  1. P-最後に使用されたCPU(SMP)

最後に使用されたプロセッサを表す数値。カーネルが意図的に弱いアフィニティを使用しているため、真のSMP環境では、これは頻繁に変更される可能性があります。また、topを実行するまさにその行為は、この弱いアフィニティを破り、より多くのプロセスがより頻繁にCPUを変更する原因となる可能性があります(CPU時間に対する余分な要求のため)。

例:

Tasks: 623 total,   3 running, 620 sleeping,   0 stopped,   0 zombie
%Cpu(s):  8.7 us, 11.0 sy,  0.0 ni, 79.2 id,  0.1 wa,  0.0 hi,  1.0 si,  0.0 st
KiB Mem : 26397158+total, 18521476+free, 35842280 used, 42914536 buff/cache
KiB Swap:        0 total,        0 free,        0 used. 22101484+avail Mem

   PID USER      PR  NI    VIRT    RES    SHR S  %CPU %MEM     TIME+ COMMAND                                        P
  2061 root      20   0  414648  15104   9068 S  38.6  0.0   2:06.82 sssd_be                                        2
 58915 root      20   0 2366608 130232  12288 S  29.5  0.0 478:46.62 filebeat                                      15
  4851 root      20   0 3740952 125192  18412 S  15.9  0.0   2944:25 metricbeat                                     4
104253 1007430+  20   0   16.0t   2.0g   1.6g S  13.6  0.8 138:59.97 Java                                           3
  7617 root      20   0 5160288 399292  49324 S  11.4  0.2  12066:35 hyperkube                                      5
100062 1002840+  20   0   52440  17892   3800 R  11.4  0.0   0:00.34 cub                                            8
100202 smingol+  20   0  172872   2984   1712 R  11.4  0.0   0:00.09 top                                            8
112115 1007680+  20   0 5747228   1.2g  23428 S  11.4  0.5   1457:10 Java                                          11
  2645 root      20   0 5425332 253544  18132 S   9.1  0.1   4549:50 dockerd-current                               12

CPUアフィニティ

プロセスが特定のvCPUに対して持つ可能性のあるアフィニティに関心がある場合は、tasksetを使用できます。以下では、1番目の例で特定のvCPUにアフィニティ化され、2番目の任意のvCPUで実行できるプロセス(sleep)を確認できます。

$ taskset -c 0,2,4,6 sleep 10000 &
[1] 119472
$ taskset -cp 119472
pid 119472's current affinity list: 0,2,4,6

$ sleep 10001  &
[2] 85436
$ taskset -cp 85436
pid 85436's current affinity list: 0-71

ボックス上のすべてのプロセスを表示するには:

$ ps -ae -o pid= | xargs -n 1 taskset -cp
pid 116921's current affinity list: 47
pid 117171's current affinity list: 0-71
pid 117189's current affinity list: 0-71
pid 117248's current affinity list: 36
pid 117665's current affinity list: 0-71
pid 117681's current affinity list: 10
pid 118635's current affinity list: 0-71
pid 118665's current affinity list: 0-71
pid 118873's current affinity list: 44
pid 119472's current affinity list: 0,2,4,6
...

参考文献

1
slm