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

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

Stéphane HENRY stef at heberge.net
Mar 16 Nov 19:31:49 CET 2004


personnellement, j'ai vu de grosses différences suivant les noyaux
utilisés sur Linux, avec les mêmes packages installés sur Debian Sarge :
- un noyaux 2.6 est plus efficace pour un serveur de base Mysql, le
serveur est moins loadé (load average) qu'avec un noyau 2.4
- un noyaux 2.4 est BEAUCOUP plus efficace pour Apache 1.3, le serveur est
BEAUCOUP moins loadé (load average) qu'avec un noyau 2.6

Avez vous remarqué celà dans votre configuration?

Stéphane

> Salut,
>
> Donc, j'ai fait tout, comme si bien expliqué dans ton mail, les
> changements ...
>
> En termes de vitesse d'accès c'était relativement conséquent.
>
> Seul hic, Postfix perdait toute connection avec mysql dans les quelques
> secondes.
>
> Ci-dessous quelques infos sur ce qui a posé problème et les infos sur la
> config actuelle:
>
> A+
> Denis
> PS: J'ai lu la doc mysql mais je la trouve relativement peu parlante au
> sujet de l'optimisation, si vous avez des liens plus explicatifs, je
> suis preneur.
>
> # Key_buffer
>
> J'avais un rapport Key_reads/Key_read_requests de 0,5
>
> En fait, c'est ici que réside le plus gros problème...
>
> On a 512MB de ram et dès qu'on passe la taille de key_buffer à plus de
> 64MB, postfix n'a plus de connections avec mysql.
>
> # Autres variables
>
> set-variable    = table_cache=128 -> OK
>
> set-variable    = record_buffer=2M
> -> Si je mets à 1M, çà fait planter postfix->Mysql
>
> set-variable    = max_connections=150
> -> Comme la valeure par défaut était à 100, je l'ai juste passer à 150
>
> long_query_time = 30
> -> Comme la valeur par défaut est à 10, je n'ai pas touché.
>
> set-variable    = query_cache_size=10485760
> -> Variable non reconnue ?
>
> set-variable    = wait_timeout=20
> set-variable    = interactive_timeout=60
>
> -> Font planter postfix->Mysql
>
> skik-bdb et skik-innodb -> idem
>
>
> # Passage à Mysql 4.0.22
>
> OK, seul petit désagrémént l'ensemble des bases sont visibles dans
> phpmyadmin....
>
>
> ///-> Config Actuelle
>
> ///-> /etc/php4/apache/php.ini
>
> [MySQL]
> mysql.allow_persistent = On
> mysql.max_persistent = -1
> mysql.max_links = 5
> mysql.default_port mysql.default_socket mysql.default_host
> mysql.default_user
> ///-> /etc/mysql/my.cnf
>
> [client]
> port            = 3306
> socket          = /var/run/mysqld/mysqld.sock
>
> [safe_mysqld]
> err-log         = /var/log/mysql.err
>
> [mysqld]
> user            = mysql
> pid-file        = /var/run/mysqld/mysqld.pid
> socket          = /var/run/mysqld/mysqld.sock
> port            = 3306
> #log            = /home/log/mysql.log
> basedir         = /usr
> datadir         = /var/alternc/db
> tmpdir          = /tmp
> language        = /usr/share/mysql/french
>
> skip-locking
> safe-show-database
> #  skip-networking
> #skip-innodb
> #skip-bdb
>
> set-variable    = key_buffer=64M
> set-variable    = max_allowed_packet=4M
> set-variable    = thread_stack=512K
> set-variable    = table_cache=128
> #set-variable    = query_cache_size=10485760
> set-variable    = record_buffer=2M
> set-variable    = max_connections=150
> #set-variable    = wait_timeout=20
> #set-variable    = interactive_timeout=60
>
> [mysqldump]
> quick
> set-variable    = max_allowed_packet=1M
>
> [mysql]
> #no-auto-rehash # faster start of mysql but no tab completition
>
>
> mysql> show status like 'Key%';
> +--------------------+----------+
> | Variable_name      | Value    |
> +--------------------+----------+
> | Key_blocks_used    | 62345    |
> | Key_read_requests  | 11253580 |
> | Key_reads          | 265664   |
> | Key_write_requests | 382365   |
> | Key_writes         | 68662    |
> +--------------------+----------+
>
> --> Rapport Key_reads/Key_read_requests -> 0,0236
>
> mysql> status;
> --------------
>
> Threads: 66  Questions: 1278522  Slow queries: 2  Opens: 42837  Flush
> tables: 1  Open tables: 128  Queries per second avg: 7.943
> --------------
>
>
>
> Le jeu 11/11/2004 à 11:17, Jerome Moinet a écrit :
>> -----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-----
>> _______________________________________________
>> Dev mailing list
>> Dev at alternc.org
>> http://alternc.org/cgi-bin/mailman/listinfo/dev
>
> _______________________________________________
> Dev mailing list
> Dev at alternc.org
> http://alternc.org/cgi-bin/mailman/listinfo/dev
>
>





Plus d'informations sur la liste de diffusion Dev