13

appstatsを使用すると、データストアクエリに約125ミリ秒(apiとcpuを合わせたもの)かかっていることがわかりますが、クエリが実行されるまでに長い待ち時間(たとえば、最大12000ミリ秒)がかかることがよくあります。

データストアからのレイテンシはクエリに関連していないことがわかります(たとえば、同じクエリ/データのレイテンシは大きく異なります)。したがって、これはAppEngineのスケジュールの問題であると想定しています。

他の人もこれと同じ問題を見ていますか?

レイテンシーを減らす方法はありますか(管理コンソールの設定など)?

これがappstatsのスクリーンショットです。このサーブレットには、CPU処理がほとんどありません。getObjectByIDを実行してから、データストアクエリを実行します。クエリにはOR演算子があるため、AppEngineによって3つのクエリに変換されます。

appstatsのスクリーンショット 。ご覧のとおり、最初の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つのアイドル状態のインスタンスがあり、サイトにユーザーがいない場合です。 ここに画像の説明を入力してください

4

2 に答える 2

9

一部のアプリで、非常に類似したレイテンシ(7000〜10000ミリ秒の範囲)が観察されました。問題の大部分(6000ms)はコードにあるとは思いません。

私の観察では、この問題はAppEngineが新しいインスタンスを起動することに関連しています。最小アイドルインスタンスを設定すると軽減できる場合がありますが、解決されません(最大2つのアイドルインスタンスを試しました)。基本的に、アイドルインスタンスがN個ある場合でも、アプリエンジンは、単一のリクエストが着信した場合でも動的インスタンスをスピンアップすることを好みます。クレイジーなトラフィックスパイクの場合に備えて、アイドル状態のものを「保存」します。これは、すでに存在するインスタンスを使用し、将来の要求のために動的なインスタンスを起動することを期待するため、非常に直感的ではありません。

とにかく、私の経験では、この問題(10000msの遅延)がゼロ以外の負荷の下で発生することはめったになく、多くの人は数分ごとにpingの王(おそらくcronジョブ)に戻らなければなりませんでした(5分で作業するために使用されました)ただし、最近はインスタンスの停止が速くなっているため、2分ごとにpingを実行するようなものです)、動的インスタンスを維持して、他に誰もいないときにサイトにアクセスしたユーザーにサービスを提供します。このpingは、無料の割り当てで消費されるため理想的ではありません(5分ごとにpingを実行すると、半分以上が消費されます)が、これまでのところ、これ以上の方法は見つかりませんでした。

要約すると、一般的に、アプリエンジンは負荷がかかっているときは素晴らしいですが、サイトにユーザーが非常に少ない(1〜3人)場合は目立たないことがわかりました。

于 2013-01-21T04:06:04.147 に答える
1

Appstatsは、GAE API/RPC呼び出しを行うときにのみパフォーマンスの問題を診断するのに役立ちます。

ダイアグラムの場合、インスタンスでコードを実行するために「空白」の時間が費やされます。スケジュール時間にはなりません。

初期遅延はインスタンスのウォームアップが原因である可能性が高いと推測されます。実行中のフレームワークコードである可能性があります。GetとQueryの間の遅延を推測することはできません。コードが0行ある可能性がありますが、クエリで処理に時間がかかる関数を呼び出しました。

言語、フレームワーク、または実際のコードの知識がなければ、誰もあなたを助けることはできません。

これを診断するには、独自に何らかのパフォーマンストレースを追加する必要があります。これを行う最も簡単な(ただし、精度は高くありません)方法は、コードの実行時にタイマーを追加し、タイマー値をログに記録することです。

于 2013-01-19T17:39:20.587 に答える