gopsutils System Information Library
ที่เก็บข้อมูล: shirou/gopsutil: psutil for golang (github.com)
เอกสาร: gopsutil package - github.com/shirou/gopsutil/v3 - Go Packages
ในการพัฒนาโปรแกรม มักจำเป็นต้องรับข้อมูลระบบที่โปรแกรมอนุญาต กระบวนการนี้เกี่ยวข้องกับการเรียกใช้ระบบของระบบปฏิบัติการต่างๆ เพื่อทำการ适配ต้องใช้เวลาและงานจำนวนมาก gopsutils เป็นไลบรารีข้อมูลระบบที่พัฒนาด้วยภาษา go รองรับระบบปฏิบัติการหลักหลายระบบ ปัจจุบันรองรับสถาปัตยกรรมระบบต่อไปนี้:
- FreeBSD i386/amd64/arm
- Linux i386/amd64/arm(raspberry pi)
- Windows i386/amd64/arm/arm64
- Darwin amd64/arm64
- OpenBSD amd64 (ขอบคุณ @mpfz0r!)
- Solaris amd64 (พัฒนาและทดสอบบน SmartOS/Illumos ขอบคุณ @jen20!)
รองรับบางส่วน:
- CPU บน DragonFly BSD
- host บน Linux RISC-V
และเครื่องมือนี้ยังรองรับการรับข้อมูลระบบของ Docker container
การติดตั้ง
ใช้คำสั่ง go get เพื่อติดตั้ง
go get github.com/shirou/gopsutil/v3TIP
ผู้เขียนเขียนบทความนี้บนระบบ Win10 ระบบที่แตกต่างกันอาจมีผลลัพธ์ต่างกัน
Host
API ที่เกี่ยวข้องกับ host มีให้โดย package host มีการ适配สำหรับระบบปฏิบัติการต่างๆ
ข้อมูล
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"
}API อื่นๆ ใน package นี้เป็นการแยกส่วนของ Info() ไม่ได้สาธิตอีกต่อไป โปรดศึกษาด้วยตนเอง
CPU
ข้อมูลที่เกี่ยวข้องกับ CPU มีให้โดย package cpu มีฟังก์ชันหลัก 4 ฟังก์ชันสำหรับรับข้อมูล CPU จำนวนคอร์ อัตราการใช้ เวลา slice เอาต์พุตในรูปแบบ JSON จะดูเป็นมิตรกว่า
ข้อมูล
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": ""
}
]จำนวนคอร์
func Counts(logical bool) (int, error)func main() {
cores, _ := cpu.Counts(true)
JsonPrint(cores)
}8อัตราการใช้
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
]เวลา 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
}
]Disk
ฟังก์ชันที่เกี่ยวข้องกับ disk มีให้โดย package disk บางส่วนออกแบบมาสำหรับ Linux
อัตราการใช้
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
}สถานะพาร์ติชัน
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": ""
}
}Memory
API ที่เกี่ยวข้องกับ memory มีให้โดย package mem
ข้อมูล
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
}Swap Memory
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
}Swap Devices
func SwapDevices() ([]*SwapDevice, error)func main() {
devices, _ := mem.SwapDevices()
JsonPrint(devices)
}[
{
"name": "C:\\pagefile.sys",
"usedBytes": 107663360,
"freeBytes": 2442473472
}
]