Linuxのtopコマンド出力の詳細な説明

Linuxのtopコマンド出力の詳細な説明

序文

皆さんは Linux で top コマンドを使ったことがあると思います。私は Linux に触れて以来、プロセスの CPU と MEM のランキングを表示するために top を使っています。しかし、top コマンドの他の出力結果がわかりません。これらのインジケーターは何を表し、どのような状況で注意を払うべきでしょうか? topコマンドの出力結果の元データと計算原理は何ですか?

デモ環境

# uname -a
Linux VM_1_11_centos 3.10.0-693.el7.x86_64 #1 SMP 火曜 8月22日 21:09:27 UTC 2017 x86_64 x86_64 x86_64 GNU/Linux

トップコマンド

top コマンドは、Linux でよく使用されるパフォーマンス分析ツールです。Windows タスク マネージャーと同様に、システム リソースの使用状況とさまざまなプロセスのリソース使用状況をリアルタイムで表示できます (デフォルトでは 3 秒ごとに更新されます)。

トップ - 11:00:54 54 日間稼働、23:35、ユーザー 6 人、負荷平均: 16.32、18.75、21.04
タスク: 合計 209、実行中 3、スリープ中 205、停止中 0、ゾンビ 1
%CPU: 29.7 us、18.9 sy、0.0 ni、49.3 id、1.7 wa、0.0 hi、0.4 si、0.0 st
KiB メモリ: 合計 32781216、空き 1506220、使用済み 6525496、バフ/キャッシュ 24749500
KiB スワップ: 合計 0、空き 0、使用済み 0。利用可能なメモリ 25607592 

 PID ユーザー PR NI 仮想リソース SHR S %CPU %MEM 時間+ コマンド                                                                                 
ルート 20 0 15.6g 461676 4704 R 198.0 1.4 11:15.26 パイソン                                                                                  
ルート 20 0 9725596 240028 4672 R 113.0 0.7 7:48.49 パイソン                                                                                  
ルート 20 0 6878028 143196 4720 S 82.4 0.4 1:35.03 パイソン

最初のデータ行は uptime コマンドの出力と同等です。 11:00:54 は現在時刻、54 日前、23:55 はシステムが稼働している時間、6 ユーザーは現在 6 人のユーザーがログインしていることを意味します。負荷平均: 16.32、18.75、21.04 はそれぞれシステムの 1 分間の平均負荷、5 分間の平均負荷、15 分間の平均負荷を表します。

負荷平均

負荷平均は、実行中のプロセスの数、実行準備完了 (準備完了状態) のプロセスの数、中断不可能なスリープ状態のプロセスの数など、アクティブなプロセスの平均数を示します。平均負荷数が CPU コア数と完全に等しい場合、各コアが十分に活用されていることがわかります。平均負荷数がコア数より大きい場合、システムが過負荷状態にあることがわかります。通常、コア数の 70% 以上は深刻な過負荷状態であると考えられ、注意が必要です。また、負荷の傾向を見るには、1 分間の平均負荷、5 分間の平均負荷、15 分間の平均負荷を組み合わせる必要があります。1 分間の負荷が比較的高く、5 分間と 15 分間の平均負荷がどちらも比較的低い場合は、瞬間的な増加を示しているため、観察が必要です。 3 つの値がすべて非常に高い場合は、プロセスが CPU を異常に消費しているか、IO 操作が頻繁に行われているかどうかに注意する必要があります。また、システムで実行されているプロセスが多すぎることや、プロセスの切り替えが頻繁であることも原因である可能性があります。例えば、上記のデモ環境は 8 コアの CentOS マシンであり、システムが長時間過負荷状態で動作していることがわかります。

タスク: 合計 214、実行中 4、スリープ中 209、停止中 0、ゾンビ 1

2 行目のタスク情報には、システムで実行されているプロセスの総数とステータスが表示されます。 214 total は、現在システム内に 214 個のユーザー プロセスがあることを意味し、4 running は 4 個のプロセスが実行状態にあることを意味し、209 sleep は 209 個のプロセスがスリープ状態にあることを意味し、0 stopped は 0 個のプロセスが停止状態にあることを意味し、1 zombie は 1 個のゾンビ プロセスがあることを意味します。

ゾンビプロセス

子プロセスが終了したときに、親プロセスが wait()/waitpid() を呼び出して子プロセスの終了を待たないと、ゾンビプロセスが生成されます。その理由は、子プロセスは終了時に実際には終了せず、システム プロセス テーブルにゾンビ プロセス データ構造を残し、親プロセスがクリーンアップするのを待つためです。親プロセスが終了した場合、init プロセスが親プロセスを引き継いで処理します (死体を収集します)。このことから、親プロセスが何もせず終了しない場合は、大量のゾンビプロセスが発生することがわかります。各ゾンビプロセスは、プロセステーブル内のスロットを占有します。ゾンビプロセスが多すぎると、プロセステーブルの容量が制限されるため、システムは新しいプロセスを作成できなくなります。したがって、ゾンビインジケーターが大きすぎる場合は注意が必要です。以下のプロセス詳細情報の S 列はプロセスの実行状態を表し、Z はプロセスがゾンビ プロセスであることを意味します。

ゾンビプロセスを排除する方法:

1. ゾンビ プロセスの親プロセス pid を見つけ (pstress はプロセスの親子関係を表示できます)、kill -9 pid を実行すると、親プロセスが終了した後に init が自動的にゾンビ プロセスをクリーンアップします。 (kill -9 はゾンビプロセスを強制終了しないことに注意してください)

2. システムを再起動します。

%CPU: 31.9 us、30.3 sy、0.0 ni、37.0 id、0.0 wa、0.0 hi、0.8 si、0.0 st

3 行目の %Cpu(s) は全体的な CPU 使用率を示します。

  • usユーザーはユーザーモードでのCPU時間比率を示します
  • syシステムはカーネルモードでのCPU時間の割合を示します
  • ni niceは、低優先度プロセスの実行にCPU時間の割合を示します。
  • id アイドルはアイドルCPU時間比率を示します
  • wa iowaitはIO待機中のCPU時間の割合を示します。
  • hiハード割り込みは、ハード割り込みの処理に使用されるCPU時間の割合を示します。
  • si ソフト割り込みは、ソフト割り込みの処理に費やされたCPU時間の割合を示します。
  • st steal は、現在のシステムが仮想マシンで実行されているときに、他の仮想マシンによって占有されている CPU 時間の割合を示します。

したがって、全体的な CPU 使用率は 1-id になります。 us が非常に高い場合、CPU 時間が主にユーザー コードで消費されており、ユーザー コードを最適化する必要があることが証明されます。 sy が非常に高い場合、頻繁なシステム コールまたは頻繁な CPU 切り替え (プロセス切り替え/スレッド切り替え) によって、カーネルで CPU 時間が消費されていることを意味します。 wa が非常に高い場合、プロセスがディスク IO またはネットワーク IO などの IO 操作を頻繁に実行していることを意味します。 si が非常に高い場合、CPU 時間がソフト割り込みの処理に消費されていることを意味します。ネットワーク パケットの受信と送信はシステムのソフト割り込みをトリガーするため、多数の小さなネットワーク パケットはソフト割り込みの頻繁なトリガーを引き起こします。一般的な SYN Floor は si を非常に高くします。

KiB メモリ: 合計 32781216、空き 663440、使用済み 7354900、バッファ/キャッシュ 24762876
KiB スワップ: 合計 0、空き 0、使用済み 0。利用可能なメモリ 24771700

4 行目と 5 行目にはシステム メモリの使用量が表示されます。単位はKiBです。 totol は合計メモリ、free は未使用のコンテンツ、used は使用済みメモリを表します。 buff はディスク キャッシュの読み取りと書き込みに使用されるメモリを示し、cache はファイル キャッシュの読み取りと書き込みに使用されるメモリを示します。 avail は使用可能なアプリケーション メモリを示します。

スワップの原理は、ディスク領域の一部またはローカル ファイルをメモリとして使用することです。スワップ合計は利用可能なスワップの合計量を示し、スワップフリーは残りの量を示し、使用済みは既に使用された量を示します。 3 つの値がすべて 0 の場合、システムの swap 機能がオフになっていることを意味します。デモ環境は仮想マシンであるため、仮想マシンの swap 機能は一般的にオフになっています。

6 行目以降には、各プロセスの具体的なステータスが表示されます。

PID ユーザー PR NI 仮想リソース SHR S %CPU %MEM 時間+ コマンド
  • PID プロセスID
  • USER プロセス所有者のユーザー名(rootなど)
  • PRプロセスのスケジュールの優先順位
  • NIプロセスのnice値(優先度)。値が小さいほど優先度が高くなります。
  • VIRT プロセスが使用する仮想メモリ
  • RES プロセスが使用する物理メモリ(共有メモリを除く)
  • SHRプロセスが使用する共有メモリ
  • CPU プロセスが使用するCPUの割合
  • MEM プロセスが使用するメモリの割合
  • TIME プロセスが起動されてから使用されたCPU時間の合計
  • COMMAND プロセスの起動コマンド (デフォルトではバイナリのみが表示されますが、top -c を使用するとコマンドラインと起動パラメータを表示できます)

計算原理

top コマンドのさまざまな指標の計算原理を紹介する前に、まず Linux の proc ファイル システムを紹介する必要があります。これは、top コマンドのデータが proc ファイル システムから取得されるためです。 proc ファイルシステムは仮想ファイルシステムであり、Linux カーネルとユーザー間の通信手段です。Linux カーネルは proc ファイルシステムを通じてカーネルの現在の状態をユーザーに伝え、ユーザーは proc を記述することでカーネルの動作を設定することもできます。通常のファイルとは異なり、カーネルの状態は常に変化するため、これらの proc ファイルは動的に作成および変更されます。

top によって表示される CPU インジケーターはすべて /proc/stat ファイルの情報から取得されます。

# cat /proc/stat 
プロセッサ 1151829380 20277 540128095 1909004524 21051740 0 10957596 0 0 0
CPU0 143829475 3918 67658924 235696976 5168514 0 1475030 0 0 0
CPU1 144407338 1966 67616825 236756510 3969110 0 1392212 0 0 0
CPU2 144531920 2287 67567520 238021699 2713175 0 1363460 0 0 0
CPU3 143288938 2366 67474485 239715220 2223739 0 1356698 0 0 0
CPU4 143975390 3159 67394206 239494900 1948424 0 1343261 0 0 0
CPU5 144130685 2212 67538520 239431294 1780756 0 1349882 0 0 0
プロセッサ6 144009592 2175 67536945 239683876 1668203 0 1340087 0 0 0
CPU7 143656038 2193 67340668 240204045 1579816 0 1336963 0 0 0

最初の行は CPU の合計情報を表し、その後に各 CPU の詳細情報が表示されます。

しかし、これらの特定の列の情報は何でしょうか? 答えは man proc で見つけることができます:

ユーザー(1)ユーザーモードで費やされた時間。

nice (2) 低優先度(nice)のユーザーモードで費やされた時間。

システム(3)システムモードで費やされた時間。

アイドル(4)アイドルタスクに費やされた時間。この値はUSER_HZ×2番目のエントリでなければなりません。
      /proc/uptime 疑似ファイル。
iowait (Linux 2.5.41 以降)

     (5)I/Oが完了するまでの待機時間。

irq (Linux 2.6.0-test4 以降)
     (6)時間処理割り込み

softirq (Linux 2.6.0-test4 以降)
     (7)時間処理ソフトIRQ。

盗む (Linux 2.6.11 以降)
     (8)盗まれた時間、これは仮想環境で他のオペレーティングシステムを実行する際に費やされる時間である。
         環境を

ゲスト (Linux 2.6.24 以降)
     (9)Linuxカーネルの制御下にあるゲストオペレーティングシステムの仮想CPUの実行に費やされた時間。

guest_nice (Linux 2.6.33 以降)
      (10)Nicedゲスト(制御下にあるゲストオペレーティングシステム用の仮想CPU)の実行に費やされた時間
         Linux カーネルのトロール)。

つまり、2 列目から順に、user、nice、system、idle、iowait、irq (ハード割り込み)、softirq (ソフト割り込み)、steal、guest、guest_nice の CPU 時間となり、単位は通常 10 ミリ秒です。では、上位の割合はどのように計算されますか?

CPU 時間は累積値であるため、現在の CPU 状況を反映するには時間間隔の差が必要です。top のデフォルトの時間間隔は 3 秒です。例えば、ユーザー値user1と現在の合計CPU時間total1を取ります。

このうち、total は上記の項目の合計に等しくなります。つまり、total=user+nice+system+idle+iowait+irq+softirq+steal+guest+guest_nice です。 3 秒後、別のユーザー値 user2 と合計金額 total2 が取得されます。

この場合、この 3 秒間のユーザーの平均 CPU 使用率は、((user2-user1)/(total2-total1))/3 * 100% になります。また、特定のCPUごとに計算方法も似ています。

上位のメモリ関連インジケーターは、/proc/meminfo ファイルの対応するフィールドを直接読み取ります。

# /proc/meminfo を cat する 
メモリ合計: 32781216 kB
メモリ空き容量: 1043556 kB
利用可能なメモリ: 25108920 kB
バッファ: 427516 kB
キャッシュ: 22084612 kB
スワップキャッシュ: 0 kB
アクティブ: 18640888 kB
非アクティブ: 10534920 kB
アクティブ(匿名): 6664480 kB
非アクティブ(匿名): 412 kB
アクティブ(ファイル): 11976408 kB
非アクティブ(ファイル): 10534508 kB
追放不可能: 4 kB
ロック解除: 4 kB
スワップ合計: 0 kB
スワップフリー: 0 kB
ダーティ: 1092 kB
書き戻し: 0 kB
匿名ページ: 6663764 kB
マップ済み: 347808 kB
メモリ: 1212 kB
スラブ: 2201292 kB
再利用可能: 1957344 kB
S未回収: 243948 kB
カーネルスタック: 73392 kB
ページテーブル: 57300 kB
NFS_不安定: 0 kB
バウンス: 0 kB
ライトバックTmp: 0 kB
コミット制限: 16390608 kB
コミット済み_AS: 42170784 kB
Vmalloc合計: 34359738367 KB
Vmalloc使用: 61924 kB
Vmallocチャンク: 34359625048 KB
ハードウェア破損: 0 kB
AnonHugeページ: 364544 kB
巨大なページの合計: 0
HugePages_無料: 0
巨大ページ_予約: 0
巨大ページ_過剰: 0
巨大ページサイズ: 2048 kB
ダイレクトマップ4k: 376680 kB
ダイレクトマップ2M: 26886144 KB
ダイレクトマップ1G: 8388608 KB

このうち、total は MemTotal に、free は MemFree に、avail は MemAailable にそれぞれ対応します。

要約する

この記事は、top コマンドの出力から始まり、どの指標の異常値に注意する必要があるかを説明し、最後に top コマンドの CPU 計算原理と mem のデータ ソースを紹介します。

さて、今回の記事は以上です。この記事の内容が皆さんの勉強や仕事に少しでも参考になれば幸いです。123WORDPRESS.COM をよろしくお願いいたします。

以下もご興味があるかもしれません:
  • Linux topコマンドの使い方の詳しい説明
  • Linux topコマンドとその出力結果の詳細な説明
  • Linux topコマンドの詳しい説明
  • Linuxのtopコマンドの詳しい説明
  • Linux で top コマンドを使用する際のヒント

<<:  React Native が「NSArray<id<RCTBridgeModule>>型のパラメータを初期化できません」というエラーを報告する (解決方法)

>>:  MySQL のデータ統計に関するヒント

推薦する

スネークゲームのアイデアを実現するためのJavaScript

JavaScriptゲームSnakeの実装アイデア(完全なコード実装)を参考までに説明します。具体...

Ubuntu 18.04 に opencv 3.2.0 をインストールするためのソリューション

opencv.zip をダウンロード依存関係を事前にインストールします。まずダウンロードソースを更新...

K8Sの5つのコントローラーの紹介と使用

目次k8sのコントローラータイプポッドとコントローラの関係デプロイメント(ステートレスアプリケーショ...

Mysql5.7.14 インストールと設定方法操作グラフィックチュートリアル(パスワード問題解決)

この記事は主に、以前のインストール方法を使用して MySQL 5.7.14 をインストールするときに...

MySQL InnoDB アーキテクチャの概要

目次導入1. MySQLデータベースの全体的なアーキテクチャSQL インターフェースパーサーオプティ...

WeChatアプレットは日付と時刻に基づいた並べ替え機能を実装

最近、小さなプログラム プロジェクトを引き継いだのですが、リストを日付と時刻で並べ替えるという要件が...

Ubuntu Linux に Git と GitHub をインストールして使用する

Git 入門Git は、Linux(R) カーネル開発の管理を支援するために 2005 年に Lin...

jQueryカルーセル機能を実装する方法

この記事では、jQueryカルーセル機能の実装コードを参考までに共有します。具体的な内容は次のとおり...

vsftpdで仮想ユーザーログインを設定する方法

yum で vsftpd をインストールします [root@localhost など]# yum -...

MySQL FAQ シリーズ: ibdata1 ファイルのサイズが突然増加しないようにする方法

0. はじめにibdata1 ファイルとは何ですか? ibdata1 は、innodb システム テ...

docker を使用して influxdb と mongo をデプロイするための一般的なコマンド

Docker ベースのデータベースをデプロイするsudo docker pull influxdb ...

Linux で MySQL データベースのスケジュールされたバックアップを実装する簡単な方法

詳細な手順は次のとおりです。 1. ディスク容量を確認します。 [root@localhost バッ...

Docker環境にJenkinsコンテナをインストールする詳細なチュートリアル

推奨される Docker 学習教材: https://www.runoob.com/docker/d...

Docker Desktop で rocketmq をインストールするための非常に詳細なチュートリアル

Dockerデスクトップをインストールするダウンロード先: Docker Desktop for M...

MySQL 4.1/5.0/5.1/5.5/5.6の主な違い

バージョン間でのコマンドの違い: innodb ステータスを表示\G mysql-5.1 エンジン ...