定时器开销导致内存溢出

时间:2016-02-19 18:38:15

标签: go channel

来自timer.Stop()documentation

  

停止阻止定时器触发。如果调用它返回true   如果计时器已经过期或已经过期,则停止计时器   停止。停止不关闭通道,以防止从中读取   渠道成功不正确。

我需要找到一种方法来通过AfterNewTimer销毁在程序中创建的计时器对象或频道。我没有直接使用这些函数,只是使用这些函数实现超时的另一个库。我处理程序内存的请求越来越多,然后被杀死。

我已经调查过以下几个地方,但没有多少帮助:

  1. https://groups.google.com/forum/#!topic/golang-nuts/A597Btr_0P8
  2. https://groups.google.com/forum/#!topic/golang-nuts/-xnFsH_ZRqU
  3. https://groups.google.com/forum/#!topic/golang-nuts/rYthykbCLHk
  4. https://groups.google.com/forum/#!topic/golang-nuts/hjioKxSJ3Tc
  5. 请帮助,需要拼命解决这个问题。

    更新

    可疑代码位于https://github.com/gocql/gocql/blob/986e33a705412161497203d55d0669d04282f5ff/conn.go#L546

    var timeoutCh <-chan time.Time
    if c.timeout > 0 {
        timeoutCh = time.After(c.timeout)
    }
    
    select {
    case err := <-call.resp:
        if err != nil {
            if !c.Closed() {
                // if the connection is closed then we cant release the stream,
                // this is because the request is still outstanding and we have
                // been handed another error from another stream which caused the
                // connection to close.
                c.releaseStream(stream)
            }
            return nil, err
        }
    case <-timeoutCh:
        close(call.timeout)
        c.handleTimeout()
        return nil, ErrTimeoutNoResponse
    case <-c.quit:
        return nil, ErrConnectionClosed
    }
    

    我怎么知道这个?我跑去工具pprof捕获memprof,它显示的是:

    section of memprof

1 个答案:

答案 0 :(得分:2)

我已合并修复此问题,https://github.com/gocql/gocql/pull/661如果您遇到其他问题,请提出问题