ndb
ライブラリにメモリリークがありますが、どこに見つけることができないと思います。Google ndbライブラリのメモリリーク
下記の問題を回避する方法はありますか?
問題がどこにあるのかをテストするためのより正確な考え方がありますか?
:
私は2つのファイルでミニマルなGoogle App Engineアプリケーションを作成しました。
app.yaml
:
application: myapplicationid
version: demo
runtime: python27
api_version: 1
threadsafe: yes
handlers:
- url: /.*
script: main.APP
libraries:
- name: webapp2
version: latest
main.py
:
# -*- coding: utf-8 -*-
"""Memory leak demo."""
from google.appengine.ext import ndb
import webapp2
class DummyModel(ndb.Model):
content = ndb.TextProperty()
class CreatePage(webapp2.RequestHandler):
def get(self):
value = str(102**100000)
entities = (DummyModel(content=value) for _ in xrange(100))
ndb.put_multi(entities)
class MainPage(webapp2.RequestHandler):
def get(self):
"""Use of `query().iter()` was suggested here:
https://code.google.com/p/googleappengine/issues/detail?id=9610
Same result can be reproduced without decorator and a "classic"
`query().fetch()`.
"""
for _ in range(10):
for entity in DummyModel.query().iter():
pass # Do whatever you want
self.response.headers['Content-Type'] = 'text/plain'
self.response.write('Hello, World!')
APP = webapp2.WSGIApplication([
('/', MainPage),
('/create', CreatePage),
])
私は/create
一度と呼ばれるアプリケーションを、アップロードしました。
その後、/
を呼び出すたびに、インスタンスによって使用されるメモリが増加します。エラーExceeded soft private memory limit of 128 MB with 143 MB after servicing 5 requests total
により停止するまで。
メモリ使用量グラフのExemple(あなたは、メモリの成長とクラッシュを見ることができます):
注:この問題は既知の問題がありweb.py
おそらく[コンテキスト内のキャッシュ](https://cloud.google.com/appengine/docs/python/ndb/cache)だと思います。 –
私はあなたの 'ndb.put_multi'が1つのトランザクションに100個のエンティティを挿入しようとしているので、Pythonについては分かりませんが、あなたのコードを読んでいます。これはおそらく、多くのメモリが割り当てられる原因になります。ソフトプライベートメモリの制限を超えているのは、次回のリクエストがメモリ負荷を増やしてもトランザクションがまだ実行されているためです。これは、コールの間にしばらく待ってから(トランザクションが完了するまでそれぞれ待つ)発生しません。また、応答時間が大幅に増加した場合、App Engineは追加のインスタンスを開始する必要があります。 – konqi
@DanielRoseman "コンテキスト内キャッシュは、単一スレッドの間だけ持続します。"コンテキスト内キャッシュをクリアしたり、キャッシュを無効にするポリシーを設定したりすると、メモリ使用量の増加は緩やかになりますが、リークは持続します。 – greg