Francois Sauterey a écrit : > J'ai un petit soucis avec un serveur Mysql, et peut-être y aura-t-il ici un > spécialiste ? > J'ai une machine sous Debian-Sarge qui fait serveur Apache2 hébergeant +/- > 500 > sites différents dont la moitié à peu près en php/mysql. > Une autre (sur un réseau interne en 100M) est le serveur Mysql. > Cette dernière, toujours debian-Sarge, 512Mo de mem, refuse régulièrement les > connexions. > (un mysqladmin ping en boucle [pas de 5 secondes] donne en gros un refus par > minute] > Je cherche à optimiser les (nombreux) paramètres de MysqlServer. > > Ci-joint, mon my.cnf... > > @micalement, > Bonjour,
Lit la doc MySQL concernant l'optimisation : http://dev.mysql.com/doc/mysql/en/MySQL_Optimization.html et principalement la section 7.5 concernant l'optimisation du serveur : http://dev.mysql.com/doc/mysql/en/Optimizing_the_Server.html Il y a un ou deux autres paramètres sur lesquels tu _doit_ jouer : * key_buffer : il doit être entre 25 et 50 % du total de ta mémoire physique. Le key_buffer correspond à ce que mysql va charger en mémoire comme clés. Autrement dit, à chaque fois qu'il exécute un select avec clé, si la clé est en mémoire, il ne fera pas d'accès disque, et donc ça sera plus rapide et la machine chargeras moins. La règle est : Key_reads / Key_read_request < 0.01 Donc tu ajuste ton key_buffer jusqu'à ce que cette règle soit ok. Pour cela : mysql> show status like 'Key%'; +--------------------+-----------+ | Variable_name | Value | +--------------------+-----------+ | Key_blocks_used | 610645 | | Key_read_requests | 117513865 | | Key_reads | 479580 | | Key_write_requests | 4322422 | | Key_writes | 776691 | +--------------------+-----------+ 5 rows in set (0.00 sec) et tu fait la division : 479580 / 117513865 = 0.0040810503509522 Ca c'est les chiffres pour un serveur mysql où la taille du key_buffer est égale à 768Mo sur un total de 2Go. (Au passage, 2Go est un minimum, 512 c'est vraimment pas beaucoup). Si ton résultat est > 0.01, tu augmente la valeur dans /etc/mysql/my.cnf, tu relance mysql, tu attend quelques minutes que des valeurs significatives soient enregistrées, et tu refait le calcul. * Tu supprime les logs mysql, ça bouffe un max d'i/o. Pour cela, supprimer (ou commenter) les variables log* dans my.cnf. * tu augmente le table_cache. Pour cela : mysql> status; -------------- ... < bla bla bla > ... Uptime: 2 days 9 hours 34 min 45 sec Threads: 5 Questions: 14035029 Slow queries: 2 Opens: 165920 Flush tables: 1 Open tables: 4096 Queries per second avg: 67.709 -------------- Il s'agit du rapport entre "Open tables" et "Opens". Il ne faut pas pas que "Opens" augmente trop rapidement après que la valeur de "Open tables" ai été atteinte. Donc à surveiller lors du démarrage du serveur. Ce paramètre est à corréller avec le nombre max de fichier ouvrables sur le système. Pour connaitre cette valeur : [EMAIL PROTECTED] fs]# cat /proc/sys/fs/file-max 32768 pour l'augmenter, le package procps doit être installé, ajouter cette ligne dans /etc/sysctl.conf : fs/file-max = 32768 puis : /etc/init.d/procps.sh reload Sur un serveur dont je m'occupe, 4096 pour mysql semble être un peu petit, mais la machine n'est pas chargée pour autant, donc on laisse cette valeur, car une valeur trop élevée pourrait ralentir le système. Avec un "Queries per second avg: 67.709" on a un load de "load average: 0.54, 0.58, 0.46", ce qui est acceptable. La commande suivante te donne le nombre de fichier ouverts par mysql sur le système : lsof | grep mysqld | awk {'print $9'} | sort -u | wc -l les deux paramêtre suivants peuvent également être positionnés : set-variable = query_cache_size=10485760 set-variable = record_buffer=1M * si tu as beaucoup de slow-query ("Slow queries:" dans le status), baisse la valeur après laquelle ces requêtes seront fusillées : long_query_time = 30 => supprime toute requête qui est en cours d'éxécution depuis plus de 30 secondes * ne pas prendre en compte ce qui est inutilisé, donc ajout de ceci dans le my.cnf (à moins que tu ne les utilisent bien sur) : skip-innodb skip-bdb * limiter le nombre de connection, et les killer au bout de n secondes d'inactivités : set-variable = max_connections=300 set-variable = wait_timeout=20 set-variable = interactive_timeout=60 * concernant spip, il faut vérifier que les versions utilisées ne font pas de INSERT DELAYED (http://dev.mysql.com/doc/refman/5.0/en/insert-delayed.html). Si oui, prévient tes utilisateurs et passe un cat/grep/sed sur tous les fichiers pour remplacer le INSERT DELAYED par un INSERT. Ce problème est présent dans des versions de spip d'il y a un ou deux ans. Hope this help... jerome -- Pensez à lire la FAQ de la liste avant de poser une question : http://wiki.debian.net/?DebianFrench Pensez à rajouter le mot ``spam'' dans vos champs "From" et "Reply-To:" To UNSUBSCRIBE, email to [EMAIL PROTECTED] with a subject of "unsubscribe". Trouble? Contact [EMAIL PROTECTED]

