Golang 1.8后本身自带了pprof的这个神器,可以帮助我们很方便的对服务做一个比较全面的profile。对于一个Golang的程序,可以从多个方面进行profile,比如memory和CPU两个最基本的指标,也是我们最关注的,同时对特有的goroutine也有运行状况profile。关于golang profiling本身就不做过多的说明,可以从 官方博客 中了解到详细的过程。    Profile的环境    Ubuntu 14.04.4 LTS (GNU/Linux 3.19.0-25-generic x86_64)  go version go1.9.2 linux/amd64     profile的为一个elassticsearch数据导入接口,承担接受上游数据,根据元数据信息写入相应的es索引中。目前的状况是平均每秒是1.3Million的Doc数量。     在增加了profile后,从CPU层面发现几个问题。    runtime mallocgc 占用了17.96%的CPU。 SVG部分图如下                 通过SVG图,可以看到调用链为:   ioutil.ReadAll -> buffer.ReadFrom -> makeSlice -> malloc.go      然后进入ReadAll的源码。     readAll()方法   func readAll(r io.Reader, capacity int64) (b []byte, err error) {  buf := bytes . NewBuffer ( make ([] byte , 0 , capacity ))  // If the buffer overflows, we will get bytes.ErrTooLarge.    // Return that as an error. Any other panic remains.    defer func() {  e := recover ()  if e == nil {  return      }  if panicErr , ok := e .( error ) ; ok && p...