mirror of
https://github.com/shirou/gopsutil.git
synced 2025-05-02 22:17:08 +08:00

In order to improve performance and help prevent crashes due to the outstanding fork crash bug: https://github.com/golang/go/issues/15658 Replace string parsed values from the sysctl command with native reads of sysctl values using unix.SysctlRaw and unix.SysctlUint32. This also merges OpenBSD and FreeBSD load implementations which are identical.
60 lines
1.2 KiB
Go
60 lines
1.2 KiB
Go
// +build freebsd openbsd
|
|
|
|
package load
|
|
|
|
import (
|
|
"os/exec"
|
|
"strings"
|
|
"unsafe"
|
|
|
|
"golang.org/x/sys/unix"
|
|
)
|
|
|
|
func Avg() (*AvgStat, error) {
|
|
// This SysctlRaw method borrowed from
|
|
// https://github.com/prometheus/node_exporter/blob/master/collector/loadavg_freebsd.go
|
|
type loadavg struct {
|
|
load [3]uint32
|
|
scale int
|
|
}
|
|
b, err := unix.SysctlRaw("vm.loadavg")
|
|
if err != nil {
|
|
return nil, err
|
|
}
|
|
load := *(*loadavg)(unsafe.Pointer((&b[0])))
|
|
scale := float64(load.scale)
|
|
ret := &AvgStat{
|
|
Load1: float64(load.load[0]) / scale,
|
|
Load5: float64(load.load[1]) / scale,
|
|
Load15: float64(load.load[2]) / scale,
|
|
}
|
|
|
|
return ret, nil
|
|
}
|
|
|
|
// Misc returns miscellaneous host-wide statistics.
|
|
// darwin use ps command to get process running/blocked count.
|
|
// Almost same as Darwin implementation, but state is different.
|
|
func Misc() (*MiscStat, error) {
|
|
bin, err := exec.LookPath("ps")
|
|
if err != nil {
|
|
return nil, err
|
|
}
|
|
out, err := invoke.Command(bin, "axo", "state")
|
|
if err != nil {
|
|
return nil, err
|
|
}
|
|
lines := strings.Split(string(out), "\n")
|
|
|
|
ret := MiscStat{}
|
|
for _, l := range lines {
|
|
if strings.Contains(l, "R") {
|
|
ret.ProcsRunning++
|
|
} else if strings.Contains(l, "D") {
|
|
ret.ProcsBlocked++
|
|
}
|
|
}
|
|
|
|
return &ret, nil
|
|
}
|