Skip to content

Instantly share code, notes, and snippets.

@direvius
Created December 29, 2015 14:47
Show Gist options
  • Save direvius/f4b6fbecb4c99a8f12b1 to your computer and use it in GitHub Desktop.
Save direvius/f4b6fbecb4c99a8f12b1 to your computer and use it in GitHub Desktop.
(pprof) list HostClient.*do
Total: 6.13mins
ROUTINE ======================== github.com/valyala/fasthttp.(*HostClient).do in /home/direvius/.gvm/pkgsets/go1.5.2/global/src/github.com/valyala/fasthttp/client.go
200ms 1.60mins (flat, cum) 26.08% of Total
. . 795:func (c *HostClient) do(req *Request, resp *Response, newConn bool) (bool, error) {
. . 796: if req == nil {
. . 797: panic("BUG: req cannot be nil")
. . 798: }
. . 799:
20ms 140ms 800: atomic.StoreUint32(&c.lastUseTime, uint32(time.Now().Unix()-startTimeUnix))
. . 801:
. 620ms 802: cc, err := c.acquireConn(newConn)
. . 803: if err != nil {
. . 804: return false, err
. . 805: }
20ms 20ms 806: conn := cc.c
. . 807:
. . 808: if c.WriteTimeout > 0 {
. . 809: if err = conn.SetWriteDeadline(time.Now().Add(c.WriteTimeout)); err != nil {
. . 810: c.closeConn(cc)
. . 811: return false, err
. . 812: }
. . 813: }
. . 814:
. . 815: userAgentOld := req.Header.UserAgent()
. . 816: if len(userAgentOld) == 0 {
. . 817: req.Header.userAgent = c.getClientName()
. . 818: }
10ms 15.47s 819: bw := c.acquireWriter(conn)
10ms 1.63s 820: err = req.Write(bw)
. . 821: if len(userAgentOld) == 0 {
. . 822: req.Header.userAgent = userAgentOld
. . 823: }
. . 824:
. . 825: if err != nil {
. . 826: c.releaseWriter(bw)
. . 827: c.closeConn(cc)
. . 828: return false, err
. . 829: }
10ms 30.30s 830: if err = bw.Flush(); err != nil {
. . 831: c.releaseWriter(bw)
. . 832: c.closeConn(cc)
. . 833: return true, err
. . 834: }
. 100ms 835: c.releaseWriter(bw)
. . 836:
. . 837: nilResp := false
. . 838: if resp == nil {
. . 839: nilResp = true
. . 840: resp = AcquireResponse()
. . 841: }
. . 842:
. . 843: if c.ReadTimeout > 0 {
. . 844: if err = conn.SetReadDeadline(time.Now().Add(c.ReadTimeout)); err != nil {
. . 845: c.closeConn(cc)
. . 846: return false, err
. . 847: }
. . 848: }
. . 849:
50ms 28.68s 850: br := c.acquireReader(conn)
20ms 18s 851: if err = resp.ReadLimitBody(br, c.MaxResponseBodySize); err != nil {
. . 852: if nilResp {
. . 853: ReleaseResponse(resp)
. . 854: }
. . 855: c.releaseReader(br)
. . 856: c.closeConn(cc)
. . 857: if err == io.EOF {
. . 858: return true, err
. . 859: }
. . 860: return false, err
. . 861: }
30ms 610ms 862: c.releaseReader(br)
. . 863:
30ms 30ms 864: if req.Header.ConnectionClose() || resp.Header.ConnectionClose() {
. 240ms 865: c.closeConn(cc)
. . 866: } else {
. 160ms 867: c.releaseConn(cc)
. . 868: }
. . 869:
. . 870: if nilResp {
. . 871: ReleaseResponse(resp)
. . 872: }
(pprof) list acquireWriter
Total: 6.13mins
ROUTINE ======================== github.com/valyala/fasthttp.(*HostClient).acquireWriter in /home/direvius/.gvm/pkgsets/go1.5.2/global/src/github.com/valyala/fasthttp/client.go
110ms 15.46s (flat, cum) 4.20% of Total
. . 998: c.connsLock.Lock()
. . 999: c.conns = append(c.conns, cc)
. . 1000: c.connsLock.Unlock()
. . 1001:}
. . 1002:
20ms 20ms 1003:func (c *HostClient) acquireWriter(conn net.Conn) *bufio.Writer {
20ms 2.73s 1004: v := c.writerPool.Get()
10ms 10ms 1005: if v == nil {
. . 1006: n := c.WriteBufferSize
. . 1007: if n <= 0 {
. . 1008: n = defaultWriteBufferSize
. . 1009: }
60ms 12.70s 1010: return bufio.NewWriterSize(conn, n)
. . 1011: }
. . 1012: bw := v.(*bufio.Writer)
. . 1013: bw.Reset(conn)
. . 1014: return bw
. . 1015:}
(pprof)
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment