システム監視とGo言語コレクションコードについて

実稼働環境では、システムのクラッシュを引き起こす CPU、メモリ、ハードディスクなどのハードウェアの問題などの問題の発生を防ぐために、システムのパフォーマンスを随時収集する必要がある場合があります。 Linux では次のコマンドが使用できます。
ここに画像の説明を挿入

CPU監視コマンドの先頭コマンド

  1. 概要:
    top コマンドは、Linux でよく使用されるパフォーマンス分析ツールで、Windows のタスク マネージャーと同様に、システム内の各プロセスのリソース使用状況をリアルタイムで表示できます。詳しい使い方は以下の通りです。
    top は動的な表示プロセスです。つまり、ユーザーのキーを押すことで現在の状態を継続的に更新できます。コマンドがフォアグラウンドで実行されると、ユーザーがプログラムを終了するまでフォアグラウンドを独占します。より正確には、top コマンドは、システムのプロセッサ ステータス監視のリアルタイム ビューを提供します。システム内で最も CPU に依存するタスクのリストが表示されます。このコマンドは、CPU 使用率、メモリ使用率、および実行時間によってタスクを並べ替えることができます。このコマンドの多くの機能は、コマンドには、対話型コマンドを使用するか、個人用カスタマイズ ファイルに設定してアクセスできます。

  2. コマンド形式:
    top [パラメータ]

  3. コマンド機能:
    プロセスID、メモリ使用率、CPU使用率など、システムが現在実行しているプロセスの関連情報を表示します。

  4. コマンドパラメータ:
    -b バッチ処理
    -c 完全ガバナンス表示コマンド
    -I 失敗プロセス無視
    -s 機密モード
    -S 蓄積モード
    -i<時間> 間隔時間を設定
    -u<ユーザー名> ユーザー名を指定
    -p<プロセス番号> 指定
    プロセス -n<回数> がループ内で表示される回数

  5. 使用例:
    01
    例1:プロセス情報の表示:
    コマンド:top
    出力:
    ここに画像の説明を挿入

手順:
1. システム稼働時間と平均負荷:

top コマンドの先頭には、uptime コマンドと同様の出力が表示されます。
これらのフィールドには、
現在時刻、システムの実行時間、現在ログインしているユーザーの数、および過去 5 年間の対応する負荷平均が表示されます。 、10分、15分。
稼働時間の表示は、「l」コマンドを使用して切り替えることができます。
22:46:38 — 現在のシステム時刻
0 日、3:59 — システムは 3 時間 59 分間実行されています (この期間中は再起動しませんでした)
3 ユーザー — 現在システム
ロード アベレージにログインしているユーザーは 2 人です。 0.01、0.02、0.00 — 負荷平均の後ろにある 3 つの数値は、それぞれ 5 分、10 分、15 分の負荷条件を表します。
負荷平均データは、5 秒ごとにアクティブなプロセスの数を確認し、特定のアルゴリズムに従って計算された値です。この数値を論理 CPU の数で割った場合、結果が 5 より大きい場合は、システムが過負荷になっていることを示します。

2. タスク:
ここに画像の説明を挿入

タスク — タスク (プロセス)、システムには現在合計 146 個のプロセスがあり、そのうち 1 個が実行中、145 個がスリープ (スリープ)、0 個が停止状態、0 個がゾンビ状態 (ゾンビ) です。
2 行目は、タスクまたはプロセスの概要を示します。プロセスはさまざまな状態になる可能性があります。全プロセス数を表示します。これに加えて、実行中、スリープ中、停止中、ゾンビ プロセスの数もあります (ゾンビはプロセスの状態です)。これらのプロセスの概要情報は「t」で切り替えることができます。

3. CPU ステータス:
ここに画像の説明を挿入

これは、さまざまなモードでの CPU 時間の割合を示しています。これらのさまざまな CPU 時間は次のことを表します:
us、user: 実行中の CPU 時間 (未調整優先度) ユーザー プロセス
sy、system: 実行中のカーネル プロセスの CPU 時間
ni、niced: 実行中の CPU 時間 wa調整された優先順位を持つユーザープロセス
、IO wait: IO 完了を待機する CPU 時間
hi: ハードウェア割り込みを処理する CPU 時間
si: ソフトウェア割り込みを処理する CPU 時間
st: ハイパーバイザーによってこの仮想マシンによって盗まれた CPU 時間 (注釈:現在ハイパーバイザーの下にあります。実際、ハイパーバイザーも CPU 処理時間の一部を消費します)。
表示は「t」コマンドを使用して切り替えることができます。
0.3% us — ユーザー領域が占有する CPU の割合。
0.7% sy — カーネル空間が占める CPU の割合。
0.0% ni — 優先度が変更されたプロセスによって占有されている CPU の割合
99.0% id — アイドル状態の CPU の割合
0.0% wa — IO 待機中に占有されている CPU の割合
0.0% hi — ハードウェア IRQ によって占有されている CPU の割合
si — ソフト割り込み (ソフトウェア割り込み) は CPU の割合を占めます。
ここでの CPU 使用率は Windows の概念とは異なります。ユーザー空間とカーネル空間を理解していない場合は、再充電する必要があります。

4. メモリ使用量:
ここに画像の説明を挿入

次の 2 行は、「free」コマンドのようなメモリ使用量を示しています。1 行目は物理メモリの使用量、2 行目は仮想メモリの使用量 (スワップ領域) です。
物理メモリは、使用可能なメモリの合計、使用済みメモリ、空きメモリ、バッファ メモリとして表示されます。同様に、「スワップ」セクションには、「すべて」、「使用済み」、「空き」、および「バッファー付き」スワップ領域が表示されます。
メモリ表示は「m」コマンドで切り替えることができます。
total 1004348k — 物理メモリの合計 (1004M)
938408k used — 使用中のメモリの合計量 (938M)
65940k free — 空きメモリの合計量 (65M)
44344k バッファ — キャッシュされたメモリの量 (44M)
スワップ スワップ パーティション
合計 2031612k — スワップ領域Total (2031M)
4k used - 使用されているスワップ領域の合計量 (4k)
2031608k free - 空きスワップ領域の合計量 (2031M)
538676k cached - バッファリングされたスワップ領域の合計量 (538M)

5. 各プロセス(タスク)の状態監視:
ここに画像の説明を挿入

PID: プロセス ID、プロセスの一意の識別子
USER: プロセス所有者の実際のユーザー名。
PR: プロセスのスケジュール優先度。このフィールドの一部の値は「rt」です。これは、これらのプロセスがリアルタイムで実行されることを意味します。
NI: プロセスの適切な値 (優先度)。値が小さいほど優先度が高くなります。負の値は優先度が高いことを示し、正の値は優先度が低いことを示します
。 VIRT: プロセスによって使用される仮想メモリ。プロセスによって使用される仮想メモリの合計量 (kb 単位)。VIRT=SWAP+RES
RES: 常駐メモリのサイズ。常駐メモリは、タスクによって使用されるスワップされていない物理メモリの量です。プロセスによって使用され、スワップアウトされなかった物理メモリ サイズ (kb 単位)。RES=CODE+DATA
SHR: SHR は、プロセスによって使用される共有メモリです。共有メモリサイズ、単位はkb
S: プロセスの状態です。次のようなさまざまな値があります:
D - 中断できないスリープ状態。
R - 実行中
S - スリープ中
T - 追跡または停止
Z - ゾンビ
%CPU: 前回の更新以降にタスクによって使用された CPU 時間の割合。
%MEM: プロセスによって使用される利用可能な物理メモリの割合。
TIME+: タスクの開始以降に使用された合計 CPU 時間 (100 分の 1 秒の精度)。
COMMAND: プロセスの実行に使用されるコマンド。プロセス名 (コマンド名/コマンド ライン) に
も、デフォルトでは表示されない多くの出力があり、プロセスのページ フォールト、有効なグループとグループ ID、その他の詳細情報を表示できます。

6. その他の使用スキル:
6.1. マルチ U マルチコア CPU の監視
上部の基本ビューで、キーボード番号「1」を押して、各論理 CPU のステータスを監視します。
ここに画像の説明を挿入

6.2. 現在実行中のプロセスを強調表示する
キーボードの「b」を押すと (強調表示効果のオン/オフを切り替えます)、上部の表示が次のように変わります。
ここに画像の説明を挿入

プロセス ID 7600 の「トップ」プロセスが強調表示されていることがわかりました。トップ プロセスは、ビューの 2 行目に表示される唯一の実行中のプロセスです。「y」キーを押すと、実行中のプロセスを閉じたり開いたりできます。強調表示効果。

6.3. プロセスフィールドのソート
デフォルトでは、top を入力すると、各プロセスは CPU 使用率に従ってソートされます。下図では、プロセス ID 7517 の Java プロセスが 1 位 (CPU が 0.7% を占める)、プロセス ID が 7517 の Java プロセスが 1 位になります。 ID 3073 2 位 (CPU 使用率 0.3%)。
ここに画像の説明を挿入

キーボードの「x」を押すと (並べ替え列の強調表示効果をオン/オフにします)、上部の表示が次のように変わります。
ここに画像の説明を挿入

ご覧のとおり、先頭のデフォルトのソート列は「%CPU」です。

6.4. 「shift + >」または「shift + <」を使用すると、並べ替え列を右または左に変更できます。下の図は
「shift + >」を押した結果で、ビューが % に従って並べ替えられるようになりました。メム。
ここに画像の説明を挿入

02
例 2 は、完全なコマンドを示しています。
コマンド: top -c
出力:
ここに画像の説明を挿入

03
インスタンス 3 は、指定されたプロセス情報を表示します。
コマンド:
top -p 7517
出力:
ここに画像の説明を挿入

6. トップ対話型コマンド:
トップコマンドの実行中に使用できるいくつかの対話型コマンド。これらのコマンドはすべて 1 文字であり、コマンド ラインで s オプションが使用されている場合、一部のコマンドはブロックされる可能性があります。
h ヘルプ画面を表示し、短いコマンドの概要を示します。
k プロセスを終了します。
i アイドルプロセスとゾンビプロセスを無視します。これはスイッチコマンドです。
q プログラムを終了します。
r プロセスの優先順位を再調整します。
S 累積モードに切り替えます
。 s 2 回のリフレッシュ間の遅延時間を変更します (単位は s)。小数点がある場合は、ms に変換します。値 0 を入力すると、システムは継続的に更新されます。デフォルト値は 5 s
f または F 現在の表示に項目を追加または削除します
o または O 表示される項目の順序を変更します
l 平均負荷と起動時間の情報の表示を切り替えます
mメモリ情報の表示を切り替える
t プロセスと CPU のステータス情報の表示を切り替える
c コマンド名と完全なコマンド ラインの表示に切り替える
M 常駐メモリ サイズで並べ替え
P CPU 使用率で並べ替え
T 時間/累積時間で並べ替え
W 現在の設定を ~ に書き込む/.toprcファイル

Go 言語でシステム監視を呼び出すにはどうすればよいですか? gopsutil パッケージを使用する必要がありますが、Python にも同様のパッケージがありますが、ここでは Go のみを使用してさまざまなビデオ監視を実現します。

// QueryHost 获取本机信息
func queryHost() (out *response.JsonSimpleRes, err error) {
   out = &response.JsonSimpleRes{}

   info, _ := host.Info()
   fmt.Println(info)

   // host.BootTime()返回主机开机时间的时间戳:
   timestamp, _ := host.BootTime()
   t := time.Unix(int64(timestamp), 0)
   fmt.Println(t.Local().Format("2006-01-02 15:04:05"))

   //内核版本和平台信息
   version, _ := host.KernelVersion()
   fmt.Println(version)

   platform, family, version, _ := host.PlatformInformation()
   fmt.Println("platform:", platform)
   fmt.Println("family:", family, "version:", version)

   // host.Users()返回终端连接上来的用户信息,每个用户一个UserStat结构:
   users, _ := host.Users()
   for _, user := range users {
      data, _ := json.MarshalIndent(user, "", " ")
      fmt.Println(string(data))
   }

   return out, err

出力例:

  {"hostname":"WIN-SP09TQCP1U8","uptime":25308,"bootTime":1558574107,"procs":175,"os":"windows","platform":"Microsoft Windows 10 Pro","platformFamily":"Standalone Workstation","platformVersion":"10.0.17134 Build 17134","kernelVersion":"","virtualizationSystem":"","virtualizationRole":"","hostid":。。。}
}


// QueryCPU 采集CPU相关信息
func queryCPU() (out *response.JsonSimpleRes, err error) {
   out = &response.JsonSimpleRes{}

   c, _ := cpu.Info()
   fmt.Println("cpu信息:", c)
   输出内容:[{"cpu":0,cores":4,"modelName":"Intel(R) Core(TM) i5-2520M CPU @ 2.50GHz","mhz":2501,。。。]
   /*用户CPU时间/系统CPU时间/空闲时间。。。等等
     用户CPU时间:就是用户的进程获得了CPU资源以后,在用户态执行的时间。
     系统CPU时间:用户进程获得了CPU资源以后,在内核态的执行时间。
   */
   c1, _ := cpu.Times(false)
   fmt.Println("cpu1:", c1)
   输出内容:[{"cpu":"cpu-total","user":1272.0,"system":1572.7,"idle":23092.3,"nice":0.0,"iowait":0.0,"irq":0.0,。。。}]
   // 用户CPU时间:就是用户的进程获得了CPU资源以后,在用户态执行的时间。
   // 系统CPU时间:用户进程获得了CPU资源以后,在内核态的执行时间。
   // CPU使用率,每秒刷新一次
   //for {
   c2, _ := cpu.Percent(time.Duration(time.Second), false)
   fmt.Println(c2)
   //}

   n, _ := cpu.Counts(true) //cpu逻辑数量
   fmt.Println(n)           //4
   n, _ = cpu.Counts(false) //cpu物理核心
   fmt.Println(n)           //如果是2说明是双核超线程, 如果是4则是4核非超线程

   return out, err
}


// QueryMem 采集内存信息
func queryMem() (out *response.JsonSimpleRes, err error) {
   out = &response.JsonSimpleRes{}

   //获取物理内存和交换区内存信息
   m1, _ := mem.VirtualMemory()
   fmt.Println("m1:", m1)
   m2, _ := mem.SwapMemory()
   fmt.Println("m2:", m2)
   return out, err

出力:

{"total":8129818624,"available":4193423360,"used":3936395264,"usedPercent":48,"free":0,"active":0,"inactive":0,...}

出力:

{"total":8666689536,"used":4716843008,"free":3949846528,"usedPercent":0.5442496801583825,"sin":0,"sout":0,...}
   //总内存大小是8129818624 = 8 GB,已用3936395264 = 3.9 GB,使用了48%。而交换区大小是8666689536 = 8 GB。
}

// QueryDisk 采集磁盘信息
func queryDisk() (out *response.JsonSimpleRes, err error) {
   out = &response.JsonSimpleRes{}

   //可以通过psutil获取磁盘分区、磁盘使用率和磁盘IO信息
   d1, _ := disk.Partitions(true) //所有分区
   fmt.Println("d1:", d1)
   d2, _ := disk.Usage("E:") //指定某路径的硬盘使用情况
   fmt.Println("d2:", d2)
   d3, _ := disk.IOCounters() //所有硬盘的io信息
   fmt.Println("d3:", d3)
   return out, err

出力:

[{"device":"C:","mountpoint":"C:","fstype":"NTFS","opts":"rw.compress"} {"device":"D:","mountpoint":"D:","fstype":"NTFS","opts":"rw.compress"} {"device":"E:","mountpoint":"E:","fstype":"NTFS","opts":"rw.compress"} ]
   // {"path":"E:","fstype":"","total":107380965376,"free":46790828032,"used":60590137344,"usedPercent":56.425398236866755,"inodesTotal":0,"inodesUsed":0,"inodesFree":0,"inodesUsedPercent":0}
   // map[C::{"readCount":0,"mergedReadCount":0,"writeCount":0,"mergedWriteCount":0,"readBytes":0,"writeBytes":4096,"readTime":0,"writeTime":0,"iopsInProgress":0,"ioTime":0,"weightedIO":0,"name":"C:","serialNumber":"","label":""} 。。。]
}

// QueryNet 采集网络信息
func queryNet() (out *response.JsonSimpleRes, err error) {
   out = &response.JsonSimpleRes{}

   //获取当前网络连接信息
   n1, _ := net.Connections("all") //可填入tcp、udp、tcp4、udp4等等
   fmt.Println("n1:", n1)

出力:

[{"fd":0,"family":2,"type":1,"localaddr":{"ip":"0.0.0.0","port":135},"remoteaddr":{"ip":"0.0.0.0","port":0},"status":"LISTEN","uids":null,"pid":668} {"fd":0,"family":2,"type":1,"localaddr":{"ip":"0.0.0.0","port":445},"remoteaddr":{"ip":"0.0.0.0","port":0},"status":"LISTEN","uids":null,"pid":4} {"fd":0,"family":2,"type":1,"localaddr":{"ip":"0.0.0.0","port":1801},"remoteaddr":{"ip":"0.0.0.0","port":0},"status":"LISTEN","uids":null,"pid":3860}
   // 等等。。。]
   //获取网络读写字节/包的个数
   n2, _ := net.IOCounters(false)
   fmt.Println("n2:", n2)
   return out, err
   //output:[{"name":"all","bytesSent":6516450,"bytesRecv":36991210,"packetsSent":21767,"packetsRecv":33990,"errin":0,"errout":0,"dropin":0,"dropout":0,"fifoin":0,"fifoout":0}]

}

// QueryProcess 采集进程相关信息
func queryProcess() (out *response.JsonSimpleRes, err error) {
   out = &response.JsonSimpleRes{}

   //获取到所有进程的详细信息
   p1, _ := process.Pids() //获取当前所有进程的pid
   fmt.Println("p1:", p1)

出力:

[0 4 96 464 636 740 748 816 852 880 976 348 564 668 912 1048 1120 1184 1268 1288。。。]
   ifExists, _ := process.PidExists(10086) // 判断进程是否存在
   fmt.Println("ifExists:", ifExists)

   return out, err
}

著者: フーチェン星雲

おすすめ

転載: blog.csdn.net/ekcchina/article/details/131519124