On Wed, May 20, 2020 at 9:26 PM <qingyu...@gmail.com> wrote:
>
> Hi all:
> I write a simpile HTTP proxy,and find the most alloctions appear in 
> io.copyBuffer
>
>>> (pprof) list io.copyBuffer
>>>
>>> Total: 2.80TB
>>>
>>> ROUTINE ======================== io.copyBuffer in /usr/local/go/src/io/io.go
>>>
>>>     1.03TB     2.47TB (flat, cum) 88.16% of Total
>>>
>>>          .          .    383:   if wt, ok := src.(WriterTo); ok {
>>>
>>>          .          .    384:           return wt.WriteTo(dst)
>>>
>>>          .          .    385:   }
>>>
>>>          .          .    386:   // Similarly, if the writer has a ReadFrom 
>>> method, use it to do the copy.
>>>
>>>          .          .    387:   if rt, ok := dst.(ReaderFrom); ok {
>>>
>>>          .     3.02GB    388:           return rt.ReadFrom(src)
>>>
>>>          .          .    389:   }
>>>
>>>          .          .    390:   if buf == nil {
>>>
>>>          .          .    391:           size := 32 * 1024
>>>
>>>          .          .    392:           if l, ok := src.(*LimitedReader); 
>>> ok && int64(size) > l.N {
>>>
>>>          .          .    393:                   if l.N < 1 {
>>>
>>>          .          .    394:                           size = 1
>>>
>>>          .          .    395:                   } else {
>>>
>>>          .          .    396:                           size = int(l.N)
>>>
>>>          .          .    397:                   }
>>>
>>>          .          .    398:           }
>>>
>>>     1.03TB     1.03TB    399:           buf = make([]byte, size)
>>>
>>>          .          .    400:   }
>>>
>>>          .          .    401:   for {
>>>
>>>          .     1.43TB    402:           nr, er := src.Read(buf)
>>>
>>>          .          .    403:           if nr > 0 {
>>>
>>>          .   569.57MB    404:                   nw, ew := 
>>> dst.Write(buf[0:nr])
>>>
>>>          .          .    405:                   if nw > 0 {
>>>
>>>          .          .    406:                           written += int64(nw)
>>>
>>>          .          .    407:                   }
>>>
>>>          .          .    408:                   if ew != nil {
>>>
>>>          .          .    409:                           err = ew
>
>
> and this the stacktrace
>>
>> 0: 0 [2057907: 67433496576] @ 0x470169 0x6e508a 0x6e5042 0x6e4ca7 0x6cf82e 
>> 0x77bfe9 0x45f7a1
>>
>> #       0x470168        io.copyBuffer+0x2a8                             
>> /usr/local/go/src/io/io.go:399
>>
>> #       0x6e5089        io.Copy+0x69                                    
>> /usr/local/go/src/io/io.go:364
>>
>> #       0x6e5041        net/http.(*transferWriter).doBodyCopy+0x21      
>> /usr/local/go/src/net/http/transfer.go:400
>>
>> #       0x6e4ca6        net/http.(*transferWriter).writeBody+0x426      
>> /usr/local/go/src/net/http/transfer.go:348
>>
>> #       0x6cf82d        net/http.(*Response).Write+0x42d                
>> /usr/local/go/src/net/http/response.go:328
>>
>> #       0x77bfe8        main.handler+0x318                              
>> /root/ctrip/shendun/main.go:74


The data being copied is presumably coming from the Body field of your
*http.Response.  If you set the Body field to a type that implements
the WriteTo method, and set the ContentLength field to the length of
the data, then you can do the write however you like.

Ian

-- 
You received this message because you are subscribed to the Google Groups 
"golang-nuts" group.
To unsubscribe from this group and stop receiving emails from it, send an email 
to golang-nuts+unsubscr...@googlegroups.com.
To view this discussion on the web visit 
https://groups.google.com/d/msgid/golang-nuts/CAOyqgcVmUSj1ehxzqbaxr6UuLPkM9LxzevaEJABs8zUimauwYQ%40mail.gmail.com.

Reply via email to