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)
}

注意事项

  1. gopsutil在不同平台上的行为可能略有差异
  2. 某些功能可能需要管理员权限才能获取完整信息
  3. 所有函数都可能返回错误,生产代码中应该处理这些错误
  4. 频繁调用监控函数可能会对系统性能产生轻微影响

gopsutil库功能强大且持续更新,是Go语言中进行系统监控的首选工具之一。通过合理使用,可以轻松构建跨平台的系统监控工具。

回到顶部