too many open files in mgo go server

前端 未结 2 807
一向
一向 2020-12-06 15:19

I\'m getting these errors in the logs:

Accept error: accept tcp [::]:80: accept4: too many open files;

for a mongodb server on u

相关标签:
2条回答
  • 2020-12-06 15:48

    You are missing:

    defer r.Body.Close()
    

    Make sure it is used before return statement.

    0 讨论(0)
  • 2020-12-06 15:51

    This is not how you store and use a MongoDB connection in Go.

    You have to store an mgo.Session, not an mgo.Database instance. And whenever you need to interact with the MongoDB, you acquire a copy or a clone of the session (e.g. with Session.Copy() or Session.Clone()), and you close it when you don't need it (preferable using a defer statement). This will ensure you don't leak connections.

    You also religiously omit checking for errors, please don't do that. Whatever returns an error, do check it and act on it properly (the least you can do is print / log it).

    So basically what you need to do is something like this:

    var session *mgo.Session
    
    func init() {
        var err error
        if session, err = mgo.Dial("localhost"); err != nil {
            log.Fatal(err)
        }
    }
    
    func someHandler(w http.ResponseWriter, r *http.Request) {
        sess := session.Copy()
        defer sess.Close() // Must close!
    
        c := sess.DB("mapdb").C("tiles")
        // Do something with the collection, e.g.
        var tile bson.M
        if err := c.FindId("someTileID").One(&result); err != nil {
            // Tile does not exist, send back error, e.g.:
            log.Printf("Tile with ID not found: %v, err: %v", "someTileID", err)
            http.NotFound(w, r)
            return
        }
        // Do something with tile
    }
    

    See related questions:

    mgo - query performance seems consistently slow (500-650ms)

    Concurrency in gopkg.in/mgo.v2 (Mongo, Go)

    0 讨论(0)
提交回复
热议问题