I’ve been using GO (golang.org) for the last several months and really like the language, which I can go into at another time.
Lately, one of the processes that I’ve written seems to get into a site where the CPU of the process is extremely high even though the process is basically in an idle state:
top - 13:06:53 up 152 days, 4:04, 1 user, load average: 11.99, 11.30, 11.25
Tasks: 348 total, 1 running, 347 sleeping, 0 stopped, 0 zombie
%Cpu(s): 48.4 us, 2.4 sy, 0.0 ni, 49.2 id, 0.0 wa, 0.0 hi, 0.0 si, 0.0 st
KiB Mem: 32900140 total, 32371752 used, 528388 free, 44 buffers
KiB Swap: 33509372 total, 2151948 used, 31357424 free. 22511692 cached Mem
PID USER PR NI VIRT RES SHR S %CPU %MEM TIME+ COMMAND
16115 mfinger 20 0 2637812 1.105g 5972 S 616.7 3.5 3883:11 xxxxxx
16134 mfinger 20 0 2504232 728572 6128 S 610.1 2.2 2909:37 xxxxxx
After looking around, I remembered that go has profiling built in. I added a few lines to my code, namely:
import _ "net/http/pprof"
And:
go func() {
log.Println(http.ListenAndServe(":6060", nil))
}()
Then I ran the profile tool built into GO:
% go tool pprof -png http://host:6060/debug/pprof/profile > cpu.png
Fetching profile from http://host:6060/debug/pprof/profile
Please wait... (30s)
Saved profile in /Users/Mfinger/pprof/pprof.host:6060.samples.cpu.008.pb.gz
Let’s look at the results:
Let’s look at the heap, as well:
% go tool pprof -png http://host:6060/debug/pprof/heap > heap.png
Fetching profile from http://host:6060/debug/pprof/heap
Saved profile in /Users/Mfinger/pprof/pprof.host:6060.inuse_objects.inuse_space.006.pb.gz
Very nice. Now to try to fix the issue.