質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.48%
MongoDB

MongoDBはオープンソースのドキュメント指向データベースの1つです。高性能で、多くのリトルエンディアンシステムを利用することができます。

Node.js

Node.jsとはGoogleのV8 JavaScriptエンジンを使用しているサーバーサイドのイベント駆動型プログラムです。

JavaScript

JavaScriptは、プログラミング言語のひとつです。ネットスケープコミュニケーションズで開発されました。 開発当初はLiveScriptと呼ばれていましたが、業務提携していたサン・マイクロシステムズが開発したJavaが脚光を浴びていたことから、JavaScriptと改名されました。 動きのあるWebページを作ることを目的に開発されたもので、主要なWebブラウザのほとんどに搭載されています。

Q&A

解決済

1回答

1901閲覧

mongoDBのfindOneAndUpdateでCPUのリソースを異常に消費する

robert

総合スコア20

MongoDB

MongoDBはオープンソースのドキュメント指向データベースの1つです。高性能で、多くのリトルエンディアンシステムを利用することができます。

Node.js

Node.jsとはGoogleのV8 JavaScriptエンジンを使用しているサーバーサイドのイベント駆動型プログラムです。

JavaScript

JavaScriptは、プログラミング言語のひとつです。ネットスケープコミュニケーションズで開発されました。 開発当初はLiveScriptと呼ばれていましたが、業務提携していたサン・マイクロシステムズが開発したJavaが脚光を浴びていたことから、JavaScriptと改名されました。 動きのあるWebページを作ることを目的に開発されたもので、主要なWebブラウザのほとんどに搭載されています。

0グッド

0クリップ

投稿2019/02/02 05:32

編集2019/02/03 00:54

前提・実現したいこと

mongoDBにnode.jsで記述したプログラムのfindOneAndUpdate()で同時に大量のアクセスをするとCPUをすべて消費してしまいレスポンスに1分以上かかるという状態になっております。
同時アクセス数は300程度で、mongoDBを置いているサーバーはGCPのn1-standard-2(vCPU x 2、メモリ 7.5 GB)です。

接続を作ったり、単純なfind()やupdate()ではこのようにCPUを大量に消費しないので、findOneAndUpdate()に問題があるのでしょうか?
単純にサーバーのスペックを上げる以外の解決方法がありましたらご教授願いたいです。

詳しい方がいらっしゃいましたら回答をどうかよろしくお願い致します。

発生している問題

CPUリソースをすべて消費してしまい、レスポンスが使用困難なほど遅くなる

該当のソースコード

nodejs

1findOneAndUpdate( 2 {'available':true, 'finish':false}, 3 {$set:{'available':false}}, 4 {sort:{'postNum':-1}} 5)

document

1_id:id 2url:URL 3available:true/false 4finish:true/false 5postNum:投稿数 6timestamp:タイムスタンプ

補足情報(FW/ツールのバージョンなど)

アプリケーションバージョン
mongoDB4.0.2
node.js10.15.0
サーバーCPUメモリ
GCEvCPU x 27.5GB

追記

現在300のプログラムが常にmongoDBとの接続を持っており、必要なときにfindOneAndUpdate()などのメソッドを使ってアクセスするという形になっております。

質問に対する返答

  • mongoDBは1台のみの攻勢となっております。
  • 上記の要素をもつドキュメントが8500件ほどあります。
  • GCPのサーバー上ではmongoDB以外の動作は行っておりません。
  • findOneAndUpdate()の部分をfindOne()とupdate()にわけて実行したところ、CPUが上限に行くことはありませんでした。しかし、この方法ですとupdate前に同じドキュメントをfindOne()で取得してしまうことがあったので、可能な限りfindOneAndUpdate()を使う方法で行きたいと考えています。

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

kabao

2019/02/02 19:12

findOneAndUpdateだけでCPU利用率があがるというのは珍しい気がしていて、複合的な要因かもしれないですね。 - findOneAndUpdateのfind条件、update条件はどのような指定をしていますか?またoptionsには何か指定していますか? http://mongodb.github.io/node-mongodb-native/3.1/api/Collection.html#findOneAndUpdate - MongoDBは1台のみの構成でしょうか?それともレプリカセットなどを組んでいますか? - MongoDBに保存されているデータ量はどの程度でしょうか。 - 同じGCPのサーバ上では、MongoDB以外に何か動作していますか?node.jsも同じサーバ上でしょうか。 - findOneAndUpdateで大量にCPUを消費している、findやupdateでは消費していない、というのはどのように検証されましたか?
robert

2019/02/03 00:54

質問ありがとうございます。 投稿を編集し質問に答えさせていただきました。
guest

回答1

0

ベストアンサー

単純なfindOneAndUpdateに見えますし、ドキュメント数も8500程度とのことですが、オプションでsortを指定しているのが気になりました。

インデックスは作成しているでしょうか?インデックスが無くて、都度sortしているとするとCPUを消費しそうです。

{"available": 1, "finish": 1, "postNum": -1}

とかでインデックス作成してみてはどうでしょうか。

投稿2019/02/03 03:04

kabao

総合スコア648

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

robert

2019/02/04 02:51

回答ありがとうございます。 インデックスについて調査したところ、sort時にうまく機能指定なことがわかりました。 インデックスを修正して動かしたところ、CPU使用率は収まりました。 ただ、300台でCPU2台ギリギリまで使い切るのはそれだけアクセスが多いということで納得するしかないですかね?
kabao

2019/02/05 04:33

300台から、どのくらいのアクセス数が発生しているかによると思いますが、2CPUだとだいぶ厳しいかなという気はします。ロードアベレージを見れば、おそらく傾向が見れるのではないかと思います。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問