zdebug.go 1.24 KB
Newer Older
Vladimir Barsukov's avatar
zdebug  
Vladimir Barsukov committed
1
2
3
4
package zdebug

import (
	"fmt"
Vladimir Barsukov's avatar
Vladimir Barsukov committed
5
	"git.barsukov.pro/barsukov/zgo/zutils"
Vladimir Barsukov's avatar
zdebug  
Vladimir Barsukov committed
6
	"runtime"
Vladimir Barsukov's avatar
Vladimir Barsukov committed
7
	"strings"
Vladimir Barsukov's avatar
zdebug  
Vladimir Barsukov committed
8
9
10
11
	"time"
)

type Monitor struct {
Vladimir Barsukov's avatar
fix    
Vladimir Barsukov committed
12
13
14
15
	Alloc     uint64 `json:",omitempty"`
	HeapInuse uint64 `json:",omitempty"`
	MaxAlloc  uint64 `json:",omitempty"`
	MaxSys    uint64 `json:",omitempty"`
Vladimir Barsukov's avatar
zdebug  
Vladimir Barsukov committed
16

Vladimir Barsukov's avatar
fix    
Vladimir Barsukov committed
17
18
19
20
	LiveObjects uint64 `json:",omitempty"`

	NumGC        uint32 `json:",omitempty"`
	NumGoroutine int    `json:",omitempty"`
Vladimir Barsukov's avatar
zdebug  
Vladimir Barsukov committed
21
22
}

Vladimir Barsukov's avatar
fix    
Vladimir Barsukov committed
23
24
const mb = 1024 * 1024

Vladimir Barsukov's avatar
zdebug  
Vladimir Barsukov committed
25
26
27
func NewMonitor(secs int) {
	go func() {
		var rtm runtime.MemStats
Vladimir Barsukov's avatar
fix    
Vladimir Barsukov committed
28
29
		var memMax uint64

Vladimir Barsukov's avatar
zdebug  
Vladimir Barsukov committed
30
		for {
Vladimir Barsukov's avatar
fix    
Vladimir Barsukov committed
31
			<-time.After(time.Duration(secs) * time.Second)
Vladimir Barsukov's avatar
zdebug  
Vladimir Barsukov committed
32
33
34

			runtime.ReadMemStats(&rtm)

Vladimir Barsukov's avatar
fix    
Vladimir Barsukov committed
35
36
			mem := ((rtm.HeapIdle - rtm.HeapReleased) + (rtm.Alloc + rtm.HeapInuse)) / 1e6
			memMax = max(memMax, mem)
Vladimir Barsukov's avatar
zdebug  
Vladimir Barsukov committed
37

Vladimir Barsukov's avatar
fix    
Vladimir Barsukov committed
38
39
40
41
42
43
44
			fmt.Printf("Z_DEBUG: MEM: %v; MEM_MAX: %v; OBJ: %v, GO: %v, GC: %v\n",
				mem,
				memMax,
				(rtm.Mallocs-rtm.Frees)/1e3,
				runtime.NumGoroutine(),
				rtm.NumGC,
			)
Vladimir Barsukov's avatar
zdebug  
Vladimir Barsukov committed
45
46
47
		}
	}()
}
Vladimir Barsukov's avatar
Vladimir Barsukov committed
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68

func Trace() []string {
	var out []string

	pc := make([]uintptr, 10)
	runtime.Callers(2, pc)

	for i := range pc {
		if f := runtime.FuncForPC(pc[i]); f != nil {
			file, line := f.FileLine(pc[i])

			if strings.Contains(file, "go/pkg") {
				continue
			}

			out = append(out, fmt.Sprintf("%s:%d", f.Name(), line))
		}
	}

	return zutils.ArrayUnique(out)
}