web-dev-qa-db-ja.com

スレッドが実行されているCPUコアを確認するにはどうすればよいですか?

Linuxでは、スレッドのpidが[pid]であると仮定すると、ディレクトリ/ proc/[pid]から多くの有用な情報を取得できます。たとえば、これらのprocファイル、/ proc/[pid]/status、/ proc/[pid]/stat、および/ proc/[pid]/schedstatはすべて便利です。しかし、スレッドが実行されているCPUコア番号を取得するにはどうすればよいですか?スレッドがスリープ状態の場合、再度スケジュールされた後にどのコアが実行されるかを知るにはどうすればよいですか?

ところで、各CPUコアの実行中およびスリープ中のタスクのプロセス(スレッド)リストをダンプする方法はありますか?

46
flypen

以下の回答は、2014年以降は正確ではありません

タスクは特定のコアではスリープしません。また、スケジューラーは、どのコアでスレッドを実行するかを事前に知りません。これは、それらのコアの将来の使用に依存するためです。

必要な情報を取得するには、/ 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_statfs/proc/array.c関数または Documentation/filesystems/stat.txt をご覧ください。

この情報はすべて、入手するまでに陳腐化する可能性があることに注意してください。 proc内のファイルに対してopen呼び出しを行ってから、その呼び出しが返されるまでの間のある時点で真実でした。

31
David Schwartz

「top」コマンドはこれに役立つ場合があります。CPUグループ化されたスレッドのリストはありませんが、スレッドのリスト(おそらく単一プロセス)およびスレッドが実行されているCPUコアを表示できます。

top -H -p {PROC_ID}

その後 f フィールド選択に入る j CPUコア列を有効にする 入る 表示する。

34
maltanar

スレッドは、特定の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\`
12
Monir

次のようなpsも使用できます。

ps -mo pid,tid,%cpu,psr -p `pgrep BINARY-NAME`
9
Dmitry Vyal

これは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
7

受け入れられた答えは正確ではありません。問い合わせの時点でどのCPUがスレッドを実行している(または最後に実行した)かを調べる方法は次のとおりです。

  1. /proc/<pid>/task/<tid>/statを直接読み取ります。その前に、最新のカーネルでフォーマットが変更されていないことを確認してください。ドキュメントは常に最新ではありませんが、少なくとも https://www.kernel.org/doc/Documentation/filesystems/proc.txt を試すことができます。この記事の執筆時点では、最後から14番目の値になります。
  2. psを使用します。 -Fスイッチを指定するか、出力修飾子を使用してコードPSRを追加します。
  3. 最後に使用されたCPU列でtopを使用(fを押すと、列の選択が可能になります)
  4. PROCESSOR列でhtopを使用します(F2を押すとセットアップ画面が表示されます)
2
SergeyA
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 #
0
devOgopan