• go的mgo,连接未释放问题,连接泄露。


    api启动几天后,卡住(连接失败,超时)

    异常原因

    mongo连接被占满,无法建立mgo连接,返回信息

    查询点用端口可知,97%的连接被api项目占用。

    api项目的mongodb连接“泄露”,某处的连接没有断开,不断累加。

    排查出问题来源。

    简单代码示例(这代码有,没有错误检测,也不会编译成功,知道意思即可)

    func demo() {
        session, collection, err := GetCollection(DBNAME, COLLECTIONNAME)
        defer session.Close()
    }

    第一次初始session对象,这个session对象是A

    demo方法执行完毕会调用 session.Close()将A的mongodb连接释放掉。

    func demo() {
        session, collection, err := GetCollection(DBNAME, COLLECTIONNAME)
        defer session.Close()
        session, collection, err = GetCollection(DBNAME, COLLECTIONNAME)
    }

    这样便会出现连接“泄露”。

    因为初始化了另一个sesseion对象B

    demo执行到第三句是,session的引用指向了对象B,而对象A的引用则丢失了,A成了野对象。

    demo执行完毕后,session.Close()释放了B的mongodb连接,但是A对象引用已经丢失,A的mongodb连接,永远不会得到释放。

    垃圾回收可以把野对象回收了(内存回收),但是野对象所对应的socket并没有被释放(资源回收)

    这是很基础的错误,不该出现的错误。

  • 相关阅读:
    VUE组件间传参
    JS-03 (RegExp对象&字符串总结)
    JS-02 (字符串的正则函数)
    理解 C++ 的 Memory Order
    GCC的原子操作函数
    barrier内存屏障
    tcp重传机制,流量控制,拥塞控制
    TCP 的拥塞控制
    Monitoring and Tuning the Linux Networking Stack: Receiving Data
    kernel网络之软中断
  • 原文地址:https://www.cnblogs.com/zihunqingxin/p/5085925.html
Copyright © 2020-2023  润新知