Linuxでは、スレッドのpidが[pid]であると仮定すると、ディレクトリ/ proc/[pid]から多くの有用な情報を取得できます。たとえば、これらのprocファイル、/ proc/[pid]/status、/ proc/[pid]/stat、および/ proc/[pid]/schedstatはすべて便利です。しかし、スレッドが実行されているCPUコア番号を取得するにはどうすればよいですか?スレッドがスリープ状態の場合、再度スケジュールされた後にどのコアが実行されるかを知るにはどうすればよいですか?
ところで、各CPUコアの実行中およびスリープ中のタスクのプロセス(スレッド)リストをダンプする方法はありますか?
タスクは特定のコアではスリープしません。また、スケジューラーは、どのコアでスレッドを実行するかを事前に知りません。これは、それらのコアの将来の使用に依存するためです。
必要な情報を取得するには、/ proc/<pid>/task/<tid>/statusを調べます。スレッドが実行されている場合、3番目のフィールドは「R」になります。最後のフィールドの6番目は、スレッドが現在実行されているコア、または現在実行されていない場合は最後に実行された(または移行された)コアになります。
31466(bc)[〜#〜] s [〜#〜]31348 31466 31348 34819 31466 4202496 2557 0 0 0 5006 16 0 0 20 0 1 0 10196934 121827328 1091 18446744073709551615 4194304 4271839 140737264235072 140737264232056 217976807456 0 0 0 137912326 18446744071581662243 0 0 1730 0 0 0 0
現在実行されていません。最後はコア3で実行されました。
31466(bc)[〜#〜] r [〜#〜]31348 31466 31348 34819 31466 4202496 2557 0 0 0 3818 12 0 0 20 0 1 0 10196934 121827328 1091 18446744073709551615 4194304 4271839 140737264235072 140737264231824 4235516 0 0 0 2 0 0 0 1720 0 0 0 0
現在、コア2で実行されています。
残りのフィールドの意味を確認するには、Linuxカーネルソース、特にdo_task_stat
のfs/proc/array.c
関数または Documentation/filesystems/stat.txt
をご覧ください。
この情報はすべて、入手するまでに陳腐化する可能性があることに注意してください。 proc内のファイルに対してopen
呼び出しを行ってから、その呼び出しが返されるまでの間のある時点で真実でした。
「top」コマンドはこれに役立つ場合があります。CPUグループ化されたスレッドのリストはありませんが、スレッドのリスト(おそらく単一プロセス)およびスレッドが実行されているCPUコアを表示できます。
top -H -p {PROC_ID}
その後 f フィールド選択に入る j CPUコア列を有効にする 入る 表示する。
スレッドは、特定の1つのコアをバインドするために必要ではありません(固定していない場合)。したがって、使用できるコアの継続的な切り替えを確認するには(Dmitryの修正された回答):
watch -tdn0.5 ps -mo pid,tid,%cpu,psr -p \`pgrep BINARY-NAME\`
例えば:
watch -tdn0.5 ps -mo pid,tid,%cpu,psr -p \`pgrep firefox\`
次のようなps
も使用できます。
ps -mo pid,tid,%cpu,psr -p `pgrep BINARY-NAME`
これはtop
コマンドで実行できます。デフォルトのtop
コマンド出力には、これらの詳細は表示されません。この詳細を表示するには、を押す必要があります f トップコマンドインターフェイスでキーを押してから j(押す Enter 押した後のキー j)。これで、出力にはプロセスに関する詳細と実行中のプロセッサが表示されます。出力例を以下に示します。
top - 04:24:03 up 96 days, 13:41, 1 user, load average: 0.11, 0.14, 0.15
Tasks: 173 total, 1 running, 172 sleeping, 0 stopped, 0 zombie
Cpu(s): 7.1%us, 0.2%sy, 0.0%ni, 88.4%id, 0.1%wa, 0.0%hi, 0.0%si, 4.2%st
Mem: 1011048k total, 950984k used, 60064k free, 9320k buffers
Swap: 524284k total, 113160k used, 411124k free, 96420k cached
PID USER PR NI VIRT RES SHR S %CPU %MEM TIME+ P COMMAND
12426 nginx 20 0 345m 47m 29m S 77.6 4.8 40:24.92 7 php-fpm
6685 mysql 20 0 3633m 34m 2932 S 4.3 3.5 63:12.91 4 mysqld
19014 root 20 0 15084 1188 856 R 1.3 0.1 0:01.20 4 top
9 root 20 0 0 0 0 S 1.0 0.0 129:42.53 1 rcu_sched
6349 memcache 20 0 355m 12m 224 S 0.3 1.2 9:34.82 6 memcached
1 root 20 0 19404 212 36 S 0.0 0.0 0:20.64 3 init
2 root 20 0 0 0 0 S 0.0 0.0 0:30.02 4 kthreadd
3 root 20 0 0 0 0 S 0.0 0.0 0:12.45 0 ksoftirqd/0
出力のP
列は、プロセスが現在実行されているプロセッサコア番号を示します。これを数分間監視すると、pidがプロセッサコアを切り替えていることがわかります。アフィニティを設定したpidが特定のコアでのみ実行されているかどうかも確認できます
top
f ナビゲーション画面 (ライブシステムの例) :Fields Management for window 1:Def, whose current sort field is forest view
Navigate with Up/Dn, Right selects for move then <Enter> or Left commits,
'd' or <Space> toggles display, 's' sets sort. Use 'q' or <Esc> to end!
* PID = Process Id
* USER = Effective User Name
* PR = Priority
* NI = Nice Value
* VIRT = Virtual Image (KiB)
* RES = Resident Size (KiB)
* SHR = Shared Memory (KiB)
* S = Process Status
* %CPU = CPU Usage
* %MEM = Memory Usage (RES)
* TIME+ = CPU Time, hundredths
* COMMAND = Command Name/Line
PPID = Parent Process pid
UID = Effective User Id
RUID = Real User Id
RUSER = Real User Name
SUID = Saved User Id
SUSER = Saved User Name
GID = Group Id
GROUP = Group Name
PGRP = Process Group Id
TTY = Controlling Tty
TPGID = Tty Process Grp Id
SID = Session Id
nTH = Number of Threads
* P = Last Used Cpu (SMP)
TIME = CPU Time
SWAP = Swapped Size (KiB)
CODE = Code Size (KiB)
DATA = Data+Stack (KiB)
nMaj = Major Page Faults
nMin = Minor Page Faults
nDRT = Dirty Pages Count
WCHAN = Sleeping in Function
Flags = Task Flags <sched.h>
CGROUPS = Control Groups
SUPGIDS = Supp Groups IDs
SUPGRPS = Supp Groups Names
TGID = Thread Group Id
ENVIRON = Environment vars
vMj = Major Faults delta
vMn = Minor Faults delta
USED = Res+Swap Size (KiB)
nsIPC = IPC namespace Inode
nsMNT = MNT namespace Inode
nsNET = NET namespace Inode
nsPID = PID namespace Inode
nsUSER = USER namespace Inode
nsUTS = UTS namespace Inode
受け入れられた答えは正確ではありません。問い合わせの時点でどのCPUがスレッドを実行している(または最後に実行した)かを調べる方法は次のとおりです。
/proc/<pid>/task/<tid>/stat
を直接読み取ります。その前に、最新のカーネルでフォーマットが変更されていないことを確認してください。ドキュメントは常に最新ではありませんが、少なくとも https://www.kernel.org/doc/Documentation/filesystems/proc.txt を試すことができます。この記事の執筆時点では、最後から14番目の値になります。ps
を使用します。 -F
スイッチを指定するか、出力修飾子を使用してコードPSR
を追加します。f
を押すと、列の選択が可能になります)F2
を押すとセットアップ画面が表示されます)To see the threads of a process :
ps -T -p PID
To see the thread run info
ps -mo pid,tid,%cpu,psr -p PID
Example :
/tmp # ps -T -p 3725
PID SPID TTY TIME CMD
3725 3725 ? 00:00:00 Apps
3725 3732 ? 00:00:10 t9xz1d920
3725 3738 ? 00:00:00 XTimer
3725 3739 ? 00:00:05 Japps
3725 4017 ? 00:00:00 QTask
3725 4024 ? 00:00:00 Kapps
3725 4025 ? 00:00:17 PTimer
3725 4026 ? 00:01:17 PTask
3725 4027 ? 00:00:00 RTask
3725 4028 ? 00:00:00 Recv
3725 4029 ? 00:00:00 QTimer
3725 4033 ? 00:00:01 STask
3725 4034 ? 00:00:02 XTask
3725 4035 ? 00:00:01 QTimer
3725 4036 ? 00:00:00 RTimer
3725 4145 ? 00:00:00 t9xz1d920
3725 4147 ? 00:00:02 t9xz1d920
3725 4148 ? 00:00:00 t9xz1d920
3725 4149 ? 00:00:00 t9xz1d920
3725 4150 ? 00:00:00 t9xz1d920
3725 4865 ? 00:00:02 STimer
/tmp #
/tmp #
/tmp # ps -mo pid,tid,%cpu,psr -p 3725
PID TID %CPU PSR
3725 - 1.1 -
- 3725 0.0 2
- 3732 0.1 0
- 3738 0.0 0
- 3739 0.0 0
- 4017 0.0 6
- 4024 0.0 3
- 4025 0.1 0
- 4026 0.7 0
- 4027 0.0 3
- 4028 0.0 7
- 4029 0.0 0
- 4033 0.0 4
- 4034 0.0 1
- 4035 0.0 0
- 4036 0.0 2
- 4145 0.0 2
- 4147 0.0 0
- 4148 0.0 5
- 4149 0.0 2
- 4150 0.0 7
- 4865 0.0 0
/tmp #