7
votes

Django: Comment pouvez-vous arrêter de longues questions de tuer votre base de données?

J'utilise django 1.1 avec MySQL 5. * et tables myisam.

Certaines de mes questions peuvent prendre une tonne de temps pour les valeurs aberrantes de mon ensemble de données. Celles-ci verrouillent les tables et fermez le site vers le bas. D'autres fois, il semble que certains utilisateurs annulent la demande avant sa fin et certaines requêtes seront bloquées dans la phase "Préparation" Verrouillage de toutes les autres requêtes.

Je vais essayer de suivre tous les cas d'angle, mais c'est agréable d'avoir un filet de sécurité afin que le site ne sort pas.

Comment puis-je éviter cela? Puis-je définir des temps de requête maximale?


2 commentaires

Qu'est-ce qu'une valeur aberrante dans un ensemble de données?


Quelqu'un qui a beaucoup plus grand que le nombre normal de réalisations, ou un très grand nombre d'alias sur le Web.


6 Réponses :


0
votes

Il semble que le seul moyen fiable d'abandonner une requête soit le Tuez la commande . Une mesure moins drastique consiste à fermer la connexion (et à rouvrir un nouveau); Cela mettra fin à des requêtes dès qu'ils essaient de Envoyer une certaine sortie à le client.


1 commentaires

Comment puis-je détecter cela à Django? Je préférerais ne pas avoir de cronjob qui vérifie chaque seconde pour voir ce qu'il doit tuer ...



0
votes

Savez-vous ce que sont les requêtes? Peut-être que vous pourriez optimiser le SQL ou mettre des index sur vos tables?


1 commentaires

Bien sûr, je travaille sur les requêtes. J'ai trouvé environ 4 qui tuent la DB. Mais je veux un filet de sécurité afin qu'il n'y ait pas de requête pouvant verrouiller mon dB et tuer le site.



1
votes

Malheureusement, MySQL ne vous permet pas d'éviter cela. Une méthode courante est fondamentalement pour écrire un script qui vérifie tous les processus d'exécution toutes les x secondes (basé sur ce que vous pensez être "long") et tuez ceux qu'il voit trop longtemps. Vous pouvez au moins obtenir des diagnostics de base, cependant, en définissant log_slow_queries dans MySQL qui écrira toutes les requêtes qui prennent plus de 10 secondes dans un journal. Si cela est trop long pour ce que vous considérez comme "lent" à vos besoins, vous pouvez définir long_query_time sur une valeur autre que 10 pour changer le seuil.


2 commentaires

SIALER J'avais peur de cela. Y a-t-il des scripts que vous recommandez pour ce travail?


Avez-vous trouvé des scripts pour faire cela?



1
votes

Je fais une application de réplication Django DB et j'ai la même situation, les questions à travers une WAN peuvent parfois sembler simplement accrocher si la latence de réseau augmente.

de http://code.activestate.com/recipes/576780/

Recette 576780: Timeout pour (presque) Tout appelable P>

Créer une version limitée de tout appel de n'importe quel appel. p>

Par exemple, pour limiter la fonction f à t secondes, Créez d'abord une version limitée du temps de f code>. p> xxx pré>

puis, au lieu d'appeler f (...) code>, Utilisez f_t code> comme p>

def _run_timed_query(cursor, log_msg, timeout, query_string, *query_args):
    """Run a timed query, do error handling and logging"""
    import sys
    import traceback
    from timelimited import *

    try:
        return TimeLimited(cursor.execute, timeout)(query_string, *query_args)
    except TimeLimitExpired:
        logger_ec.error('%s; Timeout error.' % log_msg)
        raise TimeLimitExpired
    except:
        (exc_type, exc_info, tb) = sys.exc_info()
        logger_ec.error('%s; %s.' % (log_msg, traceback.format_exception(exc_type, exc_info, None)[0]))
        raise exc_type


0 commentaires

0
votes

Utilisez des tables innodb, ils font au lieu de Verrouillage de table .


1 commentaires

Je l'ai fait, mais je suis surtout lu et InnoDB était un ralentissement de l'ordre de magnitude pour ma charge de requête :(



0
votes

Vous ne devriez pas écrire des questions comme ça, du moins de ne pas courir contre votre base de données en direct. MySQL a une "question lente" pararamètre que vous pouvez utiliser pour identifier les requêtes qui vous tuent. La plupart du temps, ces requêtes lentes sont soit buggy ou peuvent être accélérées en définissant un nouvel index ou deux.


0 commentaires