golang库高效获取服务器Cpu MAC等信息

作者: adm 分类: go 发布时间: 2024-09-27

前言
在现代计算机系统中,有效地监控和管理服务器资源是至关重要的。了解服务器的资源利用情况可以帮助我们优化性能、识别问题并做出及时的响应。而gopsutil这个Go语言编写的库提供了一种便捷的方式来获取各种系统资源信息。本文将深入探讨如何利用gopsutil库更高效地获取服务器资源信息,为您展示一些高级技巧和进阶策略。

获取CPU相关信息

cpu.Info()

返回cpu的具体信息

cpuInfo, _ := cpu.Info()
fmt.Println("返回cpu的具体信息:", cpuInfo)

返回信息如下:

	type InfoStat struct {
		CPU        int32     //中央处理器
		VendorID   string   //供应商 ID
		Family     string   //家庭
		Model      string   //型号
		Stepping   int32    //步 进
		PhysicalID string  //物理 ID
		CoreID     string  //核心 ID
		Cores      int32    //核心数
		ModelName  string   //型号名称
		Mhz        float64  //兆赫
		CacheSize  int32    //缓存大小
		Flags      []string //标志
		Microcode  string   //微码
	}

cpu.Times()
CPU 执行不同操作所花费的时间 工作种类

cpuCounts, _ := cpu.Times(false)
fmt.Println("返回cpu执行不同操作所花费的时间和工作种类:", cpuCounts)
		type TimesStat struct {
			CPU       string  //中央处理器
			User      float64 //用户
			System    float64 //系统
			Idle      float64 //闲置
         Nice      float64 //好
			Iowait    float64 //输入输出等待
			Irq       float64 //设备的中断请求
			Softirq   float64 //硬中断的服务程序”发起的对内核的中断
         Steal     float64 //偷(抢占)
			Guest     float64 //“来宾帐户”。
			GuestNice float64 //好的“来宾帐户”。
		}

cpu.Percent()
返回cpu的使用率

cpuPercent, _ := cpu.Percent(time.Second, false)
fmt.Println("返回cpu的使用率:", cpuPercent)

CPUdemo

package main

import (
	"fmt"
	"github.com/shirou/gopsutil/cpu"
	"time"
)

func main() {
	cpuInfo, _ := cpu.Info()
	fmt.Println("返回cpu的具体信息:", cpuInfo)

	fmt.Println()
	cpuCounts, _ := cpu.Times(false)
	fmt.Println("返回cpu执行不同操作所花费的时间 工作种类:", cpuCounts)
	//TimesStat 包含 CPU 执行不同操作所花费的时间 工作种类。时间单位以秒为单位。它基于 linux /proc/stat 文件。

	
	fmt.Println()
	cpuPercent, _ := cpu.Percent(time.Second, false)
	fmt.Println("返回cpu的使用率:", cpuPercent)

	//info, _ := cpu.ProcInfo()
	//fmt.Println(info)

	// CPU使用率,每秒刷新一次
	//for {
	//	c2, _ := cpu.Percent(time.Duration(time.Second), false)
	//	fmt.Println(c2)
	//}
	
}

结果如下

返回cpu的具体信息: [{“cpu”:0,“vendorId”:“GenuineIntel”,“family”:“205”,“model”:“”,“stepping”:0,“physicalId”:“BFEBFBFF000806C1”,“coreId”:“”,“cores”:8,“modelName”:“11th Gen Intel® Cor
e™ i5-1135G7 @ 2.40GHz”,“mhz”:2419,“cacheSize”:0,“flags”:[],“microcode”:“”}]

返回cpu执行不同操作所花费的时间 工作种类:

[{“cpu”:“cpu-total”,“user”:5511.6,“system”:4918.5,“idle”:138745.0,“nice”:0.0,“iowait”:0.0,“irq”:0.0,“softirq”:0.0,“steal”:0.0,“guest”:0.0,“g
uestNice”:0.0}]

返回cpu的使用率: [5.859375]

获取内存相关信息

mem.VirtualMemory()

返回虚拟内存的信息

m1, _ := mem.VirtualMemory()
fmt.Println("返回虚拟内存的信息:", m1)

返回如下信息:

“total”: 总虚拟内存

“available”: 可用虚拟内存

“used”: 已使用虚拟内存

“usedPercent”: 已使用虚拟内存百分比

“free”: 空闲虚拟内存

“active”: 活跃虚拟内存

“inactive”: 非活跃虚拟内存

“wired”: 已锁定虚拟内存

“laundry”: 洗涤虚拟内存

“buffers”: 缓冲虚拟内存

“cached”: 缓存虚拟内存

“writeback”: 回写虚拟内存

“dirty”: 脏页虚拟内存

“writebacktmp”: 回写临时虚拟内存

“shared”: 共享虚拟内存

“slab”: 内核SLAB分配器使用的虚拟内存

“sreclaimable”: 可回收SLAB分配器虚拟内存

“sunreclaim”: 不可回收SLAB分配器虚拟内存

“pagetables”: 页表使用的虚拟内存:

“swapcached”: 交换缓存的虚拟内存

“commitlimit”: 提交限制

“committedas”: 已提交的虚拟内存

“hightotal”: 高优先级虚拟内存总量

“highfree”: 高优先级空闲虚拟内存

“lowtotal”: 低优先级虚拟内存总量

“lowfree”: 低优先级空闲虚拟内存

“swaptotal”: 交换总量

“swapfree”: 可用交换空间

“mapped”: 映射的虚拟内存

“vmalloctotal”: vmalloc总量

“vmallocused”: 已使用的vmalloc

“vmallocchunk”: vmalloc块大小

“hugepagestotal”: 大页总量

“hugepagesfree”: 可用大页

“hugepagesize”: 大页大小

请注意,这些值表示了虚拟内存的不同方面,以字节为单位。

mem.SwapMemory()

返回交换内存的信息

m2, _ := mem.SwapMemory()
fmt.Println("返回交换内存的信息:", m2)

这段文本提供了有关交换内存使用情况的信息。

1.“total” : 总交换内存
2.“used”: 已使用的交换内存
3.“free”: 空闲的交换内存
4.“usedPercent”: 已使用交换内存百分比
5.“sin” : 从磁盘读入的数据量
6.“sout” 写入磁盘的数据量
7.“pgin”: 从磁盘读入的页面数
8.“pgout”: 写入磁盘的页面数
9.“pgfault” 页面错误数
10.“pgmajfault”: 重要页面错误数(导致系统进程或关键数据结构的错误)

这些值提供了有关系统中交换内存使用情况的详细信息,包括总交换内存量、已使用和空闲的交换内存量,以及其他与磁盘I/O和页面错误相关的统计数据。请注意,所有的数值都是以字节为单位,除了”usedPercent”,它表示已使用交换内存的百分比。

mem.SwapDevices()

返回交换设备的信息

	devices, _ := mem.SwapDevices()
	fmt.Println("返回交换设备的信息:", devices)

这段文本提供了有关交换设备(swap device)的信息。以下是字段的翻译:

1.“name”: “C:\pagefile.sys” ,设备名称为 “C:\pagefile.sys”,这是 Windows 操作系统上的交换文件路径。
2.“usedBytes”: 已使用的字节数
3.“freeBytes”: 可用的字节数

这表示系统中的交换设备是 “C:\pagefile.sys”,它的总容量为 “usedBytes + freeBytes” 字节,其中 “usedBytes” 表示已经被使用的容量,而 “freeBytes” 表示尚未被使用的容量。在这个例子中,该设备的总容量为 两部分字节容量的总和。

返回结果如下:

返回虚拟内存的信息: {“total”:16786784256,“available”:7125823488,“used”:966096076
8,“usedPercent”:57,“free”:7125823488,“active”:0,“inactive”:0,“wired”:0,“laundry”
:0,“buffers”:0,“cached”:0,“writeback”:0,“dirty”:0,“writebacktmp”:0,“shared”:0,“s
lab”:0,“sreclaimable”:0,“sunreclaim”:0,“pagetables”:0,“swapcached”:0,“commitlimi
t”:0,“committedas”:0,“hightotal”:0,“highfree”:0,“lowtotal”:0,“lowfree”:0,“swapto
tal”:0,“swapfree”:0,“mapped”:0,“vmalloctotal”:0,“vmallocused”:0,“vmallocchunk”:0
,“hugepagestotal”:0,“hugepagesfree”:0,“hugepagesize”:0}

返回交换内存的信息: {“total”:19336921088,“used”:14182088704,“free”:5154832384,“u
sedPercent”:73.34202089080792,“sin”:0,“sout”:0,“pgin”:0,“pgout”:0,“pgfault”:0,“p
gmajfault”:0}

返回交换设备的信息: [{“name”:“C:\pagefile.sys”,“usedBytes”:233226240,"freeBytes
":2316910592}]

Memdemo

package main

import (
	"fmt"
	"github.com/shirou/gopsutil/mem"
)

func main() {
	//获取物理内存和交换区内存信息
	m1, _ := mem.VirtualMemory()
	fmt.Println("返回虚拟内存的信息:", m1)
	fmt.Println()
	m2, _ := mem.SwapMemory()
	fmt.Println("返回交换内存的信息:", m2)
	fmt.Println()
	devices, _ := mem.SwapDevices()
	fmt.Println("返回交换设备的信息:", devices)
	fmt.Println()
}

获取磁盘相关信息
可以通过gopsutil获取磁盘分区、磁盘使用率和磁盘IO信息

disk.Partitions()

提供有关文件系统挂载点的信息。

d1, _ := disk.Partitions(true) //所有分区
fmt.Println("有关文件系统挂载点的信息:", d1)

这段文本提供了有关文件系统挂载点的信息。

“device”: 表示这是哪个盘。(有多少个盘就输出多少条信息)
“mountpoint”: 表示文件系统被挂载到哪个盘。
“fstype”: 文件系统类型为NTFS。
“opts”: 挂载选项包括读写权限(rw)和启用压缩(compress)。

这些信息提供了关于系统中不同磁盘分区的文件系统类型以及它们的挂载点和挂载选项的详细信息。

disk.Usage()

返回指定某路径的硬盘使用情况

d2, _ := disk.Usage("E:") //指定某路径的硬盘使用情况
fmt.Println("指定E硬盘使用情况:", d2)

这段文本提供了有关文件系统的详细信息

1.“path”: “E:”,表示这是E盘的文件系统。
2.“fstype”: “”,文件系统类型为空字符串,可能是由于无法获取文件系统类型的信息。
3.“total”: 总容量字节。
4.“free”: 可用容量字节。
5.“used”: 已使用容量字节。
6.“usedPercent”: 已使用容量的百分比。
7.“inodesTotal”: inode 是文件系统中用于存储文件元数据的数据结构。
8.“inodesUsed”: 已使用的 inode 数
9.“inodesFree”: 空闲的 inode 数
10.“inodesUsedPercent”: 已使用 inode 的百分比

这些信息提供了关于文件系统容量、使用情况以及inode相关的统计数据。请注意,由于 “fstype” 字段为空,我们无法确定具体的文件系统类型。

disk.IOCounters()

返回关于磁盘分区的输入/输出(I/O)统计信息

d3, _ := disk.IOCounters() //所有硬盘的io信息
fmt.Println("关于磁盘分区的输入/输出(I/O)统计信息:", d3)

这段文本提供了关于磁盘分区的输入/输出(I/O)统计信息。

PS: 有多少个磁盘分区返回多少个 为减少篇幅 这里只展示分区的信息

分区的信息:

2.“readCount”: 读取操作的次数为
3.“mergedReadCount”: 合并的读取操作次数
4.“writeCount”:写入操作的次数
5."mergedWriteCount"合并的写入操作次数
6.“readBytes”: 读取的字节数字
7.“writeBytes”: 写入的字节数
8.“readTime”:读取操作所花费的时间
9.“writeTime”: 写入操作所花费的时间( 毫秒)
10.“iopsInProgress”: 进行中的 I/O 操作数
11.“ioTime”: I/O 操作所花费的总时间( 毫秒)
12.“weightedIO”: 加权 I/O 操作数
13.“name”: 分区的名称
14.“serialNumber”: 序列号
15.“label”: 标签

这些信息提供了关于每个磁盘分区的读取和写入操作次数、字节数以及相关计时和状态的详细信息。

disk.FileFileCompression

返回文件压缩情况

compression := disk.FileFileCompression
fmt.Println("返回文件压缩情况",compression)

disk.FileReadOnlyVolume
返回只读文件卷的数量

volume := disk.FileReadOnlyVolume
fmt.Println("返回只读文件卷的数量",volume)

Diskdemo

package main

import (
	"fmt"
	"github.com/shirou/gopsutil/disk"
)

func main() {
	//可以通过psutil获取磁盘分区、磁盘使用率和磁盘IO信息
	d1, _ := disk.Partitions(true) //所有分区
	fmt.Println("有关文件系统挂载点的信息:", d1)
	fmt.Println()
	d2, _ := disk.Usage("E:") //指定某路径的硬盘使用情况
	fmt.Println("指定E硬盘使用情况:", d2)
	fmt.Println()
	d3, _ := disk.IOCounters() //所有硬盘的io信息
	fmt.Println("关于磁盘分区的输入/输出(I/O)统计信息:", d3)
	fmt.Println()
	compression := disk.FileFileCompression
	fmt.Println("返回文件压缩情况", compression)
	fmt.Println()

	volume := disk.FileReadOnlyVolume
	fmt.Println("返回只读文件卷的数量", volume)
}

结果如下:

d1: [{“device”:“C:”,“mountpoint”:“C:”,“fstype”:“NTFS”,“opts”:“rw.compress”} {“de
vice”:“D:”,“mountpoint”:“D:”,“fstype”:“NTFS”,“opts”:“rw.compress”} {“device”:"E:
",“mountpoint”:“E:”,“fstype”:“NTFS”,“opts”:“rw.compress”}]

d2: {“path”:“E:”,“fstype”:“”,“total”:392011911168,“free”:382105882624,“used”:990
6028544,“usedPercent”:2.5269713143371018,“inodesTotal”:0,“inodesUsed”:0,“inodesF
ree”:0,“inodesUsedPercent”:0}

d3: map[C::{“readCount”:589916,“mergedReadCount”:0,“writeCount”:527034,“mergedWr
iteCount”:0,“readBytes”:15385129984,“writeBytes”:11449491968,“readTime”:259,“wri
teTime”:134,“iopsInProgress”:0,“ioTime”:0,“weightedIO”:0,“name”:“C:”,“serialNumb
er”:“”,“label”:“”} D::{“readCount”:57547,“mergedReadCount”:0,“writeCount”:13237,
“mergedWriteCount”:0,“readBytes”:2350532608,“writeBytes”:495710208,“readTime”:19
,“writeTime”:1,“iopsInProgress”:0,“ioTime”:0,“weightedIO”:0,“name”:“D:”,“serialN
umber”:“”,“label”:“”} E::{“readCount”:780,“mergedReadCount”:0,“writeCount”:80,“m
ergedWriteCount”:0,“readBytes”:16965632,“writeBytes”:1327104,“readTime”:0,“write
Time”:0,“iopsInProgress”:0,“ioTime”:0,“weightedIO”:0,“name”:“E:”,“serialNumber”:
“”,“label”:“”}]

16

524288

获取当前网络连接信息

net.Connections()
	n1, _ := net.Connections("tcp") //可填入tcp、udp、tcp4、udp4等等
	fmt.Println("获取当前网络连接信息:", n1)
	fmt.Println()

返回如下信息:

fd: 文件描述符(File Descriptor)
family: 地址族
type: 连接类型
localaddr: 本地地址为 IPv6 地址,端口号。
remoteaddr: 远程地址为 IPv6 地址 ,端口号。
status: 连接状态为 “LISTEN”,表示正在监听连接请求。
uids: 用户标识
pid: 进程标识

每个记录都类似地描述了一个网络连接的相关信息,包括本地和远程地址、端口、连接状态等。如果你有特定的问题或者需要对其他记录进行翻译和解释,请提供更多的上下文。

net.IOCounters()

提供了有关网络接口流量和错误统计的详细信息

n2, _ := net.IOCounters(false)
fmt.Println("提供了有关网络接口流量和错误统计的详细信息:", n2)
name: 表示统计的是所有接口的数据。
bytesSent: 发送的字节数
bytesRecv: 接收的字节数
packetsSent: 发送的数据包数
packetsRecv: 接收的数据包数
errin: 接收错误数
errout: 发送错误数
dropin: 接收丢弃的数据包数
dropout: 发送丢弃的数据包数
fifoin: 接收缓冲区的 FIFO 错误数
fifoout: 发送缓冲区的 FIFO 错误数

这组数据提供了有关网络接口流量和错误统计的详细信息,用于监测和分析网络性能。

net.FilterCounters()

返回过滤器计数器

n3, _ := net.FilterCounters()
fmt.Println("过滤器计数器:", n3)

net.Interfaces()
返回关于计算机网络接口的配置信息,其中包括各个接口的索引、MTU(最大传输单元)、名称、硬件地址、标志(flags)和地址信息。

interfaces, _ := net.Interfaces()
fmt.Println(interfaces)

返回信息如下:

返回一组关于计算机网络接口的配置信息,其中包括各个接口的索引、MTU(最大传输单元)、名称、硬件地址、标志(flags)和地址信息。
以下是对每个接口的主要信息的摘要:

1.以太网 (Ethernet) - index 22

2.MTU:
3.名称:
4.硬件地址:
5.标志:
6.地址:
7.IPV6 地址:
8.IPV4地址 :

每个接口都有一个唯一的索引(index),描述了接口的特定属性和配置。硬件地址是物理网络接口的唯一标识符,而地址部分提供了接口的IP地址信息。标志表示接口的一些状态,如是否启用广播和多播。

IOdemo

package main

import (
	"fmt"

	"github.com/shirou/gopsutil/net"
)

func main() {
	//获取当前网络连接信息
	n1, _ := net.Connections("tcp") //可填入tcp、udp、tcp4、udp4等等
	fmt.Println("获取当前网络连接信息:", n1)
	fmt.Println()

	//获取网络读写字节/包的个数
	n2, _ := net.IOCounters(false)
	fmt.Println("获取网络读写字节/包的个数:", n2)
	fmt.Println()

	n3, _ := net.FilterCounters()
	fmt.Println("过滤器计数器:", n3)

	fmt.Println()
	interfaces, _ := net.Interfaces()
	fmt.Println(interfaces)

}

获取主机信息

host.Info()

提供了有关本机信息的详细信息。

	h, _ := host.Info()
	fmt.Println("本机信息:", h)

返回如下信息:

这段文本这段文本提供了有关本机信息的详细信息。

1.“hostname”: 主机名。
2.“uptime”: 系统运行时间(以秒为单位)
3.“bootTime”: 系统启动时间的时间戳,
4.“procs”: 当前运行的进程数
5.“os”: 操作系统类型
6.“platform”: 操作系统的具体版本
7.“platformFamily”: 操作系统家族
8.“platformVersion”: 操作系统版本
9.“kernelVersion”: 内核版本
10.“kernelArch”: 内核架构
11.“virtualizationSystem”: 虚拟化系统信息
12.“virtualizationRole”: 虚拟化角色
13.“hostid”: 主机ID

这些信息提供了有关计算机系统的多个方面的详细信息,包括主机名、运行时间、操作系统类型和版本、内核信息以及虚拟化状态。

hostdemo

package main

import (
	"fmt"
	"github.com/shirou/gopsutil/host"
)

func main() {
	h, _ := host.Info()
	fmt.Println("本机信息:", h)

}

结尾
通过本文的介绍,我们不仅了解了如何使用gopsutil库来获取服务器资源信息,还学习了一些高级技巧和策略,如异步获取、性能优化和异常处理等。这些技能可以帮助我们更加深入地了解服务器的运行情况,并有效地管理和优化资源利用。随着对服务器管理和性能优化的需求不断增长,掌握这些技巧将成为每位系统管理员和开发人员的必备能力。

如果觉得我的文章对您有用,请随意赞赏。您的支持将鼓励我继续创作!