系统性能数据gopsutil库

Posted Harris-H

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了系统性能数据gopsutil库相关的知识,希望对你有一定的参考价值。

系统性能数据gopsutil库

0.介绍

psutil是一个跨平台进程和系统监控的Python库,而gopsutil是其Go语言版本的实现。本文介绍了它的基本使用。

Go语言部署简单、性能好的特点非常适合做一些诸如采集系统信息和监控的服务,本文介绍的gopsutil库是知名Python库:psutil的一个Go语言版本的实现。

gopsutil将不同的功能划分到不同的子包中:

  • cpu:CPU 相关;
  • disk:磁盘相关;
  • docker:docker 相关;
  • host:主机相关;
  • mem:内存相关;
  • net:网络相关;
  • process:进程相关;
  • winservices:Windows 服务相关。

想要使用对应的功能,要导入对应的子包。例如,上面代码中,我们要获取内存信息,导入的是mem子包。mem.VirtualMemory()方法返回内存信息结构mem.VirtualMemoryStat,该结构有丰富的字段,我们最常使用的无外乎Total(总内存)、Available(可用内存)、Used(已使用内存)和UsedPercent(内存使用百分比)。mem.VirtualMemoryStat还实现了fmt.Stringer接口,以 JSON 格式返回内存信息。语句fmt.Println(v)会自动调用v.String(),将返回信息输出。程序输出:

1.安装

  go get github.com/shirou/gopsutil

2.简单使用

查看内存相关信息。

package main

import (
	"fmt"

	"github.com/shirou/gopsutil/v3/mem"
	// "github.com/shirou/gopsutil/mem"  // to use v2
)

func main() 
	v, _ := mem.VirtualMemory()

	// almost every return value is a struct
	fmt.Printf("Used:%v,Available:%v,Total: %v, Free:%v, UsedPercent:%f%%\\n", v.Used, v.Available, v.Total, v.Free, v.UsedPercent)

	// convert to JSON. String() is also implemented
	fmt.Println(v)


结果

Used:11107000320,Available:4869570560,Total: 15976570880, Free:4869570560, UsedPercent:69.000000%
"total":15976570880,"available":4869570560,"used":11107000320,"usedPercent":69,"free":4869570560,"active":0,"inactive":0,"wired":0,"laundry":0,"buffers":0,"cached":0,"writeBack":0,"dirty":0,"writeBackTmp":0,"shared":0,"slab":0,"sreclaimable":0,"sunreclaim":0,"pageTables":0,"swapCached":0,"commitLimit":0,"committedAS":0,"highTotal":0,"highFree":0,"lowTotal":0,"lowFree":0,"swapTotal":0,"swapFree":0,"mapped":0,"vmallocTotal":0,"vmallocUsed":0,"vmallocChunk":0,"hugePagesTotal":0,"hugePagesFree":0,"hugePageSize":0

这里UsedPercent= Used Total = ( 1 − Free Total ) × 100 % \\dfrac\\textUsed\\textTotal=(1-\\dfrac\\textFree\\textTotal)\\times100\\% TotalUsed=(1TotalFree)×100%

单位为字节,我的电脑内存 8GB,当前使用百分比为 55%,可用内存 3768975360B(即 3.51GB)。

CPUT使用率

我们知道 CPU 的核数有两种,一种是物理核数,一种是逻辑核数。物理核数就是主板上实际有多少个 CPU,一个物理 CPU 上可以有多个核心,这些核心被称为逻辑核。gopsutil中 CPU 相关功能在cpu子包中,cpu子包提供了获取物理和逻辑核数、CPU 使用率的接口:

  • Counts(logical bool):传入false,返回物理核数,传入true,返回逻辑核数;
  • Percent(interval time.Duration, percpu bool):表示获取interval时间间隔内的 CPU 使用率,percpufalse时,获取总的 CPU 使用率,percputrue时,分别获取每个 CPU 的使用率,返回一个[]float64类型的值。
func main() 
  physicalCnt, _ := cpu.Counts(false)
  logicalCnt, _ := cpu.Counts(true)
  fmt.Printf("physical count:%d logical count:%d\\n", physicalCnt, logicalCnt)

  totalPercent, _ := cpu.Percent(3*time.Second, false)
  perPercents, _ := cpu.Percent(3*time.Second, true)
  fmt.Printf("total percent:%v per percents:%v", totalPercent, perPercents)

上面代码获取物理核数和逻辑核数,并获取 3s 内的总 CPU 使用率和每个 CPU 各自的使用率,程序输出(注意每次运行输出可能都不相同):

physical count:4 logical count:8
total percent:[30.729166666666668] per percents:[32.64248704663213 26.94300518134715 44.559585492227974 23.95833333333
package main

import (
	"fmt"
	"github.com/shirou/gopsutil/v3/cpu"
	"time"
	// "github.com/shirou/gopsutil/mem"  // to use v2
)

// cpu info
func getCpuInfo() 
	cpuInfos, err := cpu.Info()
	if err != nil 
		fmt.Printf("get cpu info failed, err:%v", err)
	
	for _, ci := range cpuInfos 
		fmt.Println(ci)
	
	// CPU使用率
	for 
		percent, _ := cpu.Percent(time.Second, false)
		fmt.Printf("cpu percent:%v\\n", percent)
	

func main() 
	getCpuInfo()


3.参考文章

github文档

英文官方文档

中文详细介绍的文章1

文章2

以上是关于系统性能数据gopsutil库的主要内容,如果未能解决你的问题,请参考以下文章

Go使用gopsutil 和 go-echarts 生成系统状态图表

gopsutil的进阶使用(disk,net)

1.1.1-获取系统性能信息

干货 | 实践Hadoop MapReduce 任务的性能翻倍之路

linux资源性能指标

Linux系统性能监控工具nmon