golang 每日一庫之 gopsutil
shirou/gopsutil 是一個用 Go 語言實現的跨平臺系統信息採集庫,其設計靈感來源於 Python 的 psutil。它爲開發者提供了一套統一、簡潔的 API,用於獲取底層操作系統的各項指標數據,如 CPU、內存、磁盤、網絡、主機信息以及進程狀態等。下面我們將從多個方面詳細介紹這個庫的功能、設計特點、使用示例以及應用場景。
- 庫簡介
-
跨平臺支持
gopsutil 封裝了各操作系統(Linux、Windows、macOS、FreeBSD 等)底層調用的差異,使得開發者無需關注平臺細節,就能輕鬆採集系統硬件和軟件指標。
-
無 cgo 依賴
該庫完全採用純 Go 代碼實現,不依賴 cgo,這使得交叉編譯變得十分簡單,便於在各種架構和操作系統上部署使用。
-
模塊化設計
功能被拆分爲多個子包,每個子包負責一個領域的數據採集,如 CPU、內存、磁盤、網絡、進程、主機信息等,用戶可按需引入相關模塊,降低資源消耗和依賴複雜度。
-
統一接口
不同平臺下返回的數據結構一致,極大地降低了跨平臺開發時的適配工作量。
- 主要功能模塊
2.1 CPU 模塊
-
基本信息採集
使用
cpu.Info()
可以獲取 CPU 的詳細信息,包括型號(modelName)、主頻(mhz)、核心數(cores)、緩存大小、製造商(vendorId)以及 CPU 支持的指令集等。 -
CPU 時間統計
函數
cpu.Times(percpu bool)
返回每個 CPU 或整體 CPU 從開機以來在用戶態、內核態、空閒狀態等各個方面消耗的時間(以秒爲單位)。 -
CPU 使用率
通過
cpu.Percent(interval time.Duration, percpu bool)
可以監控指定時間段內 CPU 的使用率,既支持獲取總的使用率,也支持逐核心採樣。 -
核心數統計
cpu.Counts(logical bool)
用於獲取邏輯核心或物理核心數量。
此外,結合 load 子包,還能獲取系統負載信息,如過去 1、5、15 分鐘的平均負載。
2.2 內存模塊
-
物理內存信息
調用
mem.VirtualMemory()
能夠返回總內存、已用內存、可用內存以及內存使用百分比等詳細信息。 -
交換內存信息
mem.SwapMemory()
提供了交換分區的相關數據,幷包含頁交換的詳細統計,如載入頁數(PgIn)、淘汰頁數(PgOut)和缺頁錯誤(PgFault)。
2.3 磁盤模塊
-
分區信息
使用
disk.Partitions(all bool)
可以獲取磁盤的所有分區信息。參數all=false
時僅返回實際的物理分區,all=true
則返回所有掛載的分區。 -
磁盤使用率
通過
disk.Usage(path string)
獲得指定路徑所在磁盤的總容量、空閒容量、已使用容量以及使用百分比,還包括 inode 的使用情況。 -
磁盤 I/O 統計
函數
disk.IOCounters()
返回各分區的讀寫次數、傳輸的字節數和讀寫耗時等 I/O 統計數據。
2.4 主機信息模塊
-
系統基本信息
host.Info()
返回主機的基本信息,如主機名、開機時間(uptime 和 bootTime)、操作系統、平臺類型、內核版本和 CPU 架構等。
-
開機時間
host.BootTime()
能直接獲得系統的開機時間戳。
-
終端用戶
host.Users()
列舉當前登錄系統的用戶信息。
2.5 網絡模塊
-
網絡 I/O
通過
net.IOCounters(pernic bool)
可採集各網絡接口的字節發送 / 接收、包數、錯誤數和丟包等統計信息。 -
網絡連接
net.Connections(kind string)
能夠返回當前系統所有網絡連接的狀態,可用於檢測 TCP、UDP 等協議的連接情況。
2.6 進程模塊
-
進程列表
process.Processes()
返回當前系統所有進程的對象,每個對象封裝了該進程的詳細信息(如 PID、CPU 和內存佔用、命令行、狀態等)。
-
進程操作
除了基本的信息獲取,模塊還支持查詢進程是否存在、獲取進程的子進程、終止進程等操作。
2.7 Windows 服務模塊
-
服務管理
針對 Windows 平臺,
winservices
子包提供了服務信息的採集,包括服務名稱、啓動類型、二進制路徑以及當前服務狀態等信息。這部分功能依賴於golang.org/x/sys
包,並通過ListServices()
、NewService()
等函數進行管理。
- 設計特點與優勢
-
統一跨平臺接口
gopsutil 通過屏蔽不同操作系統間的系統調用差異,使得獲取系統指標的代碼在多個平臺上完全一致。
-
模塊化與高內聚低耦合
各功能模塊獨立設計,用戶可以按需加載所需模塊而不必引入全部功能,降低了程序的資源消耗和複雜度。
-
無 cgo 實現,便於交叉編譯
由於完全採用 Go 語言實現,不依賴 C 語言庫,因此極大地簡化了編譯和部署流程,尤其是在容器化和跨平臺環境下尤爲突出。
-
錯誤處理與上下文支持
大多數 API 返回值中包含 error,開發者可以根據需要添加錯誤處理。同時,許多函數提供了支持
context.Context
的版本,方便進行超時控制和取消操作。
- 使用示例
以下是一個簡單的示例,展示如何使用 gopsutil 獲取內存信息:
package main
import (
"fmt"
"github.com/shirou/gopsutil/v4/mem"
)
func main() {
v, _ := mem.VirtualMemory()
// almost every return value is a struct
fmt.Printf("Total: %v, Free:%v, UsedPercent:%f%%\n", v.Total, v.Free, v.UsedPercent)
// convert to JSON. String() is also implemented
fmt.Println(v)
}
類似地,各子包(如 cpu、disk、host、net、process 等)均有詳細的示例代碼,幫助開發者快速上手使用這些 API 採集系統數據。
- 典型應用場景
-
服務器性能監控
通過定時採集 CPU、內存、磁盤和網絡數據,將數據存儲到數據庫或時序數據庫中,並通過可視化界面展示,幫助運維人員實時監控服務器狀態,及時發現性能瓶頸或故障。
-
運維與告警系統
將 gopsutil 集成到運維監控系統中,監測關鍵指標(如 CPU 使用率過高、內存不足、磁盤空間耗盡等),當指標異常時觸發報警機制。
-
分佈式系統調優
在多節點集羣中採集各節點的系統指標數據,對比分析,幫助進行容量規劃、負載均衡以及性能調優。
- 結尾
shirou/gopsutil 作爲一個高效、跨平臺且易用的系統監控庫,大大簡化了 Go 語言開發者在系統信息採集方面的工作。
其模塊化的設計、統一的 API 接口和無 cgo 實現使得它不僅適用於單機監控,也非常適合構建分佈式監控和運維繫統。
無論是用於服務器性能監控、告警系統還是分佈式系統的性能調優,gopsutil 都能提供詳盡且可靠的數據支持,爲開發者和運維工程師帶來極大的便利。
標題:golang 每日一庫之 gopsutil
作者:mooncakeee
地址:http://blog.dd95828.com/articles/2025/03/19/1742364474636.html
聯繫:scotttu@163.com
本文由 Readfog 進行 AMP 轉碼,版權歸原作者所有。
來源:https://mp.weixin.qq.com/s/01qrzZrz3HDNgNf_XTjMTQ