スレッド
別名: スレッド数
結論
スレッドは、プロセスの中で個別に進む実行の流れです。プロセスは、複数のスレッドを別々のCPUコアで同時に動かすことができます。アクティビティモニタの“スレッド”の列には、各プロセスがいま持っているスレッドの数が表示されます。
ほとんどのアプリは多くのスレッドを使います。インターフェイスを描画してクリックを処理するスレッドが1つあり、ほかのスレッドがネットワークリクエスト、ファイルアクセス、バックグラウンド処理を担当します。大きなアプリなら、スレッド数が数十あるのは普通です。
スレッドの数は、アプリがどれだけ忙しいかをほとんど示しません。ほとんどのスレッドは待っている時間が大半です。実際の仕事量を測るには、“% CPU”のほうが適しています。
スレッド数を確認できる場所
アクティビティモニタで“CPU”タブをクリックします。“スレッド”の列にプロセスごとの数が表示され、ウインドウ下部にはMac全体のスレッドとプロセスの総数が表示されます。
ターミナルでは、ps -M -p <PID>で1つのプロセスのスレッドを一覧表示できます。
スレッド数の増加が問題になるとき
スレッド数が何時間も頭打ちにならずに増え続けているなら、アプリがスレッドを起動したまま終了させないバグの可能性があります。そのアプリのメモリも増えていたり動作が遅くなっていたりするなら、まずは再起動してみるのが妥当で、開発元に報告するのも役に立ちます。
スレッドが何百もあるアプリがある理由
macOSは、Grand Central Dispatchを通じて、共有のワーカースレッドのプールをアプリに提供しています。アプリが画像のデコードやファイルの読み込みなど小さなタスクを大量に任せると、プールはそれを処理するために大きくなり、後でまた小さくなります。それだけで、忙しいアプリのスレッドが数十増えることがあります。
ブラウザ、チャットアプリ、コードエディタは、たいてい複数のプロセスを動かしていて、それぞれが描画、ネットワーク、オーディオ、スクリプト用のスレッドを持っています。オーディオやビデオのアプリは、再生が待たされないようにスレッドを待機させています。これらを合計すると、1つの大きなアプリで数百のスレッドがあるのも珍しくありません。
kernel_taskは、たいていすべての中で最も多い数を示します。macOSのカーネルとそのドライバが使うスレッドを抱えているためで、問題のサインではありません。
1つのアプリのスレッド数を確認する方法
- アクティビティモニタでプロセスを選択してダブルクリックするか、ツールバーの情報ボタンをクリックします。
- インスペクタウインドウに、そのプロセスの“スレッド”が、“ポート”や“コンテクストスイッチ”と一緒に表示されます。
- ターミナルで
top -l 1 -pid <PID> -stats pid,command,thを実行します。<PID>は、“PID”の列のプロセスIDに置き換えてください。#THの値には、スレッドの総数と、スラッシュの後に実行中のスレッドの数が表示されます。 - すべてのプロセスをスレッド数順に並べるには、
top -o th -stats pid,command,thを実行します。終了するにはqを押します。
スレッド数の普通の値と気にすべき値
総数よりも、時間とともにどちらに動くかが大事です。
- 普通: ウインドウを開く、ダウンロードを始める、書き出しを始めるなどで数が跳ね上がり、作業が終わると元に戻る。
- 普通: 何時間もほぼ同じ値のまま、安定して多い。
- 気にすべき: アプリがアイドル状態でも、1日中増え続けて一度も減らない。
- 気にすべき: スレッド数の増加と同時に、メモリや“ポート”の数も増えている。この組み合わせは、たいていアプリのリークを示しています。
- 気にすべき: 使っていないアプリで、
topのスラッシュの後に表示される実行中のスレッドが多い。頼んでいない仕事をしています。
スレッドとCPUコア
コアよりスレッドが多いのは普通です。macOSは1秒間に何度もコアをスレッド間で切り替えますし、ほとんどのスレッドはどのみち待っています。コアを取り合うのは、実行中のスレッドだけです。
同時に実行できるスレッドの数は、sysctl -n hw.logicalcpuで調べた論理コアの数と同じです。それより多くのスレッドが実行できる状態になると、余った分は待つことになり、その待ちがロードアベレージを押し上げます。
よくある質問
アクティビティモニタの“スレッド”とは?
プロセスが動かしているスレッドの数です。スレッドがあるおかげで、1つのアプリがファイルをダウンロードしながらウインドウを描画するなど、複数のことを同時にこなせます。
スレッド数が多いのは悪いこと?
たいていは問題ありません。大きなアプリには数十から数百のスレッドがあることが多く、そのほとんどはアイドル状態です。注意すべきなのは、止まらずに増え続けるパターンです。
スレッドと、% CPUが100を超えることの関係は?
プロセスが複数のコアを使えるのは、複数のスレッドが同時に仕事をしているときだけです。そうして“% CPU”が100%を超えます。
Macは同時にいくつのスレッドを実行できる?
ある瞬間に実行できるのは、論理コア1つにつき1つです。sysctl -n hw.logicalcpuを実行すると、その数がわかります。スレッドは何千も存在できますが、順番に実行されます。
アプリを終了するとスレッドは解放される?
はい。プロセスが終わると、そのスレッドもすべて終わります。増えすぎたスレッド数をリセットするには、アプリを再起動するのがいちばん手早い方法です。
kernel_taskのスレッドが多いのはなぜ?
kernel_taskはmacOSのカーネルで、そのスレッドにはカーネルとドライバが使うものが含まれます。数が多いのは普通です。
関連項目
アクティビティモニタより優れたものをお探しなら、Mac向けアクティビティモニタの代替アプリのおすすめをご覧ください。用語集のすべての用語も見られます。