GAE の CPU 負荷を下げるちょっとした Tips
AZlink/widget を Google App Engine に移したのですが、CPU 負荷がそれなりに高くて課金されそうなので対応してみました。
まずポックンの GAE の Request/Second のグラフです。キャプチャ取ったのがだいたい 13:15 ごろですので、夜中はアクセスが下がってる感じです。
次に CPU Secondes Used/Second のグラフです。CPU 負荷を下げる対応を夜中にしたのですが、Requests/Second が朝になって上がったのに比べ CPU Secondes Used/Second はそれほど上がってないのでそれなりに効果があった感じです。
で、何を直したかって言うと、Query を使ってる箇所を key_name での検索に変えただけだったりします。
具体的には、AZlink/widget では JavaScript から Amazon の ASIN 等をパラメータに JSONP リクエストを GAE に発行し、GAE ではそのパラメータを引数に検索してデータを返します。
GAE 上に以下のような Model があって、
class AZlinkAsinModel(db.Model):
asin = db.StringProperty(required=True)
# その他のプロパティ...
HTTP パラメータ経由で渡された asin を引数に AZlinkAsinModel を検索していました。
class AZlinkHandler(webapp.RequestHandler):
def get(self):
asin = self.request.get('asin')
query = db.Query(AZlinkAsinModel)
query.filter('asin =', asin)
data = None
try:
rows = query.fetch(1)
if rows:
data = rows[0]
except NeedIndexError:
pass
# ...
で、負荷が微妙に重いような気がしたのでこんな感じに直してみました。
class AZlinkHandler(webapp.RequestHandler):
def get(self):
asin = self.request.get('asin')
key_name = 'key:%s' % asin
data = db.get(db.Key.from_path('AZlinkAsinModel', key_name))
# ...
なお、key_name で検索できるようにするには、あらかじめ key_name を指定してデータを登録しておく必要があります。こんな感じす。
data = AZlinkAsinModel(key_name='key:%s' % asin, ...)
ぶっちゃけ AZlink ではこんなこともあろうかと、負荷が上がったら直せるように最初から key_name を HTTP リクエストと関連付けるようにコーディングしてたのですが、考慮してなかった場合はデータ登録に関するコードの修正と、既存データの更新が必要になりますのでお気をつけを。
ついでに key_name でオブジェクト引っ張ってこれるのにわざわざ Query 使ってたのはその方が普通っぽかったからです。key_name 長に制限とかあるだろし。なんでファーストチョイスとしては Query 使っといた方が良いと思います。
もっと詳しいことは Key クラス – Google App Engine – Google Code とかキーとエンティティ グループ – Google App Engine – Google Code をご覧ください。
![]()
とりあえずこれで当分お金払わなくて済みそうなの〜w
嫌儲とかそういうんじゃないんだけど、AZlink/widget は今んとこポックンがむふぅむふぅできるようなサービスじゃないので、払わないで済むなら払いたくないwww



