@angela、@Asya、助けてくれてありがとう。
結局のところ、レイテンシーの主な原因は mongodbGLOBAL LOCK
自体でした。平均 5% のロック率があり、30 ~ 50% に達することもあり、クエリが遅くなります。
この問題に直面している場合、最初に行う必要があるのは、mongodb MMS サービス ( mms.10gen.com
) を有効にすることです。これにより、db サーバーで正確に何が起こっているかについて多くの洞察が得られます。
私たちの場合、LOCK PERCENTAGE は非常に高く、それには複数の理由がありました。それを理解するために最初にしなければならないことは、並行性に関するmongodbのドキュメントを読むことです
http://docs.mongodb.org/manual/faq/concurrency/
ロックの理由は、アプリケーション レベル、mongodb、またはハードウェアにある可能性があります。
1)私たちのアプリは多くのことを行っていて、updates
各更新(以上100 ops/sec
)はglobal lock
mongodbに保持されています。問題は、メモリ内にないエントリに対して更新が発生した場合、mongo は最初にデータをメモリにロードしてから (メモリ内で) 更新する必要があり、プロセス全体がglobal lock
. 全体が完了するまでに 1 秒かかるとします (0.75sec
ディスクからデータをロードし0.25sec
てメモリに更新するため1 sec
)。アプリサーバーでのリクエストがますます遅くなります。
query
その解決策は (ばかげているように聞こえるかもしれませんが) update
、. それが効果的に行うことは、「メモリへのデータのロード」(0.75秒)の部分を移動することですglobal lock
。lock percentage
2) グローバル ロックのもう 1 つの主な原因は、mongodb のflush
ディスクへのデータです。基本的に、60 秒 (またはそれ以下) ごとに mongodb (または OS) がデータをディスクに書き込み、global lock
このプロセス中に a が保持されます。(これはランダムな遅いクエリを説明しています)。MMS 統計で、グラフを参照してくださいbackground flush avg
... 高い場合は、より高速なディスクを入手する必要があることを意味します。
私たちの場合、新しいEBS optimized
インスタンスに移動し、EC2
プロビジョニングIOPS
され100
たものも増やしました。これにより、サーバーは現在、500
ほぼ半分にbackground flush avg
なり、サーバーははるかに満足しています.