82 lines · 1.4 KB · Go
RawDownload
package util9 import (	"io"	"os"	"strconv"	"strings") type Sysstat struct {	Cpu             uint64	ContextSwitches uint64	Interrupts      uint64	SystemCalls     uint64	PageFaults      uint64	TLBFaults       uint64	TLBPurges       uint64	LoadAverage     uint64	IdleTime        uint64	InterruptTime   uint64} var devsysstat io.ReaderAtvar devsysstaterror error func init() {	dstat, err := os.Open("/dev/sysstat")	if err != nil {		devsysstaterror = err		return	} 	devsysstat = dstat} func ReadSysstat() ([]Sysstat, error) {	if devsysstat == nil {		return nil, devsysstaterror	} 	buf := make([]byte, 8192) 	n, err := devsysstat.ReadAt(buf, 0)	if n <= 0 && err != nil {		return nil, err	} 	buf = buf[:n] 	spl := strings.Split(string(buf), "\n") 	var stats []Sysstat 	for _, l := range spl {		splnum := strings.Fields(l)		if len(splnum) != 10 {			continue		} 		stat := Sysstat{} 		stat.Cpu = atoi(splnum[0])		stat.ContextSwitches = atoi(splnum[1])		stat.Interrupts = atoi(splnum[2])		stat.SystemCalls = atoi(splnum[3])		stat.PageFaults = atoi(splnum[4])		stat.TLBFaults = atoi(splnum[5])		stat.TLBPurges = atoi(splnum[6])		stat.LoadAverage = atoi(splnum[7])		stat.IdleTime = atoi(splnum[8])		stat.InterruptTime = atoi(splnum[9]) 		stats = append(stats, stat)	} 	return stats, nil} func atoi(n string) uint64 {	v, _ := strconv.ParseUint(n, 10, 64)	return v}