daangn / autopprof

Automatically profile the Go applications when CPU or memory utilization crosses threshold

Geek Repo:Geek Repo

Github PK Tool:Github PK Tool

Support customizing scan interval

dlsrb6342 opened this issue · comments

  • I think reading stats every 5 seconds could be heavy job
  • so, I want to customize scan interval but it does not support.

Exporting the cgroup stats is just reading the stats files and converting them into Metric structs. I think it has little overhead, but I didn't benchmark at all.

So, I'll consider to provide the scanInterval option if the overhead seems be high than expected after benchmarking. I'll notify you after benchmarking is done with readme update.

@dlsrb6342 I did the benchmarks with the following code. As a result, I conclude that the overhead is very small, so we don't have to worry about it.

BenchmarkLightJob-5                    	48688857	       244.4 ns/op	       0 B/op	       0 allocs/op
BenchmarkLightJobWithWatchCPUUsage-5   	48302185	       247.0 ns/op	       0 B/op	       0 allocs/op
BenchmarkLightJobWithWatchMemUsage-5   	47847954	       247.4 ns/op	       0 B/op	       0 allocs/op
BenchmarkHeavyJob-5                    	   57736	    205881 ns/op	       0 B/op	       0 allocs/op
BenchmarkHeavyJobWithWatchCPUUsage-5   	   58207	    208704 ns/op	       2 B/op	       0 allocs/op
BenchmarkHeavyJobWithWatchMemUsage-5   	   56606	    206473 ns/op	       2 B/op	       0 allocs/op
func fib(n int) int64 {
	if n <= 1 {
		return int64(n)
	}
	return fib(n-1) + fib(n-2)
}

func BenchmarkLightJob(b *testing.B) {
	for i := 0; i < b.N; i++ {
		fib(10)
	}
}

func BenchmarkLightJobWithWatchCPUUsage(b *testing.B) {
	var (
		qryer, _ = newQueryer()
		ticker   = time.NewTicker(defaultScanInterval)
	)
	for i := 0; i < b.N; i++ {
		select {
		case <-ticker.C:
			_, _ = qryer.cpuUsage()
		default:
			fib(10)
		}
	}
}

func BenchmarkLightJobWithWatchMemUsage(b *testing.B) {
	var (
		qryer, _ = newQueryer()
		ticker   = time.NewTicker(defaultScanInterval)
	)
	for i := 0; i < b.N; i++ {
		select {
		case <-ticker.C:
			_, _ = qryer.memUsage()
		default:
			fib(10)
		}
	}
}

func BenchmarkHeavyJob(b *testing.B) {
	for i := 0; i < b.N; i++ {
		fib(24)
	}
}

func BenchmarkHeavyJobWithWatchCPUUsage(b *testing.B) {
	var (
		qryer, _ = newQueryer()
		ticker   = time.NewTicker(defaultScanInterval)
	)
	for i := 0; i < b.N; i++ {
		select {
		case <-ticker.C:
			_, _ = qryer.cpuUsage()
		default:
			fib(24)
		}
	}
}
func BenchmarkHeavyJobWithWatchMemUsage(b *testing.B) {
	var (
		qryer, _ = newQueryer()
		ticker   = time.NewTicker(defaultScanInterval)
	)
	for i := 0; i < b.N; i++ {
		select {
		case <-ticker.C:
			_, _ = qryer.memUsage()
		default:
			fib(24)
		}
	}
}

Nice one!! then can u add description about this to readme?

Sure. I added it in 96f13c6 .