복붙노트

[MONGODB] 산화 마그네슘 이동 서버에 너무 많은 열려있는 파일

MONGODB

산화 마그네슘 이동 서버에 너무 많은 열려있는 파일

나는 로그에 이러한 오류를 받고 있어요 :

우분투에 MongoDB를 서버, 산화 마그네슘을 사용하여 이동에 작성합니다. 그들은 약 하루 동안 실행 됐어요 후 나타나는 시작합니다.

암호:

package main

import (
    "encoding/json"
    "io"
    "net/http"

    "gopkg.in/mgo.v2/bson"
)

var (
    Database *mgo.Database
)

func hello(w http.ResponseWriter, r *http.Request) {
    io.WriteString(w, "hello")
}

func setTile(w http.ResponseWriter, r *http.Request) {
    var requestJSON map[string]interface{}
    err := json.NewDecoder(r.Body).Decode(&requestJSON)
    if err != nil {
        http.Error(w, err.Error(), 400)
        return
    }

    collection := Database.C("tiles")

    if requestJSON["tileId"] != nil {
        query := bson.M{"tileId": requestJSON["tileId"]}
        collection.RemoveAll(query)
        collection.Insert(requestJSON)

        w.WriteHeader(200)
        w.Header().Set("Content-Type", "application/json")
        js, _ := json.Marshal(map[string]string{"result": "ok"})
        w.Write(js)
    } else {
        w.WriteHeader(200)
        w.Header().Set("Content-Type", "application/json")
        w.Write(js)
    }
}

func getTile(w http.ResponseWriter, r *http.Request) {
    var requestJSON map[string]interface{}
    err := json.NewDecoder(r.Body).Decode(&requestJSON)
    if err != nil {
        http.Error(w, err.Error(), 400)
        return
    }

    collection := Database.C("tiles")

    var result []map[string]interface{}

    if requestJSON["tileId"] != nil {
        query := bson.M{"tileId": requestJSON["tileId"]}
        collection.Find(query).All(&result)
    }

    if len(result) > 0 {
        w.WriteHeader(200)
        w.Header().Set("Content-Type", "application/json")
        js, _ := json.Marshal(result[0])
        w.Write(js)
    } else {
        w.WriteHeader(200)
        w.Header().Set("Content-Type", "application/json")
        js, _ := json.Marshal(map[string]string{"result": "tile id not found"})
        w.Write(js)
    }
}

func main() {
    session, _ := mgo.Dial("localhost")
    Database = session.DB("mapdb")

    mux := http.NewServeMux()
    mux.HandleFunc("/", hello)
    mux.HandleFunc("/setTile", setTile)
    mux.HandleFunc("/getTile", getTile)
    http.ListenAndServe(":80", mux)
}

필요 닫는 것을 거기에 뭔가 있나요? 아니면 어떤 식 으로든 잘못 구성되어?

이 파일 열기 제한을 설정하는 곳이 많은 것 같다, 그래서 내가 한계가 실제로 무엇인지 찾는 방법을 모르겠어요. 그러나 한계를 증가하는 것은 확실히 뭔가 모든 요청에 ​​개폐되지되고, 어쨌든 문제가되지 않습니다처럼 보인다.

해결법

  1. ==============================

    1.이것은 당신이 저장하고 이동에 MongoDB의 연결을 사용하는 방법이 아니다.

    이것은 당신이 저장하고 이동에 MongoDB의 연결을 사용하는 방법이 아니다.

    당신은 mgo.Session 아닌 mgo.Database 인스턴스를 저장해야합니다. 그리고 당신은 MongoDB의 상호 작용해야 할 때마다, 당신은 복사 또는 (Session.Copy () 또는 Session.Clone ()와 예) 세션의 복제를 취득하고, 당신이 그것을 필요로하지 않을 때 당신은 사용 (바람직 닫습니다 연기 문). 이것은 당신이 연결을 누설하지 않도록합니다.

    당신은 오류 또한 종교적으로 생략 검사, 그렇게하지 마십시오. 오류를 반환 무엇이든간에, (그것을 로그 / 당신이 할 수있는 최소한의 인쇄입니다) 그것을 확인하고 올바르게 행동 않습니다.

    그래서 기본적으로 당신이해야 할 일이 같은입니다 :

    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
    }
    

    관련 질문을 참조하십시오 :

    MGO - 쿼리 성능이 느린 지속적으로 보인다 (500-650ms)

    gopkg.in/mgo.v2의 동시성 (몽고, 이동)

  2. from https://stackoverflow.com/questions/47179890/too-many-open-files-in-mgo-go-server by cc-by-sa and MIT license