blob: f8b734c026c11015fef522b32248d3bd5d41a3fc [file] [log] [blame]
Patrice Arruda04157e12020-12-16 11:21:37 -08001// package proc contains functionality to read proc status files.
2package proc
3
4import (
5 "strconv"
6 "strings"
7)
8
9// ProcStatus holds information regarding the memory usage of
10// an executing process. The memory sizes in each of the field
11// is in bytes.
12type ProcStatus struct {
13 // Process PID.
14 pid int
15
16 // Peak virtual memory size.
17 VmPeak uint64
18
19 // Virtual memory size.
20 VmSize uint64
21
22 // Locked Memory size.
23 VmLck uint64
24
25 // Pinned memory size.
26 VmPin uint64
27
28 // Peak resident set size.
29 VmHWM uint64
30
31 // Resident set size (sum of RssAnon, RssFile and RssShmem).
32 VmRss uint64
33
34 // Size of resident anonymous memory.
35 RssAnon uint64
36
37 // Size of resident shared memory.
38 RssShmem uint64
39
40 // Size of data segments.
41 VmData uint64
42
43 // Size of stack segments.
44 VmStk uint64
45
46 //Size of text segments.
47 VmExe uint64
48
49 //Shared library code size.
50 VmLib uint64
51
52 // Page table entries size.
53 VmPTE uint64
54
55 // Size of second-level page tables.
56 VmPMD uint64
57
58 // Swapped-out virtual memory size by anonymous private.
59 VmSwap uint64
60
61 // Size of hugetlb memory page size.
62 HugetlbPages uint64
63}
64
65// fillProcStatus takes the key and value, converts the value
66// to the proper size unit and is stored in the ProcStatus.
67func fillProcStatus(s *ProcStatus, key, value string) {
68 v := strToUint64(value)
69 switch key {
70 case "VmPeak":
71 s.VmPeak = v
72 case "VmSize":
73 s.VmSize = v
74 case "VmLck":
75 s.VmLck = v
76 case "VmPin":
77 s.VmPin = v
78 case "VmHWM":
79 s.VmHWM = v
80 case "VmRSS":
81 s.VmRss = v
82 case "RssAnon":
83 s.RssAnon = v
84 case "RssShmem":
85 s.RssShmem = v
86 case "VmData":
87 s.VmData = v
88 case "VmStk":
89 s.VmStk = v
90 case "VmExe":
91 s.VmExe = v
92 case "VmLib":
93 s.VmLib = v
94 case "VmPTE":
95 s.VmPTE = v
96 case "VmPMD":
97 s.VmPMD = v
98 case "VmSwap":
99 s.VmSwap = v
100 case "HugetlbPages":
101 s.HugetlbPages = v
102 }
103}
104
105// strToUint64 takes the string and converts to unsigned 64-bit integer.
106// If the string contains a memory unit such as kB and is converted to
107// bytes.
108func strToUint64(v string) uint64 {
109 // v could be "1024 kB" so scan for the empty space and
110 // split between the value and the unit.
111 var separatorIndex int
112 if separatorIndex = strings.IndexAny(v, " "); separatorIndex < 0 {
113 separatorIndex = len(v)
114 }
115 value, err := strconv.ParseUint(v[:separatorIndex], 10, 64)
116 if err != nil {
117 return 0
118 }
119
120 var scale uint64 = 1
121 switch strings.TrimSpace(v[separatorIndex:]) {
122 case "kB", "KB":
123 scale = 1024
124 case "mB", "MB":
125 scale = 1024 * 1024
126 }
127 return value * scale
128}