現在どのコアにプロセスが固定されているかを知る方法はありますか?
他のユーザーによって実行されたプロセスも出力にリストされます。
または、プロセスをコアに固定しようとしても、必要なコアにすでにプロセスが固定されている場合は失敗する可能性はありますか?
PS:対象のプロセスは、特定のコアで現在実行されているだけでなく、特定のコアにビンを固定している必要があります
PS:これは重複ではありません。もう1つの質問は、1つのプロセスが1つのCPUを排他的に使用する方法です。ここでは、プロセスが特定のコアに固定されていることを検出する方法を尋ねています(つまり、使用方法ではなく、cpusetが使用されました)。
自分への回答:Linux(およびMacの場合は自作)パッケージのhwlocからのhwloc-bind。 Cf. https://www.open-mpi.org/projects/hwloc/tutorials/20130115-ComPAS-hwloc-tutorial.pdf 一部のドキュメント。
通常の状況下では、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
最初にターミナルを開き、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を目的のコア番号に置き換えます)が割り当てられているものを確認します。
-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。
- 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
プロセスが特定の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
...