大家好 我是寸铁
总结了一篇Go常用库Gopsutil中关于Process资源的文章✨
喜欢的小伙伴可以点点关注
newProcess, _ := process.NewProcess(18024) //参数:想监控的进程号pid
info, _ := newProcess.MemoryInfo()
fmt.Println("返回平台独立内存信息", info)
返回如下信息:
rSS:实际使用物理内存
vmS:虚拟使用内存
hwm: 表示进程所占用物理内存的峰值
data: 表示进程数据段的大小
stack: 表示进程堆栈段的大小
locked: 表示被锁定的内存大小
swap:交换分区
ex, _ := newProcess.MemoryInfoEx()
fmt.Println("MemoryInfoEx()返回与平台相关的内存信息: ", ex)
maps, _ := newProcess.MemoryMaps(true)
fmt.Println("MemoryMaps 从 /proc/(pid)/smaps 获取内存映射: ", maps)
memorypercent, _ := newProcess.MemoryPercent()
fmt.Println("MemoryPercent 返回此进程使用的总 RAM 的百分比: ", memorypercent)
RAM :是与CPU直接交换数据的内部存储器,也叫主存(内存)
主要是CPUPercent
获取进程CPU使用率
cpupercent, _ := newProcess.CPUPercent()
fmt.Println("CPU_Percent返回此进程使用的 CPU 时间的百分比: ", cpupercent)
times, _ := newProcess.Times()
fmt.Println("Times 返回进程的 CPU 时间: ", times)
cpu.Percent(time.Second, false)
这个函数的目的是返回一个包含每个逻辑CPU使用率百分比的切片。
其中的参数和返回值:
interval
参数表示获取 CPU 使用率的时间间隔。它是一个 time.Duration
类型的值,通常会传入一个时间段,比如 time.Second
表示每秒获取一次 CPU 使用率。percpu
参数是一个布尔值,表示是否获取每个逻辑 CPU 的使用率。如果设置为 true
,返回的切片将包含每个
逻辑 CPU 的使用率百分比;如果设置为 false
,返回的切片将只包含总的
CPU 使用率百分比。[]float64
类型的切片,其中包含了每个逻辑 CPU 或总 CPU 的使用率百分比。每个元素的取值范围是 0 到 100,表示对应 CPU 的使用率百分比。查看官方文档源代码的注释,发现指的是进程的CPU的使用率
监控的是子进程其实返回的是子进程所在的父进程的CPU的使用率
子进程直接调用该函数,没有参数可以调整
这里要注意Process没有提供与Disk直接相关的API
这里需要追溯到原来Python的gopsutil库结合输出结果
知道IOCounters
返回进程的磁盘信息
counters, _ := newProcess.IOCounters()
fmt.Println("IOCounters() 返回进程的磁盘信息:", counters)
返回信息:
readCount:磁盘读入的总数
writeCount:写入磁盘的总数
readBytes:磁盘读入的字节数
writeBytes:写入磁盘的字节数
根据输入的参数(true/false)返回不同的信息,根据自己需求来。
netIOcounters, _ := newProcess.NetIOCounters(true)
fmt.Println("NetIOCounters 返回进程的网络信息: ", netIOcounters)
package main
import (
"fmt"
"github.com/shirou/gopsutil/process"
)
func main() {
//获取到所有进程的详细信息
p1, _ := process.Pids() //获取当前所有进程的pid
fmt.Println("p1:", p1)
//根据PID获得进程
newProcess, _ := process.NewProcess(18024)
//参数:想监控的进程号pid 从p1中选择测试
info, _ := newProcess.MemoryInfo()
fmt.Println("返回平台独立内存信息", info)
/*返回如下信息:
//rSS:实际使用物理内存
//vmS:虚拟使用内存
//hwm: 表示进程所占用物理内存的峰值
//data: 表示进程数据段的大小
//stack: 表示进程堆栈段的大小
//locked: 表示被锁定的内存大小
//swap:交换分区
*/
ex, _ := newProcess.MemoryInfoEx()
fmt.Println("MemoryInfoEx()返回与平台相关的内存信息: ", ex)
maps, _ := newProcess.MemoryMaps(true)
fmt.Println("MemoryMaps 从 /proc/(pid)/smaps 获取内存映射: ", maps)
memorypercent, _ := newProcess.MemoryPercent()
fmt.Println("MemoryPercent 返回此进程使用的总 RAM 的百分比: ", memorypercent)
//RAM :是与CPU直接交换数据的内部存储器,也叫主存(内存)
cpupercent, _ := newProcess.CPUPercent()
fmt.Println("CPU_Percent返回此进程使用的 CPU 时间的百分比: ", cpupercent)
times, _ := newProcess.Times()
fmt.Println("Times 返回进程的 CPU 时间: ", times)
counters, _ := newProcess.IOCounters()
fmt.Println("IOCounters() 返回进程的磁盘信息:", counters)
/*
//readCount:磁盘读入的总数
//writeCount:写入磁盘的总数
//readBytes:磁盘读入的字节数
//writeBytes:写入磁盘的字节数
*/
//返回信息样例{"readCount":6689,"writeCount":8516,"readBytes":4778776,"writeBytes":20146627}
netIOcounters, _ := newProcess.NetIOCounters(true)
fmt.Println("NetIOCounters 返回进程的网络信息: ", netIOcounters)
}
这里的nil(空)实际上是go调用函数API返回的第二个结果:error
一般情况下为nil 开发中最好还是写一个判断nil的语句(处理错误)
返回的第一个结果就是我们想看到的数据和信息