appstatsを使用すると、データストアクエリに約125ミリ秒(apiとcpuを合わせたもの)かかっていることがわかりますが、クエリが実行されるまでに長い待ち時間(たとえば、最大12000ミリ秒)がかかることがよくあります。
データストアからのレイテンシはクエリに関連していないことがわかります(たとえば、同じクエリ/データのレイテンシは大きく異なります)。したがって、これはAppEngineのスケジュールの問題であると想定しています。
他の人もこれと同じ問題を見ていますか?
レイテンシーを減らす方法はありますか(管理コンソールの設定など)?
これがappstatsのスクリーンショットです。このサーブレットには、CPU処理がほとんどありません。getObjectByIDを実行してから、データストアクエリを実行します。クエリにはOR演算子があるため、AppEngineによって3つのクエリに変換されます。
。ご覧のとおり、最初のgetObjectByIDが実行されるまでに6000ミリ秒かかります。get操作の前に処理はありません(pmを取得する以外)。この6000msの遅延はインスタンスのウォームアップが原因である可能性があると考えたため、ウォームアップを防ぐためにアイドル状態のインスタンスを2に増やしました。
次に、getObjectByIDとクエリの間に約1000msの2番目の遅延があります。getとqueryの間にゼロ行のコードがあります。コードは単にgetObjectByIDの結果を取得し、クエリの一部としてデータを使用します。
総計は8097ミリ秒ですが、データストア操作(およびサーブレットの99.99%)はわずか514ミリ秒(45ミリ秒のAPI)ですが、サーブレットを実行するたびに数値が変化します。これは、同じデータに対して同じサーブレットで実行された別のappstatsスクリーンショットです。
これが私のJavaコードの基本です。セキュリティ上の理由から、詳細の一部を削除する必要がありました。
user = pm.getObjectById(User.class, userKey);
//build queryBuilder.append(...
final Query query = pm.newQuery(UserAccount.class,queryBuilder.toString());
query.setOrdering("rating descending");
query.executeWithArray(args);
編集:Pingdomを使用すると、GAEレイテンシが450ミリ秒から7,399ミリ秒、つまり1,644%の差で変化することがわかります。これは、2つのアイドル状態のインスタンスがあり、サイトにユーザーがいない場合です。