// package proc contains functionality to read proc status files. package proc import ( "strconv" "strings" ) // ProcStatus holds information regarding the memory usage of // an executing process. The memory sizes in each of the field // is in bytes. type ProcStatus struct { // Process PID. pid int // Peak virtual memory size. VmPeak uint64 // Virtual memory size. VmSize uint64 // Locked Memory size. VmLck uint64 // Pinned memory size. VmPin uint64 // Peak resident set size. VmHWM uint64 // Resident set size (sum of RssAnon, RssFile and RssShmem). VmRss uint64 // Size of resident anonymous memory. RssAnon uint64 // Size of resident shared memory. RssShmem uint64 // Size of data segments. VmData uint64 // Size of stack segments. VmStk uint64 //Size of text segments. VmExe uint64 //Shared library code size. VmLib uint64 // Page table entries size. VmPTE uint64 // Size of second-level page tables. VmPMD uint64 // Swapped-out virtual memory size by anonymous private. VmSwap uint64 // Size of hugetlb memory page size. HugetlbPages uint64 } // fillProcStatus takes the key and value, converts the value // to the proper size unit and is stored in the ProcStatus. func fillProcStatus(s *ProcStatus, key, value string) { v := strToUint64(value) switch key { case "VmPeak": s.VmPeak = v case "VmSize": s.VmSize = v case "VmLck": s.VmLck = v case "VmPin": s.VmPin = v case "VmHWM": s.VmHWM = v case "VmRSS": s.VmRss = v case "RssAnon": s.RssAnon = v case "RssShmem": s.RssShmem = v case "VmData": s.VmData = v case "VmStk": s.VmStk = v case "VmExe": s.VmExe = v case "VmLib": s.VmLib = v case "VmPTE": s.VmPTE = v case "VmPMD": s.VmPMD = v case "VmSwap": s.VmSwap = v case "HugetlbPages": s.HugetlbPages = v } } // strToUint64 takes the string and converts to unsigned 64-bit integer. // If the string contains a memory unit such as kB and is converted to // bytes. func strToUint64(v string) uint64 { // v could be "1024 kB" so scan for the empty space and // split between the value and the unit. var separatorIndex int if separatorIndex = strings.IndexAny(v, " "); separatorIndex < 0 { separatorIndex = len(v) } value, err := strconv.ParseUint(v[:separatorIndex], 10, 64) if err != nil { return 0 } var scale uint64 = 1 switch strings.TrimSpace(v[separatorIndex:]) { case "kB", "KB": scale = 1024 case "mB", "MB": scale = 1024 * 1024 } return value * scale }