パフォーマンス上の理由から、GAE アプリケーションでシャード カウンター ( https://cloud.google.com/appengine/articles/sharding_counters ) を使用していますが、なぜこんなに遅いのか、どうすれば高速化できるのかを理解するのに苦労しています。 .
背景
一度に 20 個のオブジェクトのセットを取得する API があり、オブジェクトごとにカウンターから合計を取得して応答に含めます。
メトリクス
Appstats をオンにしてキャッシュをクリアすると、20 個のカウンターの合計を取得すると、datastore_v3.Get によって 120 個の RPC が作成され、2500 ミリ秒かかることがわかりました。
考察
これはかなりの数の RPC 呼び出しのようで、わずか 20 個のカウンターを読み取るのにかなりの時間がかかります。私はこれがより速いと思っていましたが、おそらくそれは私が間違っているところです。これよりも速いはずですか?
さらに調べ
て、 get_count メソッドの次の 2 行を見て、統計をもう少し掘り下げました。
all_keys = GeneralCounterShardConfig.all_keys(name)
for counter in ndb.get_multi(all_keys):
get_multi 行をコメントアウトすると、datastore_v3.Get による RPC 呼び出しが 20 回あり、合計で 185 ミリ秒かかることがわかります。
予想どおり、これにより、datastore_v3 による 100 回の RPC 呼び出しの原因は get_multi のままになります。2500 ミリ秒以上かかります。これは確認しましたが、ここで混乱しています。20 個のキーで get_multi を呼び出すと、100 回の RPC 呼び出しが発生するのはなぜですか?
更新 #1
GAE コンソールで Traces をチェックアウトしたところ、いくつかの追加情報が表示されました。彼らはそこにもRPC呼び出しの内訳を示していますが、そのサイトでは、「取得をバッチ処理してリモートプロシージャ呼び出しの数を減らす」と言っています。get_multi を使用する以外でそれを行う方法がわかりません。それが仕事だと思った。ここで何かアドバイスはありますか?
更新 #2
これは、私が見ている統計を示すスクリーン ショットです。最初のものは私のベースラインです - カウンター操作のない関数です。2 つ目は、1 つのカウンターのみに対する get_count の呼び出し後です。これは、6 つの datastore_v3.Get RPC の違いを示しています。
更新 #3
Patrick の要求に基づいて、コンソールの Trace ツールからの情報のスクリーンショットを追加します。