序文 皆さんは 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 マシンであり、システムが長時間過負荷状態で動作していることがわかります。
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 使用率を示します。
したがって、全体的な 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 時間+ コマンド
計算原理 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 をよろしくお願いいたします。 以下もご興味があるかもしれません:
|
<<: React Native が「NSArray<id<RCTBridgeModule>>型のパラメータを初期化できません」というエラーを報告する (解決方法)
Nginx グローバル変数Nginx には、$variable 名を通じて使用できるグローバル変数が...
SRIOVの導入、VFパススルー構成、パケット転送速度性能テスト目次1. SRIOVの紹介2. 環境...
目次方法1: 関数を直接呼び出す方法2: provide / inject (静的更新) を使用する...
質問docker run コマンドを使用して、tomcat コンテナが正常に追加されました。ポートも...
目次序文問題を見つける解決する追記序文最近、 UIコンポーネントを作成する予定で、 vue 2.xと...
以下のように表示されます。 XML/HTML コードコンテンツをクリップボードにコピー<htm...
ステップ準備した静的リソースファイルを指定されたフォルダに配置しますnginx 設定ファイルを変更す...
Docker-compose デプロイメント構成 Jenkins 1. Docker-compose...
MySQL バージョン: MySQL Community Edition (GPL) ------ ...
目次1. シナリオ2. サンドボックスの基本機能3. iframeの実装4. Webワーカーの実装5...
目次遅延読み込みCSS スタイル: HTML部分:スクリプト部分:要約する遅延読み込み名前の通り、私...
require メソッドの読み込みルールキャッシュからの読み込みを優先するコアモジュールパス形式のモ...
目次1. Vueの初期化vue エントリ ファイルフルバージョンとランタイムバージョンの違い1.1、...
1. Nginxのインストール手順1.1 公式サイトの紹介http://nginx.org/en/d...
1. 背景Sysbench は、システムのハードウェア パフォーマンスをテストできるストレス テスト...