Archives pour l'étiquette DC2

MySQL Innodb nouvelle notes de configuration et d’optimisation

Pour compléter une note précédente sur Innodb et UTF8 et le billet sur les premières notes de configuration et d’optimisation de MySQL Innodb voici quelques notes de configuration de MySQL supplémentaire et complémentaire avec le moteur de base de donnée Innodb. Note toujours valable _ pour toute solution d’hébergement ou architecture MySQL est dédier eZ Publish, Dotclear 2 et autre CMS.

INNODB_BUFFER_POOL_SIZE

  • Espace mémoire de mise en cache des bases de données.
  • Ne pas hésiter à allouer 80 ~ 90% de la mémoire disponible sur le serveur si celui ci est dédier DB
  • Dans la mesure du possible doit être légèrement supérieur en taille à /var/lib/mysql

INNODB_FLUSH_METHOD

  • Instruction de gestion des accès disque
  • CODE_FS par défaut, laisse à l’OS toute possibilité de gérer les accès selon ces principes. L’OS peux donc utilisé son propre cache qui viendrais ce superposer à celui de innodb
  • O_DIRECT informe l’OS d’écrire sans délai sans tenir compte de son cache.
  • A rapprocher de l’instruction gérant le scheduler de l’OS cf: /sys/block/sda/queue/scheduler

QUERY-CACHE

  • Concerne les instructions query_cache_limit, query_cache_size, query_cache_type
  • A utilise seulement en cas de requêtes uniforme et répétitive, inutile si celle ci sont déporter sur un memcache
  • Effacer dans ce cache et y réécrire impose un MUTEX et donc un lock de tout les thread.
  • A utilisé seulement si le gain d’utilisation VS lock mutex est positif, rarement le cas sur une architecture qui utilise du memcache

SINGLE-TRANSACTION

  • mysqldump single-transaction all-databases > dump.sql
  • Instruction –single-transaction determine que le dump est a réaliser dans le contexte de l’instant T (snapshot style)
  • Ne génère pas de lock, lecture, écriture toujours possible
  • Génère une charge en lecture. Charge quasi nul sur tout le contenue de base dumper est en mémoire
  • Génère une charge en écriture. Penser à écrire sur une FileSystem non sollicité.

MySQL Innodb notes de configuration et d’optimisation

Pour compléter une note précédente sur Innodb et UTF8 voici quelques notes de configuration de MySQL avec le moteur de base de donnée Innodb sous forme de checklist pour toute solution d’hébergement ou architecture MySQL est dédier eZ Publish, Dotclear 2 et autre CMS.

Utilisez le moteur Innodb

Forcer le moteur par defaut de stokage en InnoDB pour la création de toute nouvelle table sans spécification du moteur souhaité.

<span style="color: #808080; font-style: italic;">#</span> <span style="color: #808080; font-style: italic;"># Moteur par defaut de stokage, ici InnoDB parce que  Ez publish</span> <span style="color: #808080; font-style: italic;">#</span> default-storage-engine  = InnoDB

UTF8

Prévoir dès le départ l’encodage des base en UFT8

<span style="color: #808080; font-style: italic;">#</span> <span style="color: #808080; font-style: italic;"># Encodage UTF8</span> <span style="color: #808080; font-style: italic;">#</span> default-character-<span style="color: #007800;">set=</span>utf8 default-<span style="color: #007800;">collation=</span>utf8 <span style="color: #007800;">collation_server=</span>utf8_general_ci <span style="color: #007800;">character_set_server=</span>utf8 skip-character-set-client-handshake

Configurer l’écoute sur toute les interfaces réseaux

Ouvrir à un utilisation via le réseau sans limitation d’interface ou d’adresse.

<span style="color: #808080; font-style: italic;">#</span> <span style="color: #808080; font-style: italic;"># Instead of skip-networking you can listen only on</span> <span style="color: #808080; font-style: italic;"># localhost which is more compatible and is not less secure.</span> bind-address            = <span style="color: #808080; font-style: italic;">#skip-networking</span>

Optimisation tablespace

Prévoir le lancement du moteur innodb avec comme configuration un fichier tablespace par table. Cela va créé un fichier tablespace pour chaque table innodb et vous évitera d’avoir dans quelque mois un unique fichier tablespace de plusieurs giga octet impossible à manipuler.

<span style="color: #808080; font-style: italic;">#skip-innodb</span> innodb_file_per_table

Optimisation Log

Bloquer les log binaire qui consomme beaucoup d’espace disque et n’apporte pas de sécurité sur une plate-forme qui n’a pas de réplication Master / Slave MySQL.

<span style="color: #808080; font-style: italic;">#log_bin                        = /var/log/mysql/mysql-bin.log</span>

Optimisation innodb_buffer_pool_size

innodb_buffer_pool_size définie la taille de buffer mémoire que InnoDB utilise pour mettre en cache les données et les index de tables. Plus cette valeur est grand, et moins vous ferez d’accès disques. Sur un serveur dédiés, vous pouvez monter cette valeur jusqu’à 80% de la mémoire physique de la machine. Ne lui donnez pas une valeur trop grande, car cela peut engendrer l’utilisation de mémoire sur le disque par votre serveur (swap).

Configurer le niveau de compression du Mode_deflate de Apache2 et utiliser les logs pour en connaitre l’efficacité

Pour compléter mon billet sur l’utilisation du mod_deflate pour un hébergement apache 2 de Dotclear2 et celui sur Optimisation d’un hébergement eZ Publish 4 pour l’utilisation des caches web ou je parle du mod_gzip de apache 1.3 je vous invite à consulter le billet use mod_deflate to compress web content delivered by apache sur g-loaded.eu. Cette recommandation est valable quelque soit le CMS ou application web du moment que votre solution de web hosting repose sur apache 2. Vous en apprendrez plus sur les points suivants :

Configurer le niveau de compression de mod_deflate

L’algorithme deflate est assez rapide et il est possible de modifier le niveau de compression. Le mettre au maximum ne pose pas de problème si vous vous contentez de compresser du texte (css, Js, xml etc) [1]

DeflateCompressionLevel <span style="color: #ff0000;">9</span>

Surveiller la compression via les logs

Vous pouvez avoir une trace log de la compression effectué par le mod_deflate de votre serveur apache 2.[2]

Le directive suivant définissent quelque variable :

  • instream : La taille en Bytes (Octet) en entré de DEFLATE.
  • outstream : La taille en Bytes (Octet) en sortie de DEFLATE.
  • ratio : Le ratio de compression, (Sortie/Entré)x100
DeflateFilterNote Input instream DeflateFilterNote Output outstream DeflateFilterNote Ratio ratio

Les variables définie vous pouvez ajouter une Format de log à votre vhost:

<span style="color: #00007f;">LogFormat</span> <span style="color: #7f007f;">'&quot;%r&quot; %{outstream}n/%{instream}n (%{ratio}n%%)'</span> deflatelog

N’oubliez par d’utiliser de format de log en l’écrivant dans un fichier de log.

<span style="color: #00007f;">CustomLog</span> /path/to/vhost/logs/deflate_log deflatelog

Vous obtenez un log pour deflate qui ce présente comme cela. Pratique pour étudier l’utilité de la compression de donner en fonction du type de fichier dans votre architecture d’hébergement ou des efforts de Minification, toujours important en web hosting.

<span style="color: #7f007f;">&quot;GET /dotclear/themes/default/js/jquery.cookie.js HTTP/1.1&quot;</span> <span style="color: #ff0000;">451</span>/<span style="color: #ff0000;">994</span> <span style="color: #66cc66;">&#40;</span><span style="color: #ff0000;">45</span>%<span style="color: #66cc66;">&#41;</span>

Notes

[1] Attention comprimer au maximum des fichiers trop gros ou déjà compressé comme les images est contre productif !!

[2] Attention écrire des logs sur le disque ralenti apache !!

Karlesnine.com : Optimisation de l’hébergement d’un site Dotclear 2 pour l’utilisation des caches web

Si la gestion de cache web est pour vous une notion vague je vous invite à lire cette excellente documentation de Mark Nottingham en français.

J’ai appliqué les techniques d’optimisation un site web pour les caches web dont je parlais dans un billet précédent à mon propre blog propulsé par Dotclear 2.

Dans mon cas l’hébergement est réalisé sur un serveur Debian Lenny avec les briques suivante

  • Apache 2.2.9
  • Php5 5.2.11
  • Mysql 5.0.75

Dotclear 2 déjà optimisé

DC2 comporte déjà des optimisations pour la mise en cache des pages générées par l’application. Si vous étudier les header HTTP d’un dotclear fraichement installé avec un outil comme firebug pour firefox ou les outils développeur web de Safari ou Chrome vous pourrez en faire la constatation.

En effet DC2 utilise le framework clearbricks qui comporte quelque fonction, entre autre dans la lib php suivante

<span style="color: #000000; font-weight: bold;">/</span>dotclear<span style="color: #000000; font-weight: bold;">/</span>inc<span style="color: #000000; font-weight: bold;">/</span>clearbricks<span style="color: #000000; font-weight: bold;">/</span>common<span style="color: #000000; font-weight: bold;">/</span>lib.http.php

Les lignes, 207 a 210 de ce fichier génère les headers HTTP d’instruction de mise en cache. Personnellement souhaitant maitrisé les hearder depuis mon vhost apache j’ai mis en commentaire la ligne 209.

<span style="color: #000000;">207</span> <span style="color: #808080; font-style: italic;"># Common headers list</span> <span style="color: #000000;">208</span> <span style="color: #007800;">$headers</span><span style="color: #7a0874; font-weight: bold;">&#91;</span><span style="color: #7a0874; font-weight: bold;">&#93;</span> = <span style="color: #ff0000;">'Last-Modified: '</span>.gmdate<span style="color: #7a0874; font-weight: bold;">&#40;</span><span style="color: #ff0000;">'D, d M Y H:i:s'</span>,<span style="color: #007800;">$ts</span><span style="color: #7a0874; font-weight: bold;">&#41;</span>.<span style="color: #ff0000;">' GMT'</span>; <span style="color: #000000;">209</span> <span style="color: #808080; font-style: italic;"># $headers[] = 'Cache-Control: must-revalidate, max-age='.abs((integer) self::$cache_max_age);</span> <span style="color: #000000;">210</span> <span style="color: #007800;">$headers</span><span style="color: #7a0874; font-weight: bold;">&#91;</span><span style="color: #7a0874; font-weight: bold;">&#93;</span> = <span style="color: #ff0000;">'Pragma:'</span>;

Vhost apache, interdir les .htacess

Comme je l’expliquais dans un commentaire htaccess est un tueur de performance pour le site à forte audience. Ceci n’est pas le cas de mon blog, dommage, mais je garde la bonne pratique de bloquer l’utilisation des htaccess dans mon vhost avec la directive AllowOverride None.

&lt;Directory /home/karles/public_html/&gt;            <span style="color: #00007f;">Options</span> <span style="color: #0000ff;">FollowSymLinks</span>             <span style="color: #00007f;">AllowOverride</span> <span style="color: #0000ff;">None</span>         &lt;/Directory&gt;

mod_deflate, régime pour les fichiers texte

Le mod_deflate est le module apache apportant les fonctions de compression des fichiers avant leur distribution. L’installer est des plus facile

a2enmod deflate <span style="color: #000000; font-weight: bold;">/</span>etc<span style="color: #000000; font-weight: bold;">/</span>init.d<span style="color: #000000; font-weight: bold;">/</span>apache stop <span style="color: #000000; font-weight: bold;">/</span>etc<span style="color: #000000; font-weight: bold;">/</span>init.d<span style="color: #000000; font-weight: bold;">/</span>apache start

Sous apache2 l’antique Mod_gzip à fait la place au mod_deflate bien moins compliqué dans sa configuration. J’ai fais le choix de compresser les fichier qui sont sous forme de texte. C’est à dire les fichiers xml, css et javascript.

&lt;IfModule mod_deflate.c&gt;             &lt;Location /&gt;                 AddOutputFilterByType DEFLATE text/xml                 AddOutputFilterByType DEFLATE text/css                 AddOutputFilterByType DEFLATE text/javascript                 AddOutputFilterByType DEFLATE text/html                 AddOutputFilterByType DEFLATE text/plain                 AddOutputFilterByType DEFLATE application/xml                 AddOutputFilterByType DEFLATE application/xhtml+xml                 AddOutputFilterByType DEFLATE application/rss+xml                 AddOutputFilterByType DEFLATE application/javascript                 AddOutputFilterByType DEFLATE application/x-javascript &nbsp;                 SetOutputFilter DEFLATE &nbsp;                 <span style="color: #adadad; font-style: italic;"># Make sure proxies don't deliver the wrong content</span>                 <span style="color: #00007f;">Header</span> append Vary User-Agent env=!dont-vary             &lt;/Location&gt;         &lt;/<span style="color: #00007f;">IfModule</span>

Attention, l’utilisation du mod_deflate avec la ligne d’instruction Header append Vary User-Agent env=!dont-vary impose d’avoir le module mod_headers et le module mod_setenvif d’activé.

mod_expires, mise en cache

le mod_expires est tout aussi facile à installé que le mod_deflate. J’ai fait le choix de tout mettre en cache au minimum 30 secondes, Le contenue html restera valide deux minutes avant qu’une nouvelle interrogation de mon serveur soit nécessaire. La mise en page avec les fichiers javascript et css j’autorise une semaine de mise en cache. Quand aux images, plus lourde et moins volatile c’est carrément un mois de validité que je souhaite.

&lt;IfModule mod_expires.c&gt;                 <span style="color: #00007f;">ExpiresActive</span> <span style="color: #0000ff;">on</span>                 <span style="color: #00007f;">ExpiresDefault</span> <span style="color: #7f007f;">&quot;access plus 30 seconds&quot;</span>                 <span style="color: #00007f;">ExpiresByType</span> text/html <span style="color: #7f007f;">&quot;access plus 120 seconds&quot;</span>                 <span style="color: #00007f;">ExpiresByType</span> text/css <span style="color: #7f007f;">&quot;access 1 weeks&quot;</span>                 <span style="color: #00007f;">ExpiresByType</span> text/javascript <span style="color: #7f007f;">&quot;access 1 weeks&quot;</span>                 <span style="color: #00007f;">ExpiresByType</span> application/x-javascript <span style="color: #7f007f;">&quot;access 1 weeks&quot;</span>                 <span style="color: #00007f;">ExpiresByType</span> application/javascript <span style="color: #7f007f;">&quot;access 1 weeks&quot;</span>                 <span style="color: #00007f;">ExpiresByType</span> image/gif <span style="color: #7f007f;">&quot;access 1 months&quot;</span>                 <span style="color: #00007f;">ExpiresByType</span> image/jpeg <span style="color: #7f007f;">&quot;access 1 months&quot;</span>                 <span style="color: #00007f;">ExpiresByType</span> image/png <span style="color: #7f007f;">&quot;access 1 months&quot;</span>         &lt;/IfModule&gt;

Conclusion

Si vous ajouter à ces technique celle d’optimisation des images pour l’accélération d’un site web vous allez sensiblement accélérer l’affichage de votre blog et par la même son référencement.

Vous pouvez également consulté la documentation du chaosklub en trois partie (1 2 3 ) qui s’attaque au même chantier mais de façon moins performante à mes yeux car utilisant les .htaccess et des scripts php de configuration des headers. Cette approche est nécessaire dans le cas ou vous le maitrisé par votre hébergement.

J’ai supprimer le index.php de l’url sur ce blog Dotclear 2 avec les rewrites rules d’apache

Simplement en suivant les conseils de Jean-Christophe Duvivier

J’ai configuré mon blog DC2 comme ceci

  • Panneau d’administration > Paramètres du Blog :
  • URL du Blog : L’url complète de votre blog (en ce qui me concerne : http://www.karlesnine.com/)
  • Méthode de lecture de l’url : Sélectionnez PATH_INFO
  • Enregistrez

J’ai évité d’utiliser le .htaccess et j’ai directement porté mes RewriteRule dans la vhost de mon apache 2 comme ceci :

&lt;VirtualHost *:<span style="color: #ff0000;">80</span>&gt; 	 <span style="color: #00007f;">ServerName</span> www.karlesnine.com 	 <span style="color: #00007f;">ServerAlias</span> karlesnine.com 	 <span style="color: #00007f;">DocumentRoot</span> /var/www/karlesnine.com 	 <span style="color: #00007f;">ErrorLog</span> /var/log/apache/error.log 	 <span style="color: #00007f;">CustomLog</span> /var/log/apache/access.log combined &nbsp; 	<span style="color: #adadad; font-style: italic;"># DirectoryIndex index.php</span> &nbsp; 	<span style="color: #00007f;">RewriteEngine</span> <span style="color: #0000ff;">On</span> 	<span style="color: #00007f;">RewriteLog</span> <span style="color: #7f007f;">&quot;/var/log/apache/rewrite.log&quot;</span>         <span style="color: #00007f;">RewriteLogLevel</span> <span style="color: #ff0000;">0</span> &nbsp; 	<span style="color: #adadad; font-style: italic;"># Special spam commentaire .ru .china .jp</span>         <span style="color: #00007f;">RewriteCond</span> %<span style="color: #66cc66;">&#123;</span>REMOTE_ADDR<span style="color: #66cc66;">&#125;</span> ^<span style="color: #ff0000;">81</span>\.<span style="color: #ff0000;">177</span>\.<span style="color: #ff0000;">14</span>\.<span style="color: #66cc66;">&#91;</span><span style="color: #ff0000;">0</span><span style="color: #ff0000;">-255</span><span style="color: #66cc66;">&#93;</span>        <span style="color: #66cc66;">&#91;</span>OR<span style="color: #66cc66;">&#93;</span>         <span style="color: #00007f;">RewriteCond</span> %<span style="color: #66cc66;">&#123;</span>REMOTE_ADDR<span style="color: #66cc66;">&#125;</span> ^<span style="color: #ff0000;">81</span>\.<span style="color: #ff0000;">177</span>\.<span style="color: #ff0000;">15</span>\.<span style="color: #66cc66;">&#91;</span><span style="color: #ff0000;">0</span><span style="color: #ff0000;">-255</span><span style="color: #66cc66;">&#93;</span>        <span style="color: #66cc66;">&#91;</span>OR<span style="color: #66cc66;">&#93;</span>         <span style="color: #00007f;">RewriteCond</span> %<span style="color: #66cc66;">&#123;</span>REMOTE_ADDR<span style="color: #66cc66;">&#125;</span> ^<span style="color: #ff0000;">121</span>\.<span style="color: #ff0000;">14</span>\.<span style="color: #ff0000;">75</span>\.<span style="color: #66cc66;">&#91;</span><span style="color: #ff0000;">0</span><span style="color: #ff0000;">-255</span><span style="color: #66cc66;">&#93;</span>	<span style="color: #66cc66;">&#91;</span>OR<span style="color: #66cc66;">&#93;</span>         <span style="color: #00007f;">RewriteCond</span> %<span style="color: #66cc66;">&#123;</span>REMOTE_ADDR<span style="color: #66cc66;">&#125;</span> ^<span style="color: #ff0000;">210</span>\.<span style="color: #ff0000;">159</span>\.<span style="color: #ff0000;">140</span>\.<span style="color: #66cc66;">&#91;</span><span style="color: #ff0000;">0</span><span style="color: #ff0000;">-255</span><span style="color: #66cc66;">&#93;</span>	<span style="color: #66cc66;">&#91;</span>OR<span style="color: #66cc66;">&#93;</span>         <span style="color: #00007f;">RewriteCond</span> %<span style="color: #66cc66;">&#123;</span>REMOTE_ADDR<span style="color: #66cc66;">&#125;</span> ^<span style="color: #ff0000;">210</span>\.<span style="color: #ff0000;">136</span>\.<span style="color: #ff0000;">18</span>\.<span style="color: #66cc66;">&#91;</span><span style="color: #ff0000;">0</span><span style="color: #ff0000;">-255</span><span style="color: #66cc66;">&#93;</span>	<span style="color: #66cc66;">&#91;</span>OR<span style="color: #66cc66;">&#93;</span>         <span style="color: #00007f;">RewriteCond</span> %<span style="color: #66cc66;">&#123;</span>REMOTE_ADDR<span style="color: #66cc66;">&#125;</span> ^<span style="color: #ff0000;">59</span>\.<span style="color: #ff0000;">157</span>\.<span style="color: #ff0000;">220</span>\.<span style="color: #66cc66;">&#91;</span><span style="color: #ff0000;">0</span><span style="color: #ff0000;">-255</span><span style="color: #66cc66;">&#93;</span>	<span style="color: #66cc66;">&#91;</span>OR<span style="color: #66cc66;">&#93;</span>         <span style="color: #00007f;">RewriteCond</span> %<span style="color: #66cc66;">&#123;</span>REMOTE_ADDR<span style="color: #66cc66;">&#125;</span> ^<span style="color: #ff0000;">59</span>\.<span style="color: #ff0000;">156</span>\.<span style="color: #ff0000;">227</span>\.<span style="color: #66cc66;">&#91;</span><span style="color: #ff0000;">0</span><span style="color: #ff0000;">-255</span><span style="color: #66cc66;">&#93;</span>	<span style="color: #66cc66;">&#91;</span>OR<span style="color: #66cc66;">&#93;</span>         <span style="color: #00007f;">RewriteCond</span> %<span style="color: #66cc66;">&#123;</span>REMOTE_ADDR<span style="color: #66cc66;">&#125;</span> ^<span style="color: #ff0000;">222</span>\.<span style="color: #ff0000;">229</span>.\<span style="color: #ff0000;">216</span>\.<span style="color: #66cc66;">&#91;</span><span style="color: #ff0000;">0</span><span style="color: #ff0000;">-255</span><span style="color: #66cc66;">&#93;</span>	<span style="color: #66cc66;">&#91;</span>OR<span style="color: #66cc66;">&#93;</span>         <span style="color: #00007f;">RewriteCond</span> %<span style="color: #66cc66;">&#123;</span>REMOTE_ADDR<span style="color: #66cc66;">&#125;</span> ^<span style="color: #ff0000;">203</span>\.<span style="color: #ff0000;">141</span>\.<span style="color: #ff0000;">129</span>\.<span style="color: #66cc66;">&#91;</span><span style="color: #ff0000;">0</span><span style="color: #ff0000;">-255</span><span style="color: #66cc66;">&#93;</span>	<span style="color: #66cc66;">&#91;</span>OR<span style="color: #66cc66;">&#93;</span>         <span style="color: #00007f;">RewriteCond</span> %<span style="color: #66cc66;">&#123;</span>REMOTE_ADDR<span style="color: #66cc66;">&#125;</span> ^<span style="color: #ff0000;">59</span>\.<span style="color: #ff0000;">157</span>\.<span style="color: #ff0000;">220</span>\. 	<span style="color: #00007f;">RewriteRule</span> .* -                                        <span style="color: #66cc66;">&#91;</span>F,L<span style="color: #66cc66;">&#93;</span> &nbsp; &nbsp; 	<span style="color: #00007f;">RewriteCond</span> %<span style="color: #66cc66;">&#123;</span>REQUEST_URI<span style="color: #66cc66;">&#125;</span> !^<span style="color: #66cc66;">&#40;</span>/admin/|/cache/|/db/|/images/|/inc/|locales/|/plugins/<span style="color: #66cc66;">&#41;</span> 	<span style="color: #00007f;">RewriteCond</span> %<span style="color: #66cc66;">&#123;</span>REQUEST_URI<span style="color: #66cc66;">&#125;</span> !^<span style="color: #66cc66;">&#40;</span>/favicon.ico/|/icons/|/local/|/dotclear/|/themes/|/public/<span style="color: #66cc66;">&#41;</span> 	<span style="color: #00007f;">RewriteCond</span> %<span style="color: #66cc66;">&#123;</span>REQUEST_URI<span style="color: #66cc66;">&#125;</span> !^/index.php 	<span style="color: #00007f;">RewriteRule</span> <span style="color: #66cc66;">&#40;</span>.*<span style="color: #66cc66;">&#41;</span>$ /index.php/$<span style="color: #ff0000;">1</span> &nbsp; &lt;/VirtualHost&gt;

J’ai découpe la ligne de RewriteCond en deux pour une question de lecture. J’ai ajouter quelque condition entre autre sur favicon.ico qui malgré le plugin myfavicon n’apparaissait pas.