Forum Programmation.SQL serveur sql surchargé de maniére épisodique

Posté par  (site web personnel) .
Étiquettes :
-1
4
sept.
2008
Bonjour.
J'ai un problème de lenteur avec un serveur mysql. Ce serveur utilisé en production contient de nombreuses tables et informations : bureau d'études, GPAO, production, RH, .....
Les performances sont tout a fait satisfaisante sauf lors d'un calcul qui s'exécute toutes les 10 minutes et qui prend a peu prés une minutes.
Durant ce calcul tout les programmes de la société sont ralenti avec des temps de réponse qui explosent.
Le fautif utilise de nombreuses tables pour faire ses calculs dont certaines sont assez grosses. Le calcul se déroule ainsi : on prend une table que l'on copie dans une table temporaire, puis on utilise de nombreuses informations d'autres table pour modifier la table temporaire, une fois fini on réinjecte la table temporaire dans la table d'origine après l'avoir vidé. Je dis ceci pour dire qu'il est difficile d'externaliser ce calcul vue qu'il dépend de nombreuses.

Au niveau matériel le serveur est un DELL 1800 xeon double coeur avec une debian et 2 giga de ram et du Raid 5 en disque dur. Les tables sont au format MyISAM.

J'ai essayer de voir s'il y avait la possibilité de faire tourner ce calcul sur un deuxième serveur puis de renvoyer le résultat sur le premier mais cela nécessite d'avoir un deuxiéme serveur synchronisé avec le premier avec les logs binaires (que nous n'avons pas pour le moment). le problème c'est que le transfert de la table en question d'un serveur a l'autre prend beaucoup de temps et ralenti le serveur autant que la calcul lui même (alors qu'en restant sur le même serveur c'est rapide).

J'avoue être avoir besoin d'idée pour essayer d 'améliorer les performances. Si il faut en passer par du nouveau matériel ou autre c'est envisageable mais je pense pas que ça puisse régler grand chose.

Merci d'avance.
  • # petites pistes

    Posté par  . Évalué à 2.

    Par défaut les tables temporaires Mysql utilisent la RAM. Si elle est/devient très grosse (> tmp_table_size), elle atterrit sur le disque. Si tu fais bcp de modifs sur cette table temporaire, et que le calcul total dure 1 minute comme tu le dis, y'a des chances que les données soient réellement flushées sur le disque à partir du cache mémoire : coûteux en perfs.

    --> Il est possible d'augmenter la variable mysql : SET global tmp_table_size=1000000000;

    --> ou il est aussi possible de créer manuellement cette table temporaire, en mémoire, en précisant le TYPE HEAP lors du CREATE.

    --> Si tes requêtes pour générer cette table temporaire impliquent beaucoup de jointures, ça vaudra le coup de passer les tables originelles concernées par lesdites jointures en InnoDB

    --> Tu sembles dire que ton serveur de BDD gère de nombreuses tables, peut-être même plusioeurs bases de données ; as-tu déja vérifié que ton Mysql profite bien de toute la RAM, et pensé à ajouter une barette?
  • # indexation...

    Posté par  . Évalué à 2.

    je sais bien que ça semble évident, mais n'y a t'il pas des optimisations à faire au niveau des indexes pour accélérer certaines requêtes ou sous-requêtes?

    Par le passé, au boulot, j'ai déjà vu des traitements prendre 20x à 100x moins de temps après un profiling des requêtes et adaptation des indexes, particulièrement en cas de join sur des champs multiples.

    L'optimisation de la DB est potentiellement l'action qui fera gagner les plus de perfs (au détriment de l'espace de stockage, il est vrai)...

    Après, un clustering complet multi-maître serait peut-être à envisager
  • # Slave ou innodb

    Posté par  (site web personnel) . Évalué à 2.

    Tu peux essayer de mettre tes tables en innodb plutot que myisam, le système de lock est plus fin et donc devrait poser moins de problème de ce coté là.

    Sinon la technique du slave est très bien puisqu'elle décharge complètement de la tâche :
    - Mettre en place la réplication : plutot facile, le manuel mysql a un chapitre bien expliqué pour ça
    - Le script tourne sur le slave, fait sa table temporaire sur le slave, surcharge le slave
    - La table temporaire doit être recopiée sur le master et la ça peut être un peu lourd, il faut voir la taille.

Suivre le flux des commentaires

Note : les commentaires appartiennent à celles et ceux qui les ont postés. Nous n’en sommes pas responsables.