mgo Go サーバー エラー: 開いているファイルが多すぎます
Go プログラミング言語を備えた Ubuntu で mgo を使用して MongoDB サーバーを実行すると、次のような問題が発生する可能性があります。開いているファイルが多すぎることに関連するエラーが発生する場合があります。 「Accept error: accept tcp [::]:80: accept4: too many open files」などのこれらのエラーは、通常、サーバーが長時間実行された後に表示され、サーバーが制限に達したことを示します。ファイル記述子を開きます。
エラーの原因
サーバーが新しい接続を確立しようとしたときにエラーが発生します。しかし、OS が課した開いているファイルの制限を超えていることがわかります。これは、接続が適切に閉じられていない場合に発生する可能性があり、開いているファイル記述子が徐々に蓄積され、最終的にしきい値を超えます。
コード分析
提供されたコード スニペット内リソース管理を改善し、障害を防ぐために、MongoDB セッションと接続の処理を調整できる領域がいくつかあります。リーク:
-
適切な接続とセッション管理: main 関数で初期化されたセッション (session, _ := mgo.Dial("localhost")) は永続的な接続ではありません。セッションのデータベース インスタンス (Database = session.DB("mapdb")) を保存する代わりに、セッション自体を保存することをお勧めします。
-
エラー処理の欠如: エラー処理が明らかではありません。コードの中で。エラーをチェックして適切に処理することは、堅牢なエラー処理にとって非常に重要です。
-
接続の終了: 使用後に接続とセッションを閉じることが重要です。 someHandler 関数では、複製されたセッション sess が取得されますが、どこにも明示的に閉じられていません。 defer sess.Close() ステートメントを追加すると、関数の終了時にセッションが確実に閉じられます。
解決策
「開いているファイルが多すぎる」問題を解決するにはエラーを修正し、コードのリソース管理を改善するには、次の調整を行うことができます。 made:
-
永続セッションを使用する: リクエストが処理されるたびに接続を再確立する代わりに、サーバーの存続期間全体にわたって単一の mgo.Session インスタンスを保存します。起動時にセッションを 1 回初期化し、それを使用してリクエストごとに新しいコピーまたはクローンを取得します。
-
エラーの処理: セッションの確立、データベース操作、接続の終了中にエラーがないか確認します。ログを記録するか、適切な修正措置を講じることにより、エラーを適切に処理します。
-
接続とセッションを閉じる: MongoDB の接続とセッションが使用後に閉じられていることを確認します。関連する関数が終了したときに、defer ステートメントを自動的に閉じるには、defer ステートメントを使用します。
関連する質問
関連トピックの詳細については、次のリソースを参照してください。
- mgo - クエリのパフォーマンスが一貫して遅いように見えます (500 ~ 650 ミリ秒)
- gopkg.in/mgo の同時実行.v2 (Mongo、Go)
以上がmgo を使用している Go MongoDB サーバーが「開いているファイルが多すぎます」エラーを返すのはなぜですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。