diff --git a/debug/debug.go b/debug/debug.go new file mode 100644 index 000000000..6359f1008 --- /dev/null +++ b/debug/debug.go @@ -0,0 +1,66 @@ +package debug + +import ( + "bufio" + "fmt" + "os" + "sort" + "strconv" + "strings" +) + +// Smaps prints the smaps to a file +func Smaps(note, file string) error { + smaps, err := getMaps(os.Getpid()) + if err != nil { + return err + } + f, err := os.OpenFile(file, os.O_CREATE|os.O_WRONLY|os.O_APPEND, 0666) + if err != nil { + return err + } + defer f.Close() + fmt.Fprintf(f, "%s: rss %d\n", note, smaps["rss"]) + fmt.Fprintf(f, "%s: pss %d\n", note, smaps["pss"]) + return nil +} + +func getMaps(pid int) (map[string]int, error) { + f, err := os.Open(fmt.Sprintf("/proc/%d/smaps", pid)) + if err != nil { + return nil, err + } + defer f.Close() + var ( + smaps = make(map[string]int) + s = bufio.NewScanner(f) + ) + for s.Scan() { + var ( + fields = strings.Fields(s.Text()) + name = fields[0] + ) + name = strings.TrimSuffix(strings.ToLower(name), ":") + if len(fields) < 2 { + continue + } + n, err := strconv.Atoi(fields[1]) + if err != nil { + continue + } + smaps[name] += n + } + if err := s.Err(); err != nil { + return nil, err + } + return smaps, nil +} + +func keys(smaps map[string]int) []string { + var o []string + for k := range smaps { + o = append(o, k) + } + sort.Strings(o) + return o +}