7
votes

Google App Moteur Excessive Petit Datastore Opérations

J'ai des problèmes avec le magasin de données Google App Moteur. Depuis que le nouveau modèle de tarification a été introduit, le coût de la gestion de mon application a augmenté massivement.

Le coupable semble être "Datastore Small Operations", qui se situe à plus de 20 millions d'ops par jour!

Quelqu'un a-t-il eu ce problème, je ne pense pas que je fasse une quantité excessive de recherches clés, et je n'ai que 5 000 utilisateurs, avec environ 10 à 20 demandes par minute.

Merci d'avance!

Modifier

OK Vous avez des statistiques, celles-ci sont après 3 heures. Voici ce que je vois dans mon tableau de bord, dans la section de facturation: appengine tableau de bord - facturation

Et voici certaines des statistiques:

statistiques

Évidemment, il y a beaucoup d'appels à Datastore.get. Je commence à penser que c'est mon design qui cause le problème. Ceux qui reçoivent des comptes. Chaque utilisateur a un compte, mais un compte peut être l'un des deux types, car j'utilise la composition. Donc, chaque entité de compte a un lien vers sa sous-compte. En conséquence, lorsque je recherche les utilisateurs à proximité, il implique la recherche des comptes à l'aide de la requête, puis effectuez une tâche sur chaque compte pour obtenir son compte Sub. La demande supérieure dans la photo Statists est un appel qui obtient 100 comptes, puis doit faire une tâche sur chacun. J'aurais pensé que c'était une requête très légère, mais je suppose que non. Et je suis toujours confondu par le nombre de matières ops de Datastore étant enregistrées dans mon tableau de bord.


5 commentaires

Par curiosité, quelle était votre facture mensuelle typique avant et après?


Mon quota quotidien était de 2 $ et je n'ai jamais frappé ça. Maintenant, il y a 5 dollars et je le dépasse tous les jours. Je pense que je devrais passer à 9 $ par jour.


Désolé, j'aurais aussi dû poser cela, mais utilisez-vous Memcache du tout?


Non, je n'ai pas vraiment regardé Memcache. J'aurais pensé que le DataStore pourrait gérer la quantité actuelle de données pour un prix beaucoup plus raisonnable. Cela dit, ce n'est pas un site que je suis en cours d'exécution, c'est le backend pour une application, un jeu, il est donc assez lourd sur le traitement.


"La demande supérieure dans la photo Statists est un appel qui obtient 100 comptes, puis doit faire un message sur chacun." Vous devriez rechercher toutes les 100 clés d'un lot plutôt que de faire un individu obtient. Voir ici pour une explication du modèle. En outre, vous devez absolument garder des entités fréquemment consultées dans MemCache pour réduire les recherches de données de magasin de données.


4 Réponses :


9
votes

Mon conseil serait d'utiliser AppStats ( Python / Java ) pour profiler votre trafic et déterminer quel gestionnaire génère le plus ops de datastore. Si vous postez le code ici, nous pouvons potentiellement suggérer des optimisations.


2 commentaires

Je sais où va la majeure partie de mon trafic et j'utilise "Sienne", une bibliothèque Java qui travaille avec GAE. Je vais passer par mon code et essayer de choisir des extraits qui pourraient être utiles.


Appstats est mis en place, mettra à jour mon message d'origine lorsque j'ai plus d'informations. Merci.



1
votes

Ne numérisez pas votre magasin de données, utilisez get (clé) ou get_by_id (id) ou get_by_key_name (KeyName) autant que possible.


0 commentaires

11
votes

Utiliser définitivement des appstats comme Drew suggère; Quelle que soit la bibliothèque que vous utilisez, il vous dira quelles opérations font vos manutentionnaires. Les candidats les plus probables sont uniquement des requêtes et des opérations de comptage des clés.


1 commentaires

Spot ici, je dois faire une opération de synchronisation régulière et j'avais reçu un nombre total d'utilisateurs sur chaque synchronisation. Je me cache donc que maintenant, et je peux voir la différence. Acclamations!



1
votes

Avez-vous beaucoup de propriétés de référenceProperty dans vos modèles? L'accès à eux déclenchera DB.GET pour chaque propriété, sauf si vous ne les préférez. Cela déclencherait 101 demandes 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)


2 commentaires

Avec l'API Java, j'utilise, j'ai besoin d'obtenir manuellement chaque propriété qui est référencée dans une autre entité. En essayant de chercher des lots maintenant, de voir si cela me donne le coup de pouce dont j'ai besoin.


Vérifiez cette entrée de blog que j'ai écrit, la partie précédente: BRAVENEWMETHOD.WordPress.com/2011/03/23/...