Linux:どのプロセスがどのコアに固定されているのか、どうすればわかりますか?

Linux:どのプロセスがどのコアに固定されているのか、どうすればわかりますか?

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

他のユーザーが実行するプロセスも出力にリストする必要があります。

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

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

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

答え1

一般的な状況では、Linuxプロセスは指定されたコアに明示的に固定されず、通常はそうする理由はありませんが、可能です。

tasksetpsフィールドとpsrフィールドを使用してプロセスの優先順位を管理したり、現在どのプロセスがどの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

答え2

まず、端末を開き、すべてのcat /proc/cpuinfoコアを一覧表示します。コア0 = 最初のコア、コア1 = 2番目のコア...

それから

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

どのコア1が割り当てられているかを確認しますCORENUM=(0を必要なコア番号に置き換えます).

答え3

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

この-Fスイッチを使用すると、psプロセスが現在実行されているコア(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環境では、カーネルは意図的に弱い親和性を使用するため、これは頻繁に変更される可能性があります。さらに、トップ実行自体がこれらの弱い親和性を破り、より多くのプロセスが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。以下では、最初の例ではプロセス(sleep)が特定のvCPUに接続されており、2番目の例ではすべてのvCPUで実行できることがわかります。

$ 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
...

引用する

答え4

私の答えは、Linux(およびMac用のhomebrew)パッケージhwlocのhwloc-bindです。参照。https://www.open-mpi.org/projects/hwloc/tutorials/20130115-ComPAS-hwloc-tutorial.pdf一部の文書の場合。

関連情報