gopsutils Libreria Informazioni di Sistema
Repository: shirou/gopsutil: psutil for golang (github.com)
Documentazione: gopsutil package - github.com/shirou/gopsutil/v3 - Go Packages
Durante lo sviluppo, è spesso necessario ottenere le informazioni di sistema consentite dal programma, il processo coinvolge chiamate di sistema di diversi sistemi operativi. Per fare tutto il lavoro di adattamento richiede molto tempo, mentre gopsutils è una libreria di informazioni di sistema sviluppata in Go, compatibile con molti sistemi operativi mainstream, attualmente supporta le seguenti architetture di sistema:
- FreeBSD i386/amd64/arm
- Linux i386/amd64/arm(raspberry pi)
- Windows i386/amd64/arm/arm64
- Darwin amd64/arm64
- OpenBSD amd64 (Grazie a @mpfz0r!)
- Solaris amd64 (sviluppato e testato su SmartOS/Illumos, Grazie a @jen20!)
Supporto parziale:
- CPU su DragonFly BSD
- host su Linux RISC-V
E questo strumento supporta anche le informazioni di sistema dei container Docker.
Installazione
Installa con il comando go get
go get github.com/shirou/gopsutil/v3TIP
L'autore ha scritto questo articolo su sistema Win10, i risultati possono variare su sistemi diversi.
Host
Le API relative all'host sono fornite dal pacchetto host, adattato per diversi sistemi operativi.
Informazioni
func Info() (*InfoStat, error)func main() {
info, _ := host.Info()
JsonPrint(info)
}{
"hostname": "LAPTOP-8C92S0HL",
"uptime": 490854,
"bootTime": 1683909241,
"procs": 195,
"os": "windows",
"platform": "Microsoft Windows 10 Home China",
"platformFamily": "Standalone Workstation",
"platformVersion": "10.0.19044.2251 Build 19044.2251",
"kernelVersion": "10.0.19044.2251 Build 19044.2251",
"kernelArch": "x86_64",
"virtualizationSystem": "",
"virtualizationRole": "",
"hostId": "ba697a8c-c555-4329-905c-adc6cb650dde"
}Le altre API in questo pacchetto sono decomposizioni di Info(), non dimostrate qui, da esplorare autonomamente.
CPU
Le informazioni relative alla CPU sono fornite dal pacchetto cpu, che fornisce principalmente 4 funzioni per ottenere informazioni CPU, numero di core, utilizzo, time slice, l'output in formato JSON è più amichevole per l'osservazione.
Informazioni
func Info() ([]InfoStat, error)func main() {
info, _ := cpu.Info()
JsonPrint(info)
}[
{
"cpu": 0,
"vendorId": "GenuineIntel",
"family": "198",
"model": "",
"stepping": 0,
"physicalId": "BFEBFBFF000806EC",
"coreId": "",
"cores": 8,
"modelName": "Intel(R) Core(TM) i7-8565U CPU @ 1.80GHz",
"mhz": 1992,
"cacheSize": 0,
"flags": [],
"microcode": ""
}
]Numero di Core
func Counts(logical bool) (int, error)func main() {
cores, _ := cpu.Counts(true)
JsonPrint(cores)
}8Utilizzo
func Percent(interval time.Duration, percpu bool) ([]float64, error)func main() {
percents, _ := cpu.Percent(time.Second*5, true)
JsonPrint(percents)
}[
4.643962848297214, 4.049844236760125, 5.607476635514018, 5.29595015576324,
3.115264797507788, 2.803738317757009, 3.115264797507788, 2.1806853582554515
]Time Slice
func Times(percpu bool) ([]TimesStat, error)func main() {
times, _ := cpu.Times(true)
JsonPrint(times)
}[
{
"cpu": "cpu0",
"user": 250.28125,
"system": 176.828125,
"idle": 2537.96875,
"nice": 0,
"iowait": 0,
"irq": 11.453125,
"softirq": 0,
"steal": 0,
"guest": 0,
"guestNice": 0
},
{
"cpu": "cpu1",
"user": 180.421875,
"system": 115.078125,
"idle": 2669.3125,
"nice": 0,
"iowait": 0,
"irq": 4.125,
"softirq": 0,
"steal": 0,
"guest": 0,
"guestNice": 0
},
{
"cpu": "cpu2",
"user": 298.171875,
"system": 143.46875,
"idle": 2523.171875,
"nice": 0,
"iowait": 0,
"irq": 2.96875,
"softirq": 0,
"steal": 0,
"guest": 0,
"guestNice": 0
},
{
"cpu": "cpu3",
"user": 234.890625,
"system": 134.3125,
"idle": 2595.609375,
"nice": 0,
"iowait": 0,
"irq": 1.53125,
"softirq": 0,
"steal": 0,
"guest": 0,
"guestNice": 0
},
{
"cpu": "cpu4",
"user": 249.78125,
"system": 122.609375,
"idle": 2592.421875,
"nice": 0,
"iowait": 0,
"irq": 2.25,
"softirq": 0,
"steal": 0,
"guest": 0,
"guestNice": 0
},
{
"cpu": "cpu5",
"user": 262.875,
"system": 162.546875,
"idle": 2539.390625,
"nice": 0,
"iowait": 0,
"irq": 1.90625,
"softirq": 0,
"steal": 0,
"guest": 0,
"guestNice": 0
},
{
"cpu": "cpu6",
"user": 271.296875,
"system": 122.40625,
"idle": 2571.109375,
"nice": 0,
"iowait": 0,
"irq": 2.125,
"softirq": 0,
"steal": 0,
"guest": 0,
"guestNice": 0
},
{
"cpu": "cpu7",
"user": 239.328125,
"system": 104.03125,
"idle": 2621.4375,
"nice": 0,
"iowait": 0,
"irq": 1.875,
"softirq": 0,
"steal": 0,
"guest": 0,
"guestNice": 0
}
]Disco
Le funzioni relative al disco sono fornite dal pacchetto disk, alcune sono progettate per Linux.
Utilizzo
func Usage(path string) (*UsageStat, error)func main() {
use, _ := disk.Usage("/")
JsonPrint(use)
}{
"path": "/",
"fstype": "",
"total": 274152288256,
"free": 251611193344,
"used": 22541094912,
"usedPercent": 8.22210715635224,
"inodesTotal": 0,
"inodesUsed": 0,
"inodesFree": 0,
"inodesUsedPercent": 0
}Partizioni
func Partitions(all bool) ([]PartitionStat, error)func main() {
part, _ := disk.Partitions(true)
JsonPrint(part)
}[
{
"device": "C:",
"mountpoint": "C:",
"fstype": "NTFS",
"opts": ["rw", "compress"]
},
{
"device": "D:",
"mountpoint": "D:",
"fstype": "NTFS",
"opts": ["rw", "compress"]
},
{
"device": "E:",
"mountpoint": "E:",
"fstype": "FAT32",
"opts": ["rw"]
}
]IO
func IOCounters(names ...string) (map[string]IOCountersStat, error)func main() {
part, _ := disk.IOCounters("/")
JsonPrint(part)
}{
"C:": {
"readCount": 435914,
"mergedReadCount": 0,
"writeCount": 640313,
"mergedWriteCount": 0,
"readBytes": 10356509696,
"writeBytes": 16957500928,
"readTime": 209,
"writeTime": 127,
"iopsInProgress": 0,
"ioTime": 0,
"weightedIO": 0,
"name": "C:",
"serialNumber": "",
"label": ""
},
"D:": {
"readCount": 65907,
"mergedReadCount": 0,
"writeCount": 12141,
"mergedWriteCount": 0,
"readBytes": 3079766528,
"writeBytes": 518916608,
"readTime": 24,
"writeTime": 7,
"iopsInProgress": 0,
"ioTime": 0,
"weightedIO": 0,
"name": "D:",
"serialNumber": "",
"label": ""
}
}Memoria
Le API relative alla memoria sono fornite dal pacchetto mem
Informazioni
func VirtualMemory() (*VirtualMemoryStat, error)func main() {
memory, _ := mem.VirtualMemory()
JsonPrint(memory)
}{
"total": 17018114048,
"available": 5477023744,
"used": 11541090304,
"usedPercent": 67,
"free": 5477023744,
"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,
"hugePagesRsvd": 0,
"hugePagesSurp": 0,
"hugePageSize": 0
}Memoria Swap
func SwapMemory() (*SwapMemoryStat, error)func main() {
memory, _ := mem.SwapMemory()
JsonPrint(memory)
}{
"total": 19568250880,
"used": 12943368192,
"free": 6624882688,
"usedPercent": 66.14473757196637,
"sin": 0,
"sout": 0,
"pgIn": 0,
"pgOut": 0,
"pgFault": 0,
"pgMajFault": 0
}Dispositivi Swap
func SwapDevices() ([]*SwapDevice, error)func main() {
devices, _ := mem.SwapDevices()
JsonPrint(devices)
}[
{
"name": "C:\\pagefile.sys",
"usedBytes": 107663360,
"freeBytes": 2442473472
}
]