zebx
Membre-
Compteur de contenus
5 -
Inscrit(e) le
-
Dernière visite
Réputation sur la communauté
0 NeutrePour me contacter
-
Mon Site
http://www.webstrat.fr
Information du profil
-
Société
WebStrat
-
Je te suggère de reprendre mes conseils. 1- apache : ajout de metadata de cache et optimisation des hits. Tu peux utiliser Firefox + Firebug + YSlow si le site que je t'ai indiqué te parait trop complexe. Limite ton objectif à un site de qualité C, inutil de te dégouter. 2- ton appli : cache tes pages HTML générée, Smarty le fait pas trop mal mais tu peux le coder à la main. Cache tes données de références et isole les dans des tables dédiées. Etudie toutes tes requêtes avec jointures et sans clause where, reprends mes notes : ajoutes index et clause limit. 3- ta base : une config par défaut est suffisante pour développer, pas pour la production. Et la config qu'il faut pour cette application ne peut en aucun cas être celle d'un autre. J'espère que tu vas t'en sortir. Ces sujets sont loin d'être évidents pour des pros, alors pour un novice...
-
"Normalement", une requête SQL dont les résultats sont utilisés de manière synchrone - cas d'un écran web - ne doit pas excéder 10-20ms. le seuil mesuré par long_query_time = 1 est donc 100 fois trop haut mais la version actuelle de Mysql ne permet pas de faire mieux. Si tu peine à éditer le fichier de config, créer tes index manquants. Tant que tu créer, tu ne peux pas détériorer les temps d'affichage.
-
Rien de catastophique, mais il faudras faire plus que modifier le fichier de conf. Tu ne caches rien parce que le résultat de tes requêtes est trop gros. Dans le cadre de traitement batch, cela peut arriver. Dans le cadre d'une appli web, ce n'est pas normal - comprendre erreur de conception, par exemple l'initialisation systématique de combo-box... - ; d'où la recommandation d'utiliser LIMIT. De plus, il a identifié des jointures qui n'utilisent pas les index; catastrophiques en termes de perfs => produit cartésien : une tables de 100.000 lignes associées à une tables de 1000 lignes, va te générer un parcours de 100.000.000 lignes, exécuter les clauses Where lignes à lignes, stocker le résultat dans une table de travail et te renvoyer le résultat... Bref, MySql passe son temps à créer des tables temporaires de travail sur disque, puis les efface puisque le résultat est trop gros pour être caché. La prochaine requête arrive et rebelotte... Je te suggère une intervention rapide paliative sur les paramètres indiqués, suivi plus tard d'une intervention curative et d'un réajustement de ces paramètres. Etape 1 : modifier les variables indiquées /etc/mysql/my.cnf Utilise le double des valeurs indiquées, sauf table_cache : 4096 Ajoutes les lignes skip-bdb log-slow-queries = /var/log/mysql/mysql-slow.log long_query_time = 1 Vérifies que le parametre log est en commentaire ou inexistant : #log = /var/log/mysql/mysql.log et que les log binaires sont actifs : log-bin = /var/log/mysql/mysql-bin.log et relances Mysql Laisser chauffer l'ensemble quelques heures... Etape 2 : Mettre le bout des doigts dans le cambouis : ajuster tes requêtes SQL 1. Le plus simple est de créer les index qui manquent pour les jointures entre tables. Commences par les requêtes lentes identifiées par Mysql dans le log /var/log/mysql/mysql-slow.log Puis listes les autres requêtes SQL dans ton code qui utilisent plusieurs tables et les tables "moyennes" > 10.000 lignes Connectes toi à Mysql via la console, 'mysql' ou installes l'outil web phpmyadmin plus convivial Dans la suite, je parle de commande en mode console. Pour chaque requete, execute un EXPLAIN "requeteSQL" ; Notes les requetes et les tables associées dont la colonne "possible_keys" est à null avec la colonne "rows" > 500 Pour celles-ci, fait un explain sur les tables : Explain "tables"; La structure de la table s'affiche. Identifier les colonnes utilisées pour les jointures et créer les index manquants. alter table add index (col_sans_index); Pour l'aide en ligne : help alter table 2. Identifier les requetes qui font des select sans clause limit sur des tables de plus de 100 lignes. Controler que tu as besoin de l'ensemble de ces données. Si tu n'a besoin que des 10 1er résultats, ajouter "limit 10" à la requete. Si tu as besoin de tout, tu as "probablement" un pb général de modèle de données. Et donc une grosse maintenance de structure, du code et de tes écrans seront à envisager. Tu laisses chauffer le résultat quelques jours, tu relances mysqltuner et tu réajustes les paramètres my.cnf NB: Au travers de ces conseils, on reste sur une approche inversée de l'optimisation. Tu travailles sur la partie la plus complexe et globalement la moins efficace. Je m'explique : - le pb est il pourquoi tes requetes sont lentes ? - le pb est il pourquoi ton application les exécute aussi souvent ? - le pb ne serait-il pas comment éviter que les internautes sollicitent aussi souvent ton application ? Même si toutes ces étapes sont importantes, tu régleras 80% de ton pb sur le dernier point. Je parle de ton application, pas de Mysqltuner. Laisses tes visiteurs faire le travail durant 2 jours. Relance le script, les conseils peuvent varier. En dehors de MySQL, tu peux activer le profiling PHP avec le mod xdebug et optimiser les bouts de code les plus consommateurs.
-
Aucunement Ca fait toujours plaisir d'aider. Je rédige un autre article sur un niveau d'optimisation intermédiaire. En attendant de trouver un peu de temps libre, si tu notes une nette variation concernant le monitoring de ton serveur après optimisation via mysqltuner, mais que l'amélioration reste insuffisante, tu peux utiliser les informations remontées par l'outil MySQL mysqlreport. Cependant, il te faudra assimiler une partie de la documentation en ligne de mysql.com pour faire les bons choix. Enfin, et cela ne va pas dans le même sens que la remarque d'OVH, les campagnes d'optimisation doivent commencer par les front (Apache) et non par le backend (prog + base). En général, elle répondent à la loi de Pareto : tu résous 80% de tes problèmes juste en ajustant la conf Apache, le tout pour 20% d'effort Sans plus d'info sur ton serveur, on voit clairement que tu sous-exploites la RAM. Je pense que tu ne caches rien ; ni côté MySQL, ni côté Apache. Des infos sur l'activité des IO disk confirmeraient cela. Vu que ton audience est somme toute raisonnable, je pense que tu peux faire des miracles en ajustant le keepalive, le maxclient, le niveau de log et en utilisant les mods header et expire, voir deflate, côté Apache. Pour l'optimisation côté front, j'utilise chez AOL l'outil http://performance.webpagetest.org:8080/ . Cet outil fabuleux peut t'aider à identifier et résoudre certains pb. Courage
-
Les retours sont toujours enrichissant. J'ai modifié l'article en espérant qu'il soit plus abordable. Il me semble accessible à des Linuxiens débutants. Concernant l'outil mysqltuner, c'est le plus simple que j'ai trouvé. Tu n'as vraiment pas besoin d'avoir une quelconque connaissance des bases de données pour l'utiliser. Il n'opère aucune modification sur ta base mais va te proposer une liste d'optimisation, propre à l'usage que tu fais de ta base. Aucune information ne part sur le réseau (user/password...) Bref, tu ne risques rien Les précautions que tu peux prendre sont de sauvegarder le fichier de configuration my.cnf avant sa modification. Si pb, tu pourras toujours le restaurer. Si tu ne connais pas vi, utilise un editeur graphique. A partir d'une installation de base MySQL, j'estime l'efficacité des optimisations à 80%. C'est très honorable.