拓冰建站拓冰建站
首页 / 资讯中心 / 正文

gopsutil disk与load包详解:磁盘分区、IO计数器、系统负载一次看全

gopsutil disk与load包详解磁盘分区、IO计数器、系统负载一次看全【免费下载链接】gopsutilpsutil for golang项目地址: https://gitcode.com/gh_mirrors/go/gopsutil想在 Go 程序里监控磁盘空间、磁盘IO和系统负载gopsutilGo 版 psutil的disk包和load包就是为此而生的disk.Usage()查磁盘使用率disk.Partitions()枚举分区disk.IOCounters()拿 IO 计数器load.Avg()读 1/5/15 分钟负载。本文带你快速上手这两个包一次搞懂所有核心指标。 快速安装与目录结构一行命令引入依赖v4 是最新大版本go get github.com/shirou/gopsutil/v4两个包都放在独立目录按操作系统拆分实现文件这是 gopsutil 跨平台的经典写法包公共定义Linux 实现说明diskdisk/disk.godisk/disk_linux.go磁盘用量、分区、IO 计数器loadload/load.goload/load_linux.go平均负载、进程统计 disk 包磁盘监控的三大武器disk包的对外 API 集中在 disk/disk.go 中共 5 个函数Usage、Partitions、IOCounters、SerialNumber、Label。1. 磁盘空间使用率disk.Usage()Usage(path)接受文件系统路径如/或C:返回 UsageStat 结构体Total/Free/Used总容量、空闲、已用字节UsedPercent使用率百分比InodesTotal/InodesUsed/InodesFreeinode三元组新手容易忽略inode 耗尽时即使磁盘还有空间也会No space left on deviceFstype文件系统类型如ext4v, err : disk.Usage(/) fmt.Printf(Total: %v, Free: %v, UsedPercent: %.1f%%\n, v.Total, v.Free, v.UsedPercent)⚠️ 传参注意要传挂载点/而不是设备名/dev/vda1见 disk.go 的注释说明。2. 枚举磁盘分区disk.Partitions()Partitions(all)返回 PartitionStat 列表每项包含Device设备、Mountpoint挂载点、Fstype文件系统类型、Opts挂载选项如ro/rw。all参数的含义false默认只返回真实物理设备硬盘、U 盘、光驱过滤掉/dev/shm、proc等虚拟文件系统true返回所有挂载项Linux 实现读取/proc/1/mountinfo旧内核自动回退mounts并处理了 bind mount、/dev/mapper符号链接解析、NVMe 命名归一化等细节见 disk_linux.go。parts, err : disk.Partitions(false) for _, p : range parts { fmt.Println(p.Device, p.Mountpoint, p.Fstype, strings.Join(p.Opts, ,)) }3. 磁盘 IO 计数器disk.IOCounters()IOCounters(names...)返回map[设备名]IOCountersStat不传参数则统计所有磁盘。IOCountersStat 是排查磁盘瓶颈的黄金指标集字段含义ReadCount/WriteCount读/写操作次数IOPS 基数MergedReadCount/MergedWriteCount合并后的操作次数相邻 IO 合并越小说明随机写越少ReadBytes/WriteBytes读/写字节数吞吐量基数ReadTime/WriteTime读/写耗时毫秒可用于算平均延迟IopsInProgress当前正在进行的 IO 数IoTime/WeightedIOIO 占用时间 / 加权 IO 时间算磁盘利用率的利器Name/SerialNumber/Label设备名、序列号、卷标签Linux 特有序列号取自 udev见 disk_linux.go监控场景的常见用法是两次采样求差值间隔 1 秒调用两次IOCounters()用(本次 - 上次) / 1得到每秒的读写字节数和 IOPS这就是 Prometheus 等监控系统的工作原理。 小技巧传入设备名可以只查指定磁盘如disk.IOCounters(sda)支持传/dev/sda或sda两种写法。4. 附加功能序列号与卷标签SerialNumber(/dev/sda)获取物理设备序列号先查 udev 数据再回退 sysfs 的modelserialLabel(/dev/sda)获取 devicemapper 名或 udev 卷标签适合做硬件资产盘点实现细节见 disk_linux.go。 load 包读懂系统负载load包只有两个函数API 定义在 load/load.go。1. 平均负载load.Avg()Avg()返回 AvgStatLoad1、Load5、Load15对应top/uptime显示的 1、5、15 分钟平均负载——系统上平均每分钟处于可运行不可中断状态的任务数。Linux 实现优先读/proc/loadavg失败时回退到sysinfo系统调用位运算还原负载值见 load_linux.gomacOS 则通过sysctl(vm.loadavg)读取见 load_darwin.go。avg, err : load.Avg() fmt.Printf(Load1: %.2f, Load5: %.2f, Load15: %.2f\n, avg.Load1, avg.Load5, avg.Load15) 经验法则负载值 ≈ CPU 核心数时算满载Load1 持续明显高于核心数说明系统在排队等待该扩容或查慢任务了。2. 主机级杂项统计load.Misc()Misc()返回 MiscStatProcsTotal当前进程总数ProcsCreated系统启动以来创建的进程数ProcsRunning正在运行的进程数ProcsBlocked因等待 IO 而阻塞的进程数Ctxt上下文切换次数两次采样求差值可观察调度压力Linux 版从/proc/stat逐行解析得到这些值见 load_linux.gomacOS 版改用ps axo state命令统计见 load_darwin.go。 跨平台支持一览gopsutil 全程不用 cgo把 C 结构体移植成 Go 结构体。两个包的平台覆盖情况功能LinuxmacOSWindowsFreeBSDOpenBSDdisk.Usage✅✅✅✅✅disk.Partitions✅✅✅✅✅disk.IOCounters✅✅✅✅✅disk.SerialNumber / Label✅————load.Avg✅✅✅✅✅load.Misc✅✅✅✅—各平台实现文件命名规律为disk_系统.go/load_系统.go如 disk/disk_windows.goWindows 通过GetDiskFreeSpaceExW、DISK_PERFORMANCE等 API 实现、disk/disk_darwin.gogetfsstat系统调用。 动手验证跑一下测试仓库自带完善的测试用例不用自己造轮子disk/disk_test.goTestUsage、TestPartitions、TestIOCounters各平台的通用测试load/load_test.goTestAvg、TestMisc及基准测试disk/disk_linux_test.go基于testdata/下/proc快照的 Linux 专项测试在你的项目里执行go test ./...或在仓库目录执行即可验证功能可用。 小结一份速查清单需求调用关键返回值磁盘还剩多少空间disk.Usage(/)UsedPercent、Free、InodesFree列出所有挂载的磁盘disk.Partitions(false)Device、Mountpoint、Fstype磁盘读写吞吐与 IOPSdisk.IOCounters()ReadBytes、WriteBytes、ReadCount、IoTime磁盘序列号/标签disk.SerialNumber()/disk.Label()设备序列号、卷标签系统负载load.Avg()Load1、Load5、Load15进程数与上下文切换load.Misc()ProcsRunning、ProcsBlocked、Ctxt记住两个核心习惯IO 指标要两次采样求差值才有每秒意义磁盘空间告警别忘看 inode。掌握以上内容你就能用 gopsutil 的disk与load包写出覆盖磁盘与负载监控的完整 Go 监控程序了 【免费下载链接】gopsutilpsutil for golang项目地址: https://gitcode.com/gh_mirrors/go/gopsutil创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考
分享:

看完干货,该让你的企业上线了

免费需求沟通 · 48 小时内出具建站方案 · 河南本地可上门