LoginSignup
8
4

More than 5 years have passed since last update.

GAE/go 1.11 環境のパフォーマンスを最大化する方法

Last updated at Posted at 2019-02-05

GAE つかってますかっ?

Go のランタイムも次世代のランタイム(2nd Gen)がリリースされ、 GAE 上の go アプリケーションから外部のサービス/サイトにアクセスする方法も Appengine SDK だけではなく、 Go の標準的な api も利用できるようになりました。

なにげに次世代のランタイムになったので標準的な API/Google Cloud SDK を何も考えずに利用している方もいるかも知れませんので、現状(2019/02/05現在)、東京リージョンに於いて、どのように利用することでパフォーマンスが最大化できるか検証してみました。

  1. Appengine Datastore SDK vs Cloud Datastore SDK
  2. urlfetch vs http.Get

の2つです!

最初に結論

  • Datastoreへの接続は Appengine Datastore SDK の方が高速
  • 外部サイトへのアクセスは http.Get の方が高速

では、計測結果を見てみましょう
リージョンは asia-northeast1 を利用します。

Datastore への接続の速度

Datastore へ GAEから接続する場合には
import に google.golang.org/appengine/datastore と記述する Appengine Datastore SDK と cloud.google.com/go/datastore と記述する Cloud Datastore SDK の2種類があります。

利用したコードは 後ほど公開する予定です。

Appengine Datastore SDK

Datastore から同一のkeyで30回エンティティを取得し、平均時間をだします。

スクリーンショット 2019-02-05 17.05.15.png

平均時間 8.7 msec. でした。

Cloud Datastore SDK

同様に Cloud Datastore SDK の場合には

スクリーンショット 2019-02-05 17.07.34.png

平均 32 msec. 極稀に 8 msec. と早いものもありますが、 30-40 msec. は必要と考えたほうが良さそうです。

実際に URL を実行してクライアント側にレスポンスが返る応答時間も Appengine Datastore SDK を利用した場合より 4 倍ほど遅いです。(体感でも十分におそいと感じるレベル)

外部サイトへの接続の速度

外部の API を実行したり(Slack通知とか)、GAE でマイクロサービス的に相互に REST を実行する場合などで外部の URL へリクエストを実行する場合があると思います。
従来のように import に google.golang.org/appengine/urlfetch と記述する urlfetch と、 net/http と記述する http.GET の両方が利用できるため、実際に github.io で公開するページに向けてリクエストを実行してみます。

urlfetch を利用する

同一の URL に対し、30回リクエストを実行し、平均時間を出します。

スクリーンショット 2019-02-05 17.24.53.png

平均で 295 msec. 程度かかるようです。
そんなに早くないという印象です。

http.GET を利用する

同様に http.GET を利用した場合には

スクリーンショット 2019-02-05 17.23.52.png

平均で 185 msec. になります。結構早いです。

(ログのスクショは諸般の理由で30件全件撮れていません)

再度、結果まとめ

つまり一番最初にまとめたように、
Datastore へのアクセスには Appengine Datastore SDK を利用したほうが速く、
外部へのアクセスには http.GET を利用したほうが速い。
ということがわかりました。

速さ以外のメリット・デメリット

外部へのアクセスは http.GET を利用したほうが速いと書きましたが、 urlfetch を利用した場合には何もせずとも Stackdriver に Trace が出力されます。
アプリケーションのパフォーマンスを計測する場合に重宝しますので、自前で Open Census を利用して Stackdriver に Trace を出力する事もできますが場合によっては urlfetch を選択するメリットもありそうです。

気になったところ

urlfetch, http.GET いずれの場合も、同一の URL に対して何度も上記のテストを行った場合、著しくレイテンシが向上する場合があります。
(以下 http.GET を利用した場合に複数回テストを連続で実行した場合の結果です。)
リクエストの結果がキャッシュされるのか 1 msec. ぐらいで終了します。

スクリーンショット 2019-02-05 17.16.07.png

では、上手に使ってハイパフォーマンス GAE/go ライフを楽しみましょう!w

8
4
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
8
4