File: sys_linux.go

package info (click to toggle)
singularity-container 4.1.5%2Bds4-1
  • links: PTS, VCS
  • area: main
  • in suites: sid
  • size: 43,876 kB
  • sloc: asm: 14,840; sh: 3,190; ansic: 1,751; awk: 414; makefile: 413; python: 99
file content (93 lines) | stat: -rw-r--r-- 2,019 bytes parent folder | download | duplicates (3)
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
}