golang跨平台获取进程和系统资源(CPU/内存/磁盘)监控插件库gopsutil的使用
golang跨平台获取进程和系统资源(CPU/内存/磁盘)监控插件库gopsutil的使用
gopsutil是Go语言版本的psutil库,用于跨平台获取系统进程和资源使用信息(CPU、内存、磁盘等)。它是一个纯Go实现,不依赖cgo,支持多种操作系统架构。
安装
go get github.com/shirou/gopsutil/v4
基本使用示例
获取内存使用情况
package main
import (
"fmt"
"github.com/shirou/gopsutil/v4/mem"
)
func main() {
v, _ := mem.VirtualMemory()
// 几乎每个返回值都是一个结构体
fmt.Printf("Total: %v, Free:%v, UsedPercent:%f%%\n", v.Total, v.Free, v.UsedPercent)
// 可以转换为JSON,String()方法也已实现
fmt.Println(v)
}
输出示例:
Total: 3179569152, Free:284233728, UsedPercent:84.508194%
{"total":3179569152,"available":492572672,"used":2895335424,"usedPercent":84.50819439828305,...}
获取CPU信息
package main
import (
"fmt"
"github.com/shirou/gopsutil/v4/cpu"
)
func main() {
// 获取CPU使用率
percent, _ := cpu.Percent(0, false)
fmt.Printf("CPU Usage: %.2f%%\n", percent[0])
// 获取CPU详细信息
info, _ := cpu.Info()
for _, cpuInfo := range info {
fmt.Printf("CPU: %d, Model: %s, Cores: %d\n",
cpuInfo.CPU, cpuInfo.ModelName, cpuInfo.Cores)
}
}
获取磁盘信息
package main
import (
"fmt"
"github.com/shirou/gopsutil/v4/disk"
)
func main() {
// 获取磁盘分区信息
partitions, _ := disk.Partitions(false)
for _, partition := range partitions {
fmt.Printf("Device: %s, Mountpoint: %s, Fstype: %s\n",
partition.Device, partition.Mountpoint, partition.Fstype)
// 获取磁盘使用情况
usage, _ := disk.Usage(partition.Mountpoint)
fmt.Printf(" Total: %v GB, Free: %v GB, UsedPercent: %.2f%%\n",
usage.Total/1024/1024/1024, usage.Free/1024/1024/1024, usage.UsedPercent)
}
}
获取进程信息
package main
import (
"fmt"
"github.com/shirou/gopsutil/v4/process"
)
func main() {
// 获取所有进程ID
pids, _ := process.Pids()
fmt.Printf("Total processes: %d\n", len(pids))
// 获取前5个进程的信息
for i := 0; i < 5 && i < len(pids); i++ {
p, _ := process.NewProcess(pids[i])
name, _ := p.Name()
mem, _ := p.MemoryInfo()
cpu, _ := p.CPUPercent()
fmt.Printf("PID: %d, Name: %s, Memory: %v, CPU: %.2f%%\n",
p.Pid, name, mem.RSS, cpu)
}
}
高级功能
使用context设置路径
从v3.23.6开始,可以通过context设置路径:
import (
"context"
"github.com/shirou/gopsutil/v4/common"
"github.com/shirou/gopsutil/v4/mem"
)
func main() {
ctx := context.WithValue(context.Background(),
common.EnvKey, common.EnvMap{common.HostProcEnvKey: "/myproc"},
)
v, err := mem.VirtualMemoryWithContext(ctx)
if err != nil {
panic(err)
}
fmt.Println(v)
}
平台特定功能(Ex结构体)
从v4.24.5开始,可以使用平台特定的Ex结构体获取额外信息:
package main
import (
"fmt"
"github.com/shirou/gopsutil/v4/mem"
)
func main() {
ex := mem.NewExWindows()
v, err := ex.VirtualMemory()
if err != nil {
panic(err)
}
fmt.Println(v.VirtualAvail)
fmt.Println(v.VirtualTotal)
}
环境变量配置
可以通过以下环境变量配置系统目录位置:
- /proc:
HOST_PROC
- /sys:
HOST_SYS
- /etc:
HOST_ETC
- /var:
HOST_VAR
- /run:
HOST_RUN
- /dev:
HOST_DEV
- /:
HOST_ROOT
- /proc/N/mountinfo:
HOST_PROC_MOUNTINFO
支持的平台
gopsutil支持以下平台:
- FreeBSD i386/amd64/arm
- Linux i386/amd64/arm(raspberry pi)
- Windows i386/amd64/arm/arm64
- Darwin amd64/arm64
- OpenBSD i386/amd64/armv7/arm64/riscv64
- Solaris amd64
要求
- Go 1.18或更高版本
gopsutil是一个功能强大的系统监控库,可以方便地获取各种系统资源信息,适合用于系统监控、性能分析等场景。
更多关于golang跨平台获取进程和系统资源(CPU/内存/磁盘)监控插件库gopsutil的使用的实战教程也可以访问 https://www.itying.com/category-94-b0.html
1 回复
更多关于golang跨平台获取进程和系统资源(CPU/内存/磁盘)监控插件库gopsutil的使用的实战系列教程也可以访问 https://www.itying.com/category-94-b0.html
使用gopsutil进行跨平台系统监控
gopsutil是一个强大的Go语言库,用于跨平台获取系统信息,包括进程、CPU、内存、磁盘等资源的使用情况。它是Python psutil库的Go语言实现,支持Windows、Linux、macOS等多种操作系统。
安装
首先安装gopsutil库:
go get github.com/shirou/gopsutil/v3
基本使用示例
1. CPU监控
package main
import (
"fmt"
"time"
"github.com/shirou/gopsutil/v3/cpu"
)
func main() {
// 获取CPU逻辑核心数
cpuCount, _ := cpu.Counts(true)
fmt.Printf("逻辑CPU核心数: %d\n", cpuCount)
// 获取CPU使用率(每秒)
cpuPercent, _ := cpu.Percent(time.Second, false)
fmt.Printf("CPU使用率: %.2f%%\n", cpuPercent[0])
// 获取每个CPU核心的使用率
perCpuPercent, _ := cpu.Percent(time.Second, true)
for i, percent := range perCpuPercent {
fmt.Printf("CPU核心%d使用率: %.2f%%\n", i, percent)
}
// 获取CPU信息
cpuInfo, _ := cpu.Info()
for _, info := range cpuInfo {
fmt.Printf("CPU型号: %s, 核心数: %d, 频率: %.2fGHz\n",
info.ModelName, info.Cores, info.Mhz/1000)
}
}
2. 内存监控
package main
import (
"fmt"
"github.com/shirou/gopsutil/v3/mem"
)
func main() {
// 获取虚拟内存信息
vmem, _ := mem.VirtualMemory()
fmt.Printf("总内存: %.2fGB\n", float64(vmem.Total)/1024/1024/1024)
fmt.Printf("已用内存: %.2fGB\n", float64(vmem.Used)/1024/1024/1024)
fmt.Printf("内存使用率: %.2f%%\n", vmem.UsedPercent)
// 获取交换内存信息
swap, _ := mem.SwapMemory()
fmt.Printf("交换内存使用率: %.2f%%\n", swap.UsedPercent)
}
3. 磁盘监控
package main
import (
"fmt"
"github.com/shirou/gopsutil/v3/disk"
)
func main() {
// 获取磁盘分区信息
partitions, _ := disk.Partitions(false)
for _, partition := range partitions {
fmt.Printf("设备: %s, 挂载点: %s, 文件系统: %s\n",
partition.Device, partition.Mountpoint, partition.Fstype)
}
// 获取磁盘使用情况
usage, _ := disk.Usage("/")
fmt.Printf("根分区总大小: %.2fGB\n", float64(usage.Total)/1024/1024/1024)
fmt.Printf("根分区使用率: %.2f%%\n", usage.UsedPercent)
// 获取磁盘IO统计
ioCounters, _ := disk.IOCounters()
for name, counter := range ioCounters {
fmt.Printf("磁盘%s: 读取次数 %d, 写入次数 %d\n",
name, counter.ReadCount, counter.WriteCount)
}
}
4. 进程监控
package main
import (
"fmt"
"github.com/shirou/gopsutil/v3/process"
"os"
)
func main() {
// 获取所有进程ID
pids, _ := process.Pids()
fmt.Printf("系统中共有%d个进程\n", len(pids))
// 获取当前进程信息
pid := int32(os.Getpid())
p, _ := process.NewProcess(pid)
name, _ := p.Name()
fmt.Printf("进程名: %s\n", name)
cmdline, _ := p.Cmdline()
fmt.Printf("命令行: %s\n", cmdline)
cpuPercent, _ := p.CPUPercent()
fmt.Printf("CPU使用率: %.2f%%\n", cpuPercent)
memInfo, _ := p.MemoryInfo()
fmt.Printf("内存使用: %.2fMB\n", float64(memInfo.RSS)/1024/1024)
// 获取进程打开的文件
openFiles, _ := p.OpenFiles()
for _, file := range openFiles {
fmt.Printf("打开文件: %s\n", file.Path)
}
// 获取进程的TCP连接
connections, _ := p.Connections()
for _, conn := range connections {
fmt.Printf("连接: %s:%d -> %s:%d\n",
conn.Laddr.IP, conn.Laddr.Port,
conn.Raddr.IP, conn.Raddr.Port)
}
}
高级功能
组合监控
package main
import (
"fmt"
"github.com/shirou/gopsutil/v3/host"
"github.com/shirou/gopsutil/v3/load"
"time"
)
func systemInfo() {
// 获取主机信息
hostInfo, _ := host.Info()
fmt.Printf("主机名: %s\n", hostInfo.Hostname)
fmt.Printf("操作系统: %s %s\n", hostInfo.OS, hostInfo.PlatformVersion)
fmt.Printf("运行时间: %v\n", time.Duration(hostInfo.Uptime)*time.Second)
// 获取系统负载
avg, _ := load.Avg()
fmt.Printf("系统负载: %.2f %.2f %.2f\n", avg.Load1, avg.Load5, avg.Load15)
}
定时监控
package main
import (
"fmt"
"github.com/shirou/gopsutil/v3/cpu"
"time"
)
func monitorCPU(interval time.Duration) {
ticker := time.NewTicker(interval)
defer ticker.Stop()
for range ticker.C {
percent, _ := cpu.Percent(interval, false)
fmt.Printf("CPU使用率: %.2f%%\n", percent[0])
}
}
func main() {
go monitorCPU(3 * time.Second)
time.Sleep(30 * time.Second)
}
注意事项
- gopsutil在不同平台上的行为可能略有差异
- 某些功能可能需要管理员权限才能获取完整信息
- 所有函数都可能返回错误,生产代码中应该处理这些错误
- 频繁调用监控函数可能会对系统性能产生轻微影响
gopsutil库功能强大且持续更新,是Go语言中进行系统监控的首选工具之一。通过合理使用,可以轻松构建跨平台的系统监控工具。