2017-08-24 24 views
0

MongoDB 3.4でReactiveMongo 0.12を使用しています。 MongoDBとの接続プールのしくみを理解しようとしています。ReactiveMongo接続プーリングはMongoDBサーバー接続に関してどのように機能しますか?

私はremoteAddrr:27017にMongoDBをインストールしました。私はReactiveMongoを自分のコードで以下のように使用しています。 documentationによれば

import reactivemongo.api.MongoConnection 
val driver = new reactivemongo.api.MongoDriver 
val connection = driver.connection(List("remoteAddrr:27017")) 

MongoConnectionは論理接続ではなく、物理的一方(ないネットワークチャネル)です。それは実際に接続プールです。デフォルトでは、MongoConnectionは各ノードに10の物理ネットワークチャネルを作成します。

私のコードでは、ReactiveMongo接続プールがノードremoteAddrr:27017への10の物理接続を確立すると仮定します。

しかし、私はモンゴシェル内serverStatusをテストし、

ので
>var status = db.serverStatus() 
> status.connections 
{ "current" : 20, "available" : 51180, "totalCreated" : 66 } 

、どのようにそれが現在のシェルセッションで20個の接続があることが可能ですか? 使用可能な未使用の着信接続の数はどのように51180になる可能性がありますか? サーバーに作成されたすべての着信接続の数がどのようにして66になったのかもわかりません。

+0

まあ(私はここで推測しています)、db.serverStatusはクライアントの*接続/セッションのステータス*ではなく、サーバー*のステータス*です。 – GPI

+0

名前 'serverStatus' BTWで示されているように、むしろそのようなコマンドを使用するのではなく、単一のクライアントが接続されたサーバログを見てください。 – cchantep

+0

@GPIしたがって、mongoサーバーの接続数がクライアント側のドライバーによって開かれた接続数によって異なることを理解していませんか? – oblivion

答えて

1

正常に閉じられず、現在タイムアウトを待っている接続である可能性があります。ドライバに応じて、接続を「閉じる」必要があります(実際にプールからリクエストした接続を使用しないように指定しています)。これは、通常、正常にシャットダウンするのではなく、プールを維持していたアプリケーションを強制終了させることによって発生します。

ここで白いウサギを追いかけています。それは、利用可能な接続の0.04%未満を使用しており、RAMの3桁の合計(クエリを実行しない接続では約1MBのサーバー側を消費する)を消費します。

66接続ごとに:これは、最後に再起動した後に作成された接続の総数で、mongodです。

+1

一部のドライバ(たとえばmgo)では、明示的に接続をプールに戻す必要があります。 1MBは、各接続にあらかじめ割り当てられたスタックです。実際には、そのために20MBを使用します。私はプールのサイズを小さくすることに強くアドバイスします***。プールサイズは10,20コネクションがあり、プールサイズは50kを大きく上回る可能性があります(もちろん、スタックは割り当てられません)。しかし、私はMongoDBのドキュメントの作業を強く勧めています。 ;) –

+0

ありがとう、私の以前のコメントは誤って削除されました。あなたは私の助けを借りて、医者の右側の領域を指差すことができますか?私はそこに迷っています。実際、私の必要とする重要な洞察は、MongoDB Serverがうまく動作しているかどうかです。 'mongod'は、' top'コマンドでサーバの状態をチェックしたときに、CPU使用率が100%以上になることがよくあります。だから、私はそれが管理されていない接続によって引き起こされているのだろうかと思っていました。 – oblivion

+0

@oblivion私は最初から最後までを意味しました。また、MongoUクラスに参加することもできます。彼らは自由です(ビールのように)時間がかからず、本当に役に立ちます。 –

関連する問題