Google App Engine чрезмерно маленькие операции с хранилищем данных - PullRequest
7 голосов
/ 11 ноября 2011

У меня проблемы с хранилищем данных движка приложений Google.С тех пор, как была введена новая модель ценообразования, стоимость запуска моего приложения значительно возросла.

Похоже, виновником являются "мелкие операции хранилища данных", которые производят более 20 миллионов операций в день!

У кого-нибудь была такая проблема, я не думаю, что я выполняю слишком много поисков по ключевым словам, и у меня всего 5000 пользователей, примерно 10-20 запросов в минуту.

Заранее спасибо!

Редактировать

Хорошо, есть некоторые статистические данные, они через 3 часа.Вот то, что я вижу на своей панели инструментов в разделе биллинга: Appengine dashboard - billing

А вот некоторые из характеристик:

Stats

Очевидно, что естьдовольно много звонков на datastore.get.Я начинаю думать, что проблема заключается в моем дизайне.Те получает соответствует учетным записям.У каждого пользователя есть учетная запись, но учетная запись может быть одного из двух типов, для этого я использую композицию.Таким образом, каждая сущность учетной записи имеет ссылку на свою сущность субсчета.В результате, когда я выполняю поиск ближайших пользователей, это включает выборку учетных записей с использованием запроса, а затем выполнение каждой учетной записи, чтобы получить свою вспомогательную учетную запись.Самый верхний запрос на рисунке статистики - это вызов, который получает 100 учетных записей, а затем должен получить доступ к каждому.Я бы подумал, что это очень легкий запрос, но, думаю, нет.И я все еще смущен количеством операций по хранилищам данных, записанных на моей панели.

Ответы [ 4 ]

11 голосов
/ 12 ноября 2011

Определенно используйте appstats, как предлагает Дрю;независимо от того, какую библиотеку вы используете, она сообщит вам, какие операции выполняют ваши обработчики.Наиболее вероятными виновниками являются запросы только по ключам и операции подсчета.

9 голосов
/ 12 ноября 2011

Мой совет - использовать AppStats ( Python / Java ) для профилирования вашего трафика и выяснения, какой обработчик генерирует наибольшее количество операций хранилища данных.Если вы разместите здесь код, мы можем предложить варианты оптимизации.

1 голос
/ 13 ноября 2011

Много ли у вас свойств ReferenceProperty в ваших моделях? Доступ к ним вызовет db.get для каждого свойства, если вы предварительно не выберете их. Это вызовет 101 запрос db.get.

class Foo(db.Model):
   user = db.ReferenceProperty(User)

foos = Foo.all().fetch(100)
for f in foos:
  print f.user.name  # this triggers db.get(parent=f, key=f.user)
1 голос
/ 12 ноября 2011

Не сканируйте свое хранилище данных, используйте get (key) или get_by_id (id) или get_by_key_name (keyname) столько, сколько можете.

...