mgo Go サーバーで開いているファイルが多すぎます
エラー「Accept error: accept tcp [::]:80: accept4」が発生した場合: 開いているファイルが多すぎます。」というメッセージが、mgo を使用して Go で記述された MongoDB サーバーで表示される場合、同時ファイル記述子の最大数が制限されていることを示します。に達しました。このエラーは、リクエストごとに何かがオープンされているだけでクローズされていない可能性があることを示しています。
解決策
根本的な問題は、MongoDB 接続の誤った使用法にあります。 mgo.Database インスタンスを保存する代わりに、mgo.Session を保存することが重要です。 MongoDB と対話するときは、常にセッションのコピーまたはクローンを取得し、不要な場合は慎重に閉じてください。このアプローチにより、接続が漏洩しないことが保証されます。
さらに、すべてのデータベース操作でエラーがないか徹底的にチェックすることが重要です。エラーの印刷またはログ記録は、エラーが発生したときに実行する最小限の手順です。
コード サンプル
以下は、これらの問題に対処する改良されたコード サンプルです。
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 }
これらの変更を実装することにより、コードは接続を効果的に管理し、接続が適切に閉じられるようにします。これにより、開いているファイルが多すぎる問題が解決され、MongoDB サーバーの全体的なパフォーマンスが向上します。
以上がGo MongoDB サーバーで「Accept error: accept tcp [::]:80: accept4: too many open files」というメッセージが表示されるのはなぜですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。