1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93
|
package resources
import (
"os"
"time"
resourcestypes "github.com/moby/buildkit/executor/resources/types"
"github.com/prometheus/procfs"
)
func newSysSampler() (*Sampler[*resourcestypes.SysSample], error) {
pfs, err := procfs.NewDefaultFS()
if err != nil {
return nil, err
}
return NewSampler(2*time.Second, 20, func(tm time.Time) (*resourcestypes.SysSample, error) {
return sampleSys(pfs, tm)
}), nil
}
func sampleSys(proc procfs.FS, tm time.Time) (*resourcestypes.SysSample, error) {
stat, err := proc.Stat()
if err != nil {
return nil, err
}
s := &resourcestypes.SysSample{
Timestamp_: tm,
}
s.CPUStat = &resourcestypes.SysCPUStat{
User: stat.CPUTotal.User,
Nice: stat.CPUTotal.Nice,
System: stat.CPUTotal.System,
Idle: stat.CPUTotal.Idle,
Iowait: stat.CPUTotal.Iowait,
IRQ: stat.CPUTotal.IRQ,
SoftIRQ: stat.CPUTotal.SoftIRQ,
Steal: stat.CPUTotal.Steal,
Guest: stat.CPUTotal.Guest,
GuestNice: stat.CPUTotal.GuestNice,
}
s.ProcStat = &resourcestypes.ProcStat{
ContextSwitches: stat.ContextSwitches,
ProcessCreated: stat.ProcessCreated,
ProcessesRunning: stat.ProcessesRunning,
}
mem, err := proc.Meminfo()
if err != nil {
return nil, err
}
s.MemoryStat = &resourcestypes.SysMemoryStat{
Total: mem.MemTotal,
Free: mem.MemFree,
Buffers: mem.Buffers,
Cached: mem.Cached,
Active: mem.Active,
Inactive: mem.Inactive,
Swap: mem.SwapTotal,
Available: mem.MemAvailable,
Dirty: mem.Dirty,
Writeback: mem.Writeback,
Slab: mem.Slab,
}
if _, err := os.Lstat("/proc/pressure"); err != nil {
return s, nil
}
cp, err := parsePressureFile("/proc/pressure/cpu")
if err != nil {
return nil, err
}
s.CPUPressure = cp
mp, err := parsePressureFile("/proc/pressure/memory")
if err != nil {
return nil, err
}
s.MemoryPressure = mp
ip, err := parsePressureFile("/proc/pressure/io")
if err != nil {
return nil, err
}
s.IOPressure = ip
return s, nil
}
|