1. 概要

システム内の各プロセスとスレッドのリソース使用量を知る必要がある状況に陥ることはよくあることです。 たとえば、どのプロセスがシステムの速度を低下させているかを知りたい場合があります。

このチュートリアルでは、topコマンドを使用してこの種の洞察を得る方法を見ていきます。

2. デフォルトのインターフェース

コマンドラインでtopと入力するだけで、 top を使用できます。その後、インタラクティブなインターフェイスが表示されます。

top

top - 04:05:27 up 3 days, 12:02,  1 user,  load average: 0.55, 1.06, 1.27
Tasks: 362 total,   2 running, 290 sleeping,   0 stopped,   0 zombie
%Cpu(s): 35.8 us, 10.7 sy,  0.0 ni, 52.4 id,  0.3 wa,  0.0 hi,  0.7 si,  0.0 st
KiB Mem :  8060436 total,   150704 free,  4438276 used,  3471456 buff/cache
KiB Swap:  2097148 total,  1656152 free,   440996 used.  2557604 avail Mem 

  PID USER      PR  NI    VIRT    RES    SHR S  %CPU %MEM     TIME+ COMMAND
32081 abhishe+  20   0  879676 198164 106096 S 152.6  2.5   0:10.16 chrome
  582 abhishe+  20   0   51448   4088   3372 R  15.8  0.1   0:00.04 top
  503 root     -51   0       0      0      0 S   5.3  0.0  11:05.61 irq/130-iwlwifi
  875 message+  20   0   53120   5900   3204 S   5.3  0.1  10:10.14 dbus-daemon
 6855 abhishe+  20   0 1564544 170444  22924 S   5.3  2.1  75:21.88 deluge-gtk
    1 root      20   0  225840   7200   4720 S   0.0  0.1   4:51.28 systemd
    2 root      20   0       0      0      0 S   0.0  0.0   0:00.20 kthreadd
    4 root       0 -20       0      0      0 I   0.0  0.0   0:00.00 kworker/0:0H
    6 root       0 -20       0      0      0 I   0.0  0.0   0:00.00 mm_percpu_wq

このインタラクティブ画面は、次の4つのセクションに分かれています。

  1. 概要
  2. フィールド/列ヘッダー
  3. 入力/メッセージ行
  4. タスク

2.1. 概要

最初の行は5つのもので構成されています。

  • ウィンドウの名前
  • 現在の時刻
  • 前回の起動からの時間
  • ユーザーの総数、および
  • 過去1、5、および15分間の平均システム負荷
top - 04:05:27 up 3 days, 12:02, 1 user, load average: 0.55, 1.06, 1.27

2行目は、実行中、スリープ中、停止中、およびゾンビの4つのカテゴリに分類されたさまざまなプロセスとスレッドの数を示していることがわかります。

次の行は、CPU状態のパーセンテージ、つまり、ユーザープロセスとカーネルプロセスにかかる時間について示しています。

Tasks: 362 total, 2 running, 290 sleeping, 0 stopped, 0 zombie
%Cpu(s): 35.8 us, 10.7 sy, 0.0 ni, 52.4 id, 0.3 wa, 0.0 hi, 0.7 si, 0.0 st

上記の例でのさまざまな記号の意味は、CPUがさまざまなプロセスを実行するのにかかる時間です。

  • us –ユーザープロセス(ユーザー定義の優先度なしで定義されます– 非ニックユーザープロセス
  • sy –カーネルプロセス
  • ni –優れたユーザープロセス
  • id –カーネルアイドルハンドラー
  • wa – I/O完了
  • hi –ハードウェア割り込み
  • si –ソフトウェア割り込み
  • st –ハイパーバイザーによってこのVMから盗まれた時間

4行目は物理メモリの状態を示していることがわかります。 5行目は仮想メモリについて説明しています。

KiB Mem : 8060436 total, 150704 free, 4438276 used, 3471456 buff/cache
KiB Swap: 2097148 total, 1656152 free, 440996 used. 2557604 avail Mem

3. topヘッダー

上記の例でわかるように、さまざまなプロセスとスレッドのステータスを説明するさまざまなフィールドがあります。

これらのヘッダーの意味を1つずつ学びましょう。

  • PID (プロセスID):task_structによって定義されたタスクの一意のID–カーネルがプロセスを識別するために使用します
  • USER (ユーザー名):タスクの所有者の有効なユーザー名
  • PR (優先度):タスクのスケジューリング優先度。 このフィールドの下のrt値は、タスクがリアルタイムスケジューリングの優先順位付けの下で実行されていることを意味します
  • NI (適切な値):タスクの優先度も示します。 PRNIの違いは、 PR がカーネルから見たプロセスの真の優先順位であるのに対し、NIはカーネルの優先度のヒント。 負のnice値は優先度が高いことを意味し、正のnice値は優先度が低いことを意味します
  • TIME + (CPU時間):タスクが開始されてから使用された合計CPU時間を示し、100分の1秒の粒度で表示されます。
  • COMMAND (コマンド名):タスクの開始に使用するコマンドラインまたは関連するプログラムの名前を表示します

3.1. メモリヘッダー

メモリに関連するさまざまなパラメータを要約するために使用されるヘッダーを以下に説明します。

  • VIRT (KiB単位の仮想メモリサイズ):タスクによって使用される仮想メモリの合計量を示します。 仮想メモリには、すべてのコード、データ、および共有ライブラリが含まれます。 スワップアウトされたページと、マップされたが使用されていないページも含まれます
  • RES (KiB単位の常駐メモリサイズ):タスクが現在使用しているスワップされていない物理メモリを表す仮想メモリ空間( VIRT )のサブセットを表します
  • SHR (KiBの共有メモリサイズ):他のプロセスで使用される可能性のある常駐メモリ( RES )のサブセットを表します
  • %CPU (CPU使用率):最後の画面更新から経過したCPU時間のタスクのシェアを表し、合計CPU時間のパーセンテージとして表されます。 top スレッドモードで実行されていない場合、マルチスレッドプロセスで100% cより大きい値が報告されます。
  • %MEM (メモリ使用量-RES):使用可能な物理メモリのタスクの現在のシェア

4. インタラクティブコマンド

さまざまなコマンドを使用して、topインターフェイスを操作できます。

  • 最も簡単なのは、hボタンを押してヘルプメニューを表示することです。
  • dまたはsボタンを使用して、topのリフレッシュレートを変更できます。 デフォルトのリフレッシュレートは3.0秒です。
  • top インターフェースを終了するには、qボタンを押します。

k ボタンを押すとタスクを強制終了できます。その後、「入力行」がアクティブになり、タスクのPIDを入力する必要があります。

r ボタンを押して、タスクのrenice値を変更することもできます。 その後、そのタスクの PID を入力し、次に renicevalueを入力します。 通常のユーザーはnice値を増やすことしかできず、下げることはできません。

E を押すと、サマリー領域にメモリを表示するために使用する単位をKiBから変更できます。

MiB Mem : 7871.520 total,  995.176 free, 4501.594 used, 2374.750 buff/cache
MiB Swap: 2047.996 total, 1607.332 free,  440.664 used. 2275.230 avail Mem

タスクエリアで使用するメモリユニットを変更するには、eを押します。

22011 abhishe+  20   0 4049.7m 266.1m 138.3m S  13.2  3.4  18:08.67 gnome-shell
  920 cyberea+  20   0 2545.5m 110.4m   8.6m S   7.9  1.4  92:37.54 cybereason-sens
 1554 abhishe+  20   0  489.2m  69.9m  53.0m S   6.6  0.9  97:43.26 Xorg
 6855 abhishe+  20   0 1536.8m 174.6m  21.6m S   6.6  2.2  85:00.29 deluge-gtk
23393 abhishe+  20   0 1689.2m 197.4m  63.4m S   6.0  2.5   3:09.83 _Postman

これらは両方とも、KiBからEiB(エクスビバイト)までのメモリユニットの循環につながります。

4.1. グローバルモード

さまざまな場合に役立つさまざまなモードがあり、その1つがスレッドモードです。

デフォルトでは、topは各プロセスのすべてのスレッドの合計を表示します。 Hボタンを押すと変更できます。 この後、 top は、各プロセスの個々のスレッドを表示します。

  PID USER      PR  NI    VIRT    RES    SHR S %CPU %MEM     TIME+ COMMAND
 6855 abhishe+  20   0 1573660 178760  22124 S  2.6  2.2  45:11.77 deluge-gtk
 6899 abhishe+  20   0 1573660 178760  22124 S  2.3  2.2  37:41.68 deluge-gtk

前の例でわかるように、 deluge という名前のアプリケーションは、基になるスレッドが表示されていないため、一度だけ言及されましたが、この例では、このアプリケーションで使用される2つの異なるスレッドを確認できます。

もう1つのモードはSolarisモードで、Iボタンを押すとオフに切り替えることができます。 このモードで動作している場合、タスクのCPU使用率はCPUの総数で除算されます。

4.2. タスクウィンドウとの相互作用

f ボタンを押すと、表示されるフィールドとその順序を変更できます。 フィールドメニューが開き、表示するフィールド、その順序、フィールドでの並べ替えなどを選択できます。

top によって表示される最も便利なビューの1つは、フォレストビューモードです。 このモードでは、タスクはツリーのように順序付けられ、すべての子タスクはそれぞれの親の下に配置されます。

  PID USER      PR  NI    VIRT    RES    SHR S  %CPU %MEM     TIME+ COMMAND
    1 root      20   0  225840   7196   4716 S   0.0  0.1   5:46.79 systemd
  283 root      19  -1  148972  37300  36300 S   0.0  0.5   0:23.01  `- systemd-journal
  336 root      20   0   47060   4000   2528 S   0.0  0.0   0:01.10  `- systemd-udevd
  862 systemd+  20   0  146112   1276   1208 S   0.0  0.0   0:00.35  `- systemd-timesyn
  864 systemd+  20   0   71072   4556   3916 S   0.0  0.1   0:12.47  `- systemd-resolve
  867 root      20   0   70728   3732   3448 S   0.0  0.0   0:03.05  `- systemd-logind
  871 root      20   0   38428   2748   2652 S   0.0  0.0   0:00.27  `- cron

x キーを使用して、ソートされたフィールドを強調表示できます。 使用できます >> < ソートされたフィールドをそれぞれ右または左に変更します。 一部のフィールドには、並べ替え用の直接キーバインディングがあります。%MEMの場合はM PIDの場合はNPの場合%CPU の場合、 T TIME+の場合。

5. コマンドラインオプション

-b フラグを渡すことにより、バッチモードでtopを使用できます。 バッチモードの場合、topは入力を受け取らず、プログラムが強制終了されるまで実行されます。 これは、topコマンドの出力を他のプログラムまたはファイルに渡す場合に非常に便利です。

反復回数を修正するには、-nフラグを使用できます。

top -b -n10

リフレッシュレートを変更するには、-dフラグを使用できます。 このフラグでは、秒の小数を使用できます。

top -d2.5

top でサポートされているすべての出力フィールドを表示するには、-Oフラグを使用できます。

top -O
PID
PPID
UID
USER
... more output omitted

これらのフィールド名を使用して、 -oフラグの後に並べ替え順序を渡すことができます。 したがって、topの出力を仮想メモリで並べ替える場合は、次を使用できます。

top -o VIRT

  PID USER      PR  NI    VIRT    RES    SHR S  %CPU %MEM     TIME+ COMMAND
23584 abhishe+  20   0 14.593g 554600  58412 S   2.3  6.9  10:25.55 _Postman
22011 abhishe+  20   0 4142400 277884 141424 S   0.7  3.4  22:00.86 gnome-shell
 1183 gdm       20   0 3664328 114104  72160 S   0.0  1.4   6:33.79 gnome-shell
 2008 abhishe+  20   0 2782760  22520  15096 S   0.0  0.3   0:35.15 copyq

次に、 PID 、ユーザーなどに基づいて、さまざまなフィルターを使用してタスクを監視できます。 PID に基づいてタスクをフィルタリングするには、-pフラグを使用して最大20個のPIDを渡すことができます。

top -p23584,22011

PID USER PR NI VIRT RES SHR S %CPU %MEM TIME+ COMMAND
22011 abhishe+ 20 0 4144624 276900 141368 S 6.2 3.4 22:16.92 gnome-shell
23584 abhishe+ 20 0 14.593g 554600 58412 S 0.0 6.9 10:29.91 _Postman

最後に、ユーザーに基づいてフィルタリングするために、-uフラグを使用できます。

top -u root

PID USER      PR  NI    VIRT    RES    SHR S  %CPU %MEM     TIME+ COMMAND
503 root     -51   0       0      0      0 S   6.2  0.0  12:55.09 irq/130-iwlwifi
  1 root      20   0  225840   7196   4716 S   0.0  0.1   5:43.72 systemd

6. 結論

このチュートリアルでは、 top がさまざまなプロセスとスレッドのメモリ使用量を把握し、それらを監視するのにどのように役立つかを見ました。

そのインタラクティブな画面を見て、さまざまなフィールドの意味と使用法を探りました。

また、さまざまな便利なコマンドラインオプションも確認しました。