[AlternC-dev] Optimisation de MySQL [ WAS gros ralentissement ]

Retour à l'archive de la liste
Le site d'AlternC
Google Custom Search

Jerome Moinet jerome at moinet.org
Jeu 11 Nov 11:17:59 CET 2004


-----BEGIN PGP SIGNED MESSAGE-----
Hash: SHA1

| Essaye de régler le nombre de connexion mysql dans php
| (/etc/php4/apache/php.ini)
| et les paramètres de mysql (/etc/mysql/my.cnf) pour que les connexions
| inutilisées soient dropées automatiquement.
|
| On a eu ce problème il y a longtemps sur Lautre Net, que l'on a résolu
| ainsi.
|
hello,

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 le serveur mysql de l'autre net, où la taille
du key_buffer est égale à 768Mo sur un total de 2Go.

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 :

[root at fey 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 le serveur de l'autre net, 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 :
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


* passer en mysql 4.0.22. Pour cela :

mettre ceci dans /etc/apt/sources.list :

deb http://www.backports.org/debian stable mysql-dfsg
deb-src http://www.backports.org/debian stable mysql-dfsg

puis :

apt-get update

puis :

apt-get upgrade (ou dist-upgrade)

A noter que la dernière version "production" de mysql est la 4.1.7, mais
pas encore sur backports.org.


Voilà, ça devrait au moins permettre à mysql d'être plus à l'aise.

Tu nous tient au courant si ça a servi à qqchose ?

a+

jerome

-----BEGIN PGP SIGNATURE-----
Version: GnuPG v1.2.5 (GNU/Linux)
Comment: Using GnuPG with MultiZilla - http://enigmail.mozdev.org

iD8DBQFBkzxW3ygQTLujCrQRAi/gAJ44tdAZtHMupXTXljl2MrIHDg380QCeN6nV
0gqURj/nU/zMBOWbF4L6YLw=
=0bk2
-----END PGP SIGNATURE-----



Plus d'informations sur la liste de diffusion Dev