golang,go,博客,开源,编程
shirou/gopsutil 是一个用 Go 语言实现的跨平台系统信息采集库,其设计灵感来源于 Python 的 psutil。它为开发者提供了一套统一、简洁的 API,用于获取底层操作系统的各项指标数据,如 CPU、内存、磁盘、网络、主机信息以及进程状态等。下面我们将从多个方面详细介绍这个库的功能、设计特点、使用示例以及应用场景。
citeturn0search0
cpu.Info()
可以获取 CPU 的详细信息,包括型号(modelName)、主频(mhz)、核心数(cores)、缓存大小、制造商(vendorId)以及 CPU 支持的指令集等。cpu.Times(percpu bool)
返回每个 CPU 或整体 CPU 从开机以来在用户态、内核态、空闲状态等各个方面消耗的时间(以秒为单位)。cpu.Percent(interval time.Duration, percpu bool)
可以监控指定时间段内 CPU 的使用率,既支持获取总的使用率,也支持逐核心采样。cpu.Counts(logical bool)
用于获取逻辑核心或物理核心数量。此外,结合 load 子包,还能获取系统负载信息,如过去 1、5、15 分钟的平均负载。
mem.VirtualMemory()
能够返回总内存、已用内存、可用内存以及内存使用百分比等详细信息。mem.SwapMemory()
提供了交换分区的相关数据,并包含页交换的详细统计,如载入页数(PgIn)、淘汰页数(PgOut)和缺页错误(PgFault)。disk.Partitions(all bool)
可以获取磁盘的所有分区信息。参数 all=false
时仅返回实际的物理分区,all=true
则返回所有挂载的分区。disk.Usage(path string)
获得指定路径所在磁盘的总容量、空闲容量、已使用容量以及使用百分比,还包括 inode 的使用情况。disk.IOCounters()
返回各分区的读写次数、传输的字节数和读写耗时等 I/O 统计数据。host.Info()
返回主机的基本信息,如主机名、开机时间(uptime 和 bootTime)、操作系统、平台类型、内核版本和 CPU 架构等。host.BootTime()
能直接获得系统的开机时间戳。host.Users()
列举当前登录系统的用户信息。net.IOCounters(pernic bool)
可采集各网络接口的字节发送/接收、包数、错误数和丢包等统计信息。net.Connections(kind string)
能够返回当前系统所有网络连接的状态,可用于检测 TCP、UDP 等协议的连接情况。process.Processes()
返回当前系统所有进程的对象,每个对象封装了该进程的详细信息(如 PID、CPU 和内存占用、命令行、状态等)。winservices
子包提供了服务信息的采集,包括服务名称、启动类型、二进制路径以及当前服务状态等信息。这部分功能依赖于 golang.org/x/sys
包,并通过 ListServices()
、NewService()
等函数进行管理。context.Context
的版本,方便进行超时控制和取消操作。以下是一个简单的示例,展示如何使用 gopsutil 获取内存信息:
package main
import (
"fmt"
"github.com/shirou/gopsutil/mem"
)
func main() {
v, err := mem.VirtualMemory()
if err != nil {
fmt.Println("Error:", err)
return
}
fmt.Printf("总内存: %v, 可用内存: %v, 内存使用率: %.2f%%\n", v.Total, v.Available, v.UsedPercent)
// v.String() 会以 JSON 格式输出详细信息
fmt.Println(v)
}
类似地,各子包(如 cpu、disk、host、net、process 等)均有详细的示例代码,帮助开发者快速上手使用这些 API 采集系统数据。
shirou/gopsutil 作为一个高效、跨平台且易用的系统监控库,大大简化了 Go 语言开发者在系统信息采集方面的工作。
其模块化的设计、统一的 API 接口和无 cgo 实现使得它不仅适用于单机监控,也非常适合构建分布式监控和运维系统。
无论是用于服务器性能监控、告警系统还是分布式系统的性能调优,gopsutil 都能提供详尽且可靠的数据支持,为开发者和运维工程师带来极大的便利。