サイトのトップへ戻る

Google App Engine ドキュメント日本語訳

アプリのリソースを管理する

App Engineでは使用状況レポートを生成し、あなたがアプリケーションのパフォーマンスとアプリケーションで使用しているリソースを把握するための手助けをします。 これらのレポートに基づき、以下一覧から手法を選んであなたのリソースを管理します。 変更を行った後には、その後の使用状況レポートには変更が反映された情報が表示されます。 詳細情報については課金 FAQ価格のページを参照してください。

  1. 使用状況レポートを閲覧する
  2. 動的インスタンスの拡張を管理する
  3. アプリケーションストレージを管理する
  4. データストアの使用状況を管理する
  5. その他のリソースを管理する


使用状況レポートを閲覧する

あなたが自分のアプリケーションのパフォーマンスを評価する場合、どれだけインスタンスが実行されているかとどれだけリソースが消費されているかに注目するでしょう。

Google開発者コンソールのダッシュボードのページでは、毎日の使用状況レポートをリソース使用状況の概要表と共に表示します(ページを開く)。 コンソールのインスタンスのページでは、現在のインスタンス全ての一覧を表示します(ページを開く)。

以降の項目ではリソースの管理に使用できるいくつかのやり方を提示し、それらのやり方があなたのアプリケーションのパフォーマンスにどう作用するのかを説明します。



動的インスタンスの拡張を管理する

待ち時間を減らす

アプリケーションの待ち時間は、トラフィックの処理に必要なインスタンス数に大きな影響を及ぼします。待ち時間を減らすことで、あなたのアプリケーションで使われるインスタンスの数に大きな影響を与えます。ここにアプリケーションの待ち時間を減らすためにできることをいくつか記載します。:
  • 頻繁にアクセスされる共有データのキャッシュを増やす - 言い換えれば - メモリキャッシュを使う。また、アプリケーションのcache-control ヘッダを設定した場合、サーバやブラウザでどれだけ効率的にデータを保存するかに大きな影響を与えます。数秒間のキャッシュでさえ、アプリケーションがどれだけ効率的にトラフィックを処理するかに大きな影響を与えます。また、Python アプリケーションは同様にcaching in the runtimeも使用してください。
  • メモリキャッシュをさらに効果的に使う - get, set, deleteなどについては、個別に呼び出すのではなくバッチ呼び出しを使ってください。 場合によっては、メモリキャッシュの非同期APIの使用も検討してください。(Java, Python).
  • ユーザーからのリクエストと関係ない機能についてはタスクを使う- あなたのアプリケーションがリクエストとは関係のない処理を実行する場合は、その処理をタスクに置いて下さい!処理が完了するのを待たず、応答が返ってくる前にタスクキューへ送ることで、待ち時間を大きく減らすことができます。タスクキューを使用することで、実行率をより制御でき、読み込みをスムーズに行うことができます。
  • データストアをさらに効果的に使う - We go in to more detail for this below.
  • 複数の URL Fetch 呼び出しを並列化する
    • 非同期URL Fetch API を使用する(Java, Python).
    • goroutinesを使用する (Go)。
    • (ユーザーのリクエスト内で個別に処理しているであろう)複数のURL Fetch 呼び出しをまとめてバッチ処理し、非同期URL Fetchを使って、オンラインタスクで並行に処理する。
  • Java HTTP セッションの場合は、非同期で書き込む - HTTP セッション(Java)では、appengine-web.xmlファイルに<async-session-persistence enabled="true"/>を追加することで、あなたのアプリケーションがhttp セッションデータを非同期でデータストアに書き込むように設定することができます。セッションデータは常に同期的にメモリキャッシュへ書き込まれ、メモリキャッシュが使用できない場合にリクエストがセッションデータを読み込もうとすると、データストアが処理を代替しますが、データストアはまだ最新のデータに更新されていない可能性があります。 This means there is a small risk your application will see stale session data, but for most applications the latency benefit far outweighs the risk.

自動拡張のパフォーマンス設定を変更する

モジュール設定ファイルには、パフォーマンスとリソース読み込みとの兼ね合いを調整するために使用できる二つの設定があります。:

  • 最大待機インスタンス - 最大待機インスタンス設定を使うことで、あなたのアプリーションで使用できる待機インスタンスの最大数を制御することができます。 この制限を設定することでApp Engineに制限を越えた待機インスタンスを停止させ、追加の割り当て量を消費せず料金を発生させません。 しかし待機インスタンスが少ないと、大量のトラフィックがきた場合にApp Engineスケジューラは新しいインスタンスを起動させなければなりません -- あなたのアプリケーションのユーザー表示待ち時間が増加する可能性があります。 (Java | Python | Go | PHP)
  • 最小保留待ち時間 - 最小保留待ち時間を上げることで、App Engineのスケジューラは、リクエストの保留時間が指定した時間を越えない限り新しいインスタンスを起動させないようになります。全てのインスタンスが作業中の場合、ユーザーのリクエストは保留キューでこの閾値に達するまで待たなければなりません。 これに高い値を設定すると起動するインスタンスを少なくできますが、結果として負荷が増大した時にユーザー表示待ち時間が長くなる可能性があります。 (Java | Python | Go | PHP)

Javaで同時リクエストを有効にする

1.4.3 のリリースにおいて、Javaのアプリケーションで複数のリクエストを同時に処理するための機能が導入されました。 この設定を有効にすることで、アプリケーションのトラフィックを処理するのに必要なインスタンスの数を減らすことができますが、これを正しく動作させるにはアプリケーションをスレッドセーフにしなければなりません。同時リクエストを有効にする方法については Java ドキュメントを参照してください。

Pythonで同時リクエストを有効にする

Python 2.7において、Pythonのアプリケーションで複数のリクエストを同時に処理するための機能が導入されました。この設定を有効にすることで、アプリケーションのトラフィックを処理するのに必要なインスタンスの数を減らすことができますが、これを正しく動作させるにはアプリケーションをスレッドセーフにしなければなりません。同時リクエストを有効にする方法については Python ドキュメントを参照してください。 同時リクエスト機能は、 Python 2.5 ランタイムでは使用できません。

タスクキュー設定を設定する

既定のタスクキューの設定は、パフォーマンスを重視して調整されています。これらの既定値のまま使用すると、複数のタスクを同時にキューに入れると新たにフロントエンドインスタンスが起動されるでしょう。ここでは、インスタンス時間を節約するためにタスクキューを調整する方法をいくつか例示します。:
  • 待ち時間があまり関係ないタスクに X-AppEngine-FailFastヘッダを設定します。このヘッダは、既存のインスタンスが使用できない場合はスケジューラにすぐリクエストを失敗させるよう指示をします。タスクキューは既存のインスタンスがリクエストを処理できるようになるまでリトライとバックオフをします。しかし、X-AppEngine-FailFastを設定したリクエストが既存インスタンスを占有してしまうと、X-AppEngine-FailFastが設定されていないリクエストが来ると新しいインスタンスが作成されてしまうので注意してください。
  • タスクキュー設定を設定する(Java, Python).
    • "rate" パラメータに低い値を設定した場合、タスクキューはより遅い速度であなたのタスクを実行します。
    • "max_concurrent_requests" パラメータに低い値を設定した場合、同時に実行されるタスクはより少なくなります。
  • タスクの実行に使用されるインスタンスの数を完全に制御するために、バックエンド(Java, Python)を使用します。 動的バックエンドでプッシュキーを使用したり、固定バックエンドでプルキューを使用することができます。

可能な場合は静的コンテンツを提供する

静的コンテンツサービス(Java, Python) は、インスタンス時間を消費しない特殊な App Engine インフラによって制御されます。 カスタムヘッダを設定する必要がある場合は、 Blobstore API を使用してください(Java, Python, Go)。 Blob 応答を提供するのにインスタンス時間は消費しません。


アプリケーションストレージを管理する

App Engine では、データストアのエンティティのサイズ・データストアのインデックスのサイズ・タスクキューのタスクのサイズ・Blobstoreに保存されているデータの量に基づいてストレージ費用を計算します。ここでは、必要以上にデータを保存しないようにするためにできることをいくつか提示します:

  • アプリケーションでもう使用していないエンティティや blobを削除する。
  • 下記のデータストアの使用状況を管理するの項目で説明するように、不要なインデックスを削除してインデックスのストレージ費用を減らす。


データストアの使用状況を管理する

App Engine accounts for the number of operations performed in the Datastore. ここでは、データストアへのリクエストの待ち時間を減らす方法と、データストアのリソース消費を減らす方法をいくつか提示します。:

  • The dev console dataviewer displays the number of write ops that were required to create every entity in your local datastore. この情報を使って、各エンティティを書き込むコストを把握することができます。このデータの見方については Understanding Write Costsを参照してください。
  • 不要なインデックスを削除し、ストレージとエンティティ書き込みコストを減らします。アプリケーションで定義されているインデックスを見るには"Get Indexes" 機能を使ってください (JavaPython)。 開発者コンソールのインデックスのページにおいて、アプリケーションでインデックスが提供しているものを見ることができます。
  • データモデルを設計する際に、カスタムインデックスを一切回避する方法でクエリを記述することができる場合があります。 App Engineがインデックスを生成する方法についての詳細情報はクエリとインデックス のドキュメントを読んでください。
  • Whenever possible, replace indexed properties (which are the default) with unindexed properties (Java, Python), which reduces the number of datastore write operations when you put an entity. Caution, if you later decide that you do need to be able to query on the unindexed property, you will need to not only modify your code to again use indexed properties, but you will have to run a map reduce over all entities to reput them.
  • App Engine 1.5.2 と 1.5.3 のリリースにおいてデータスタストアのクエリプランナーが改善されたため (JavaPython)、 以前よりもクエリに必要なインデックスが少なくなりました。 パフォーマンスの理由で特定のカスタムインデックスをまだ保持しているかもしれませんが、それらを削除してストレージとエンティティ書き込みコストを減らすことができるかもしれません。
  • クエリをキーによる抽出に置き換えられるように、データモデルを再設定します (Java, Python, Go)。これにより、より安くより効率的になります。
  • 可能であれば、エンティティクエリではなくkeys-onlyクエリを使用してください。
  • 待ち時間を減らすには、複数のエンティティで get()を数回実行するのではなく、バッチでまとめて get()を実行してください。
  • データストアのページング処理にはオフセットではなくカーソルを使用してください。
  • 非同期のデータストア API を使い、複数のデータストアRPCを並列化してください(Java, Python)、 goroutines (Go)。

注意: データストアの小規模操作には、データストアにIDを割り当てるものやkeys-onlyクエリがあります。 費用の詳細情報については 価格のページを参照してください。



帯域幅を管理する

送信帯域幅の場合、使用量を減らすには、可能な限り応答に適切な Cache-Controlヘッダを設定して静的ファイルの合理的な有効期限(Java, Python)を設定する方法があります。 この方法でCache-Control ヘッダを使用することで、プロキシサーバとあなたのクライアントのブラウザは指定されてた期間に応答をキャッシュします。

受信帯域幅はユーザーがあなたのアプリに送信するデータ量なので、制御するのが難しくなります。しかし、 this is a good opportunity to mention our DoS Protection Service for Python and Java, which allows you block traffic from IPs that you consider abusive.



その他のリソースを管理する

このページでの最後の項目は、Eメール, XMPP, Channel APIの使用です。これらAPIについて、効果的に使用することあなたにとって一番大事なことです。 これらAPIの使用状況を把握するのにベストな方法の一つは、 必要以上に呼び出しをしないようにAppstats (Python, Java)を使うことです。また、エラー率を確認して無効な呼び出しを発生させていないか探すのも良いでしょう。場合によっては、そうした無効な呼び出しを早期に見つけ出せるかもしれません。