[Date Prev][Date Next] [Thread Prev][Thread Next] [Date Index] [Thread Index]

Re: [+/-HS] Optimiser un serveur Mysql



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 :

[root@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 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



Reply to: