Heap fragmentation is not normally a concern with the current Go
runtime. The heap is implemented to that large pages are divided up
into blocks that are all the same size. This means that the usual
definition of fragmentation--a small block prevents coalescing of
large blocks--can not occur.
Your graphs seem to show your memory use is in a steady state, which
is a good thing. When there are operations that temporarily use a lot
of memory, it's normal for HeapIdle to be high--the memory is there
ready and waiting for temporary memory use spikes.
Ian