アプリエンジンで実行されているアプリからの周期的な、しかし一貫した待ち時間スパイクに気付きました。最初はネットワークが遅いかもしれないと思っていましたが、アプリの統計ではそうはならないことが確認されました。低負荷でのアプリエンジン一貫性のある待ち時間の急上昇
私は現在、私は次のように使用している、のSDKの古いバージョンと新しいバージョンを使用して、待ち時間のスパイクを再現することができました:
- のApp Engine SDK:1.9.42
- のGoogleクラウドエンドポイント:1.9.42
- 客観化:5.1.13
- Appstatsの(デバッグネットワークの待ち時間に)
だからアプリの利用状況はかなりlでありますOW、最後の30日間で、私は0.04の要求の下で、一般的に第二だ:
ほとんどの作業は、同様に1つのインスタンスで行われ
:は、ほとんどの操作待ち時間が下にもあります非常に多くのリクエストが10〜30倍長くなります。
だから私はそれだけでネットワークレイテンシでなければなりません考え出したが、遅くなり、操作のすべてのappstatはこれを反証。 Datastoreとネットワークは常に信頼性が高く評価されています。ここでは30秒を引き継ぐ遅い要求の解剖学は、次のとおりです。ハイレベルで
私のコードはかなりつまらないです:それは簡単です。ここ
は、通常のリクエストの解剖学的構造がありますいくつかのネットワークコールを行い、クラウドデータストアからデータをセーブ/リードするapi。全体のソースはgithub hereにあります。アプリは、単一の自動スケーリングアプリエンジンインスタンスで実行され、ウォームアップされます。先月doesntのオーバー
CPUの使用率は、刺激的なものを示しているように見えるのいずれか:
それも、コードかかわらず、でも迅速な操作のために、時間の巨大な割合は、CPUに費やされていることを確認するために本当に奇妙ですいくつかのオブジェクトを作成し、永続させ、JSONを返します。私はCPUがパフォーマンスを定期的に低下させる可能性のある別のアプリによってCPUがアプリケーションエンジンのインスタンスに固定されているのかどうか疑問に思っています。
マイappengine.xmlの設定は次のようになります。
<?xml version="1.0" encoding="utf-8"?>
<appengine-web-app xmlns="http://appengine.google.com/ns/1.0">
<application>sauce-sync</application>
<version>1</version>
<threadsafe>true</threadsafe>
<automatic-scaling>
<!-- always keep an instance up in order to keep startup time low-->
<min-idle-instances>1</min-idle-instances>
</automatic-scaling>
</appengine-web-app>
そして、私のweb.xmlは次のようになります。
<web-app xmlns="http://java.sun.com/xml/ns/javaee" version="2.5">
<servlet>
<servlet-name>SystemServiceServlet</servlet-name>
<servlet-class>com.google.api.server.spi.SystemServiceServlet</servlet-class>
<init-param>
<param-name>services</param-name>
<param-value>com.sauce.sync.SauceSyncEndpoint</param-value>
</init-param>
</servlet>
<servlet-mapping>
<servlet-name>SystemServiceServlet</servlet-name>
<url-pattern>/_ah/spi/*</url-pattern>
</servlet-mapping>
<!--reaper-->
<servlet>
<servlet-name>reapercron</servlet-name>
<servlet-class>com.sauce.sync.reaper.ReaperCronServlet</servlet-class>
</servlet>
<servlet-mapping>
<servlet-name>reapercron</servlet-name>
<url-pattern>/reapercron</url-pattern>
</servlet-mapping>
<servlet>
<servlet-name>reaper</servlet-name>
<servlet-class>com.sauce.sync.reaper.ReaperServlet</servlet-class>
</servlet>
<servlet-mapping>
<servlet-name>reaper</servlet-name>
<url-pattern>/reaper</url-pattern>
</servlet-mapping>
<welcome-file-list>
<welcome-file>index.html</welcome-file>
</welcome-file-list>
<filter>
<filter-name>ObjectifyFilter</filter-name>
<filter-class>com.googlecode.objectify.ObjectifyFilter</filter-class>
</filter>
<filter-mapping>
<filter-name>ObjectifyFilter</filter-name>
<url-pattern>/*</url-pattern>
</filter-mapping>
</web-app>
TLDR私は完全にこだわっていると私はどのようにわからないんだけどデバッグしたり修正したりすることができます。これは、アプリエンジン上の小規模なアプリにとってはいつものようにこれがビジネスだと思っています。
私のアプリがいくつかの二段のハードウェアを実行しているか、多くのリソースを消費しているアプリケーションを実行していることを期待しながら、常駐インスタンスをオフにすることを考えています。誰もが同様のパフォーマンスの問題にぶつかるか、アプリのプロファイルを作成する追加の方法を知っていますか?
EDIT:
私は1つの常駐インスタンス上で実行して試してみたが、私はまた、結果なしで2-4 per this questionで同時要求を設定しようとしました。ログとappstatsは、私のコードが最初に実行されるのを待って過度の時間が費やされたことを確認します。ここでは、コードの最初の行が実行される25秒前に要求がありますが、この時点でどのエンドポイント/アプリケーションエンジンが実行しているかはわかりません。
再び負荷がまだ低いと、この要求は暖めインスタンス上です。
EDIT 2:
は、App Engineの+のエンドポイントがmin-idle-instances
セットとよく遊ぶdoesntの何らかの理由のように思えます。デフォルトのアプリエンジン設定に戻すと問題が解決しました。
が潜在的に関連しています(ただし、負荷がかかると見られます):http://stackoverflow.com/questions/37307461/what-can-cause-high-variability-of-untraced-time-in-app-engine-requests –
いくつのインスタンスが通常アクティブですか?最小アイドルインスタンスが1に設定されていても、新しいインスタンスの到着が遅れることはありません。 – BrettJ
一般に1つのインスタンスで、インスタンス数を元のグラフにグラフを添付しました。私はあまりにも、たとえ寒さのインスタンスが起動し、要求を完了するためには30秒をはるかに短く取るものの、それを示すものではないとは思わない。レイテンシが高いため、追加のノードが起動する可能性が高いようです。また、遅いリクエストはすべて、最初のインスタンスで発生します。ローディングリクエストはこれらの遅いリクエストに設定されていません。 – sauce