38 lines
865 B
Go
38 lines
865 B
Go
// +build darwin freebsd netbsd openbsd
|
|
// +build !cgo
|
|
|
|
package loadavg
|
|
|
|
import (
|
|
"fmt"
|
|
"unsafe"
|
|
|
|
"golang.org/x/sys/unix"
|
|
)
|
|
|
|
func get() (*Stats, error) {
|
|
ret, err := unix.SysctlRaw("vm.loadavg")
|
|
if err != nil {
|
|
return nil, fmt.Errorf("failed in sysctl vm.loadavg: %s", err)
|
|
}
|
|
return collectLoadavgStats(ret)
|
|
}
|
|
|
|
// loadavg in sys/sysctl.h
|
|
type loadStruct struct {
|
|
Ldavg [3]uint32
|
|
Fscale uint64
|
|
}
|
|
|
|
// Reference: sys/sysctl.h
|
|
func collectLoadavgStats(out []byte) (*Stats, error) {
|
|
if len(out) != 24 {
|
|
return nil, fmt.Errorf("unexpected output of sysctl vm.loadavg: %v (len: %d)", out, len(out))
|
|
}
|
|
load := *(*loadStruct)(unsafe.Pointer(&out[0]))
|
|
return &Stats{
|
|
Loadavg1: float64(load.Ldavg[0]) / float64(load.Fscale),
|
|
Loadavg5: float64(load.Ldavg[1]) / float64(load.Fscale),
|
|
Loadavg15: float64(load.Ldavg[2]) / float64(load.Fscale),
|
|
}, nil
|
|
}
|