<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
	xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
	>

<channel>
	<title>dbnewz &#187; benchmarks</title>
	<atom:link href="http://www.dbnewz.com/tag/benchmarks/feed/" rel="self" type="application/rss+xml" />
	<link>http://www.dbnewz.com</link>
	<description>le blog français sur les SGBD - MySQL, Oracle et plus...</description>
	<lastBuildDate>Tue, 31 Jan 2012 16:03:38 +0000</lastBuildDate>
	<generator>http://wordpress.org/?v=2.9.2</generator>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
			<item>
		<title>A quoi sert SQL_NO_CACHE ?</title>
		<link>http://www.dbnewz.com/2011/03/29/a-quoi-sert-sql_no_cache/</link>
		<comments>http://www.dbnewz.com/2011/03/29/a-quoi-sert-sql_no_cache/#comments</comments>
		<pubDate>Tue, 29 Mar 2011 14:35:00 +0000</pubDate>
		<dc:creator>stephane</dc:creator>
				<category><![CDATA[MySQL]]></category>
		<category><![CDATA[benchmarks]]></category>
		<category><![CDATA[performance]]></category>

		<guid isPermaLink="false">http://www.dbnewz.com/?p=865</guid>
		<description><![CDATA[Lorsqu&#8217;on essaie d&#8217;améliorer une requête, que ce soit en modifiant le plan d&#8217;exécution ou en réécrivant la requête, on finit par choisir la variante dont le temps d&#8217;exécution est le plus faible. Encore faut-il que ce temps d&#8217;exécution ne soit pas falsifié par un quelconque cache. En cherchant comment désactiver les caches de MySQL, vous [...]]]></description>
			<content:encoded><![CDATA[<p>Lorsqu&#8217;on essaie d&#8217;améliorer une requête, que ce soit en modifiant le plan d&#8217;exécution ou en réécrivant la requête, on finit par choisir la variante dont le temps d&#8217;exécution est le plus faible. Encore faut-il que ce temps d&#8217;exécution ne soit pas falsifié par un quelconque cache. En cherchant comment désactiver les caches de MySQL, vous avez certainement trouvé la directive SQL_NO_CACHE. Cet article va faire le point sur ce que fait cette directive, mais également sur ce qu&#8217;elle ne fait pas.<br />
<span id="more-865"></span></p>
<p>Si vous avez déjà eu besoin de mesurer le temps que prend une requête sur un serveur inactif, vous avez sans doute déjà rencontré ce cas de figure :</p>
<p>1ère exécution :<br />
<code><br />
mysql&gt; SELECT COUNT(*) AS total,YEAR(birth_date) AS birth_year<br />
FROM employees INNER JOIN salaries USING(emp_no)<br />
WHERE first_name LIKE '%m%' AND salary &gt; 50000 AND to_date &lt; &#039;2010-12-31&#039;<br />
GROUP BY birth_year;<br />
[...]<br />
14 rows in set (<strong>11.70 sec</strong>)<br />
</code><br />
Exécutions suivantes :<br />
<code><br />
mysql&gt; SELECT COUNT(*) AS total,YEAR(birth_date) AS birth_year<br />
FROM employees INNER JOIN salaries USING(emp_no)<br />
WHERE first_name LIKE '%m%' AND salary &gt; 50000 AND to_date &lt; &#039;2010-12-31&#039;<br />
GROUP BY birth_year;<br />
[...]<br />
14 rows in set (<strong>0.00 sec</strong>)<br />
</code></p>
<p>Une telle différence ne peut s&#8217;expliquer que par la présence d&#8217;un cache : à la première exécution, le cache étant vide, la requête a été exécutée et mise en cache, alors que pour les exécutions suivantes, le cache était rempli et la requête a pu être servie directement. Une question demeure : de quel cache s&#8217;agit-il ?</p>
<p>Le 1er cache auquel on peut penser est le cache de requêtes (plus connu sous sa dénomination anglo-saxonne de query_cache). C&#8217;est le cache qui est visé par la directive SQL_NO_CACHE :<br />
<code><br />
mysql&gt; SELECT <strong>SQL_NO_CACHE</strong> COUNT(*) AS total,YEAR(birth_date) AS birth_year<br />
FROM employees INNER JOIN salaries USING(emp_no)<br />
WHERE first_name LIKE '%m%' AND salary &gt; 50000 AND to_date &lt; &#039;2010-12-31&#039;<br />
GROUP BY birth_year;<br />
[...]<br />
14 rows in set (<strong>2.95 sec</strong>)<br />
</code><br />
<code><br />
mysql&gt; SELECT <strong>SQL_NO_CACHE</strong> COUNT(*) AS total,YEAR(birth_date) AS birth_year<br />
FROM employees INNER JOIN salaries USING(emp_no)<br />
WHERE first_name LIKE '%m%' AND salary &gt; 50000 AND to_date &lt; &#039;2010-12-31&#039;<br />
GROUP BY birth_year;<br />
[...]<br />
14 rows in set (<strong>2.89 sec</strong>)<br />
</code><br />
<code><br />
mysql&gt; SELECT <strong>SQL_NO_CACHE</strong> COUNT(*) AS total,YEAR(birth_date) AS birth_year<br />
FROM employees INNER JOIN salaries USING(emp_no)<br />
WHERE first_name LIKE '%m%' AND salary &gt; 50000 AND to_date &lt; &#039;2010-12-31&#039;<br />
GROUP BY birth_year;<br />
[...]<br />
14 rows in set (<strong>2.96 sec</strong>)<br />
</code><br />
(Sujet annexe : je ne m&#8217;attache pas ici à la configuration du cache de requêtes, voici un excellent <a href="http://dom.as/tech/query-cache-tuner/">tutoriel</a> pour ceux qui se posent la question)</p>
<p><code>SQL_NO_CACHE</code> désactive-t-elle tous les caches ? Eh bien non, et il est facile de s&#8217;en convaincre : la toute 1ère exécution de la requête prenait près de 12s, la 1ère avec le <code>SQL_NO_CACHE</code> moins de 3s. Quels sont donc ces autres caches ?</p>
<p>Le seul cache géré par le serveur MySQL étant le cache de requêtes, il faut descendre au niveau des moteurs de stockage pour mieux comprendre ce qui se passe. Pour MyISAM, il existe un cache pour les index dont la taille est paramétrable via la variable <code>key_buffer_size</code> et un cache pour les données, qui est tout simplement le cache du système de fichiers (donc pour lequel il n&#8217;existe aucun moyen d&#8217;agir au niveau de MySQL). Pour InnoDB, un seul cache existe pour les données et les index; sa taille est donnée par la variable <code>innodb_buffer_pool_size</code>.</p>
<p>Il est très important de noter que <code>SQL_NO_CACHE</code> n&#8217;a aucune influence sur ces 3 caches. C&#8217;est pour cette raison qu&#8217;il faut faire très attention quand on fait des tests en mesurant des temps d&#8217;exécution sous peine d&#8217;obtenir des résultats fantaisistes, par exemple quand on cherche à déterminer si le passage en une version supérieure pourrait permettre d&#8217;améliorer les performances. Les effets des caches peuvent d&#8217;ailleurs biaiser les résultats dans les 2 sens, soit en les améliorant artificiellement, soit en les dégradant artificiellement. Un petit exemple ?</p>
<p>Imaginez une base dont toutes les tables sont en InnoDB. La base a une taille de 100 Go, le cache InnoDB (buffer pool) vaut 10Go. Pour avoir une idée du temps que va prendre une requête en production, vous remontez un environnement identique et après avoir démarré MySQL, vous exécutez votre requête plusieurs fois pour que le cache puisse se remplir et avoir ainsi un temps de réponse fiable. Vous obtenez les résultats suivants :</p>
<p>1er test : 4.5s<br />
2nd test : 0.7s<br />
3è test : 0.7s<br />
4è test : 0.7s</p>
<p>Pourrez-vous dire qu&#8217;en production, votre cache étant bien évidemment chaud, la requête devrait s&#8217;exécuter en 0.7s ? Eh non ! Car le cache étant nettement plus petit que la taille de la base, il est tout à fait possible qu&#8217;au moment où vous exécutez votre requête en production, le cache ne contienne aucune donnée intéressante. Tout ce que vous pouvez dire, c&#8217;est que la requête va probablement mettre entre 0.7 et 4.5s pour s&#8217;exécuter en production.</p>
<p>Cette toute petite incursion dans le monde des caches montre qu&#8217;il n&#8217;est pas évident du tout de faire des tests de performances significatifs. Vous saurez maintenant vous méfier des benchmarks qui donnent des chiffres sans expliquer le protocole utilisé pour produire des résultats fiables&#8230;</p>
]]></content:encoded>
			<wfw:commentRss>http://www.dbnewz.com/2011/03/29/a-quoi-sert-sql_no_cache/feed/</wfw:commentRss>
		<slash:comments>6</slash:comments>
		</item>
		<item>
		<title>Pour ou contre les procédures et fonctions stockées ?</title>
		<link>http://www.dbnewz.com/2010/12/08/pour-ou-contre-les-procedures-fonctions-stockees/</link>
		<comments>http://www.dbnewz.com/2010/12/08/pour-ou-contre-les-procedures-fonctions-stockees/#comments</comments>
		<pubDate>Wed, 08 Dec 2010 16:16:02 +0000</pubDate>
		<dc:creator>stephane</dc:creator>
				<category><![CDATA[MySQL]]></category>
		<category><![CDATA[benchmarks]]></category>

		<guid isPermaLink="false">http://www.dbnewz.com/?p=775</guid>
		<description><![CDATA[Faut-il oui ou non utiliser des procédures ou fonctions stockées avec MySQL ? Le question a souvent été soulevée et donne lieu à chaque fois à de vifs échanges entre pro et anti. Cet article vous propose une approche différente : se focaliser sur quelques points particuliers (sécurité, performance, débogage) et donner les avantages et [...]]]></description>
			<content:encoded><![CDATA[<p>Faut-il oui ou non utiliser des procédures ou fonctions stockées avec MySQL ? Le question a souvent été soulevée et donne lieu à chaque fois à de vifs échanges entre pro et anti. Cet article vous propose une approche différente : se focaliser sur quelques points particuliers (sécurité, performance, débogage) et donner les avantages et inconvénients de l&#8217;utilisation des routines stockées. Avec ces éléments en main, vous pourrez décider par vous-même si les routines stockées sont pertinentes pour votre application.<span id="more-775"></span></p>
<h3>Sécurité</h3>
<p>Un des points clés cités par les partisans des routines stockées est la sécurité accrue : en effet, on peut contrôler les droits donnés aux utilisateurs plus finement et de manière plus flexible qu&#8217;avec le système de droits classiques via les commandes <code>GRANT</code>. Il suffit pour cela, au moment de la déclaration de la routine, d&#8217;ajouter la clause <code>SQL SECURITY DEFINER 'user'@'host'</code>, qui permet d&#8217;exécuter la routine non pas avec les droits de l&#8217;utilisateur invoquant la routine mais avec les droits de l&#8217;utilisateur <code>'user'@'host'</code>.</p>
<p>Par exemple, on peut décider de ne donner aucun droit via <code>GRANT</code> à un utilisateur pour une table t, mais lui laisser la possibilité de consulter cette table avec une routine getTData() et de modifier cette table avec une routine setTData(). On se rapproche ainsi du concept d&#8217;<a href="http://fr.wikipedia.org/wiki/Encapsulation_%28programmation%29">encapsulation des données</a> que connaissent bien tous ceux qui ont l&#8217;habitude de travailler avec des langages objet.</p>
<p>Une autre possibilité intéressante des routines stockées est d&#8217;utiliser des requêtes préparées pour diminuer le risque d&#8217;injection SQL. Dans notre débat, cet argument ne constitue pas un avantage décisif dans la mesure où il est bien sûr possible de se servir des requêtes préparées sans routine stockée. A noter aussi que les requêtes préparées n&#8217;offrent pas une protection totale contre les injections SQL (c&#8217;est un bon sujet pour un autre article).</p>
<p>Il existe cependant quelques cas où une routine stockée peut créer des trous de sécurité. Ce sera le cas par exemple si vous utilisez des fonctions de cryptage dans vos routines : si quelqu&#8217;un peut accéder à la base, il pourra à la fois visualiser les données cryptées et la fonction de cryptage, facilitant le processus de décryptage des données. Si le cryptage avait été fait dans l&#8217;application, il faudrait réussir à avoir accès à la base de données et au code applicatif pour obtenir la même information.</p>
<h3>Performance</h3>
<p>C&#8217;est peut-être le sujet le plus intéressant sur les routines stockées car vous trouverez des exemples qui vous montreront tous les cas de figure possibles, de ceux qui ont gagné 200% de performance en écrivant une routine à ceux qui ont gagné 200% de performance en remplaçant les routines par du code applicatif. Pour bien comprendre pourquoi un tel fossé peut exister, il faut garder à l&#8217;esprit les quelques points suivants qui sont parfois contradictoires :</p>
<ul>
<li>exécuter une routine stockée économise du trafic réseau car toutes les requêtes internes à la routine n&#8217;ont pas à être transmises du client au serveur </li>
<li>le plan d&#8217;exécution de la routine est mis en cache, ce qui est intéressant si on doit appeler plusieurs fois la même procédure (hors routines, le plan d&#8217;exécution est calculé à chaque passage d&#8217;une requête qui ne se trouve pas dans le cache de requêtes). Cependant, cette mise en cache se fait par connexion, ce qui peut gâcher des ressources et être peu efficace si de nombreuses connexions n&#8217;exécutent qu&#8217;une seule fois la même routine.</li>
<li>le langage est vraiment simpliste par rapport à un vrai langage de programmation rendant difficile par exemple les manipulations avancées sur les chaînes de caractères, beaucoup de constructions se révèlent très lentes</li>
<li>exécuter des routines stockées revient à décharger le serveur d&#8217;applications (ou le serveur web) et à charger le serveur de base de données, or la scalabilité de la base de données est plus difficile à assurer que celle d&#8217;un serveur d&#8217;applications</li>
</ul>
<p>Ces quelques règles très simples vont vous donner une bonne indication sur les cas où les routines seront bénéfiques et sur les cas où il vaut mieux les éviter.  Par exemple, si vous devez exécuter des requêtes très simples, le temps passé à la communication entre le client et le serveur devient non négligeable dans le temps total d&#8217;exécution de la requête. De même pour le temps passé pour l&#8217;optimisation. Avec une routine stockée, la communication client-serveur disparaît et comme le plan d&#8217;exécution est mis en cache, l&#8217;optimisation n&#8217;est faite qu&#8217;une seule fois.</p>
<p>On peut vérifier ces hypothèses dans le cas d&#8217;une table qu&#8217;on souhaite remplir avec un jeu de données de test :<br />
<code><br />
CREATE TABLE t (<br />
  id int(11) NOT NULL AUTO_INCREMENT,<br />
  col1 varchar(10) DEFAULT NULL,<br />
  col2 int(11) DEFAULT NULL,<br />
  PRIMARY KEY (id)<br />
) ENGINE=InnoDB;<br />
</code></p>
<p>Une procédure stockée permettant de remplir la table pourrait être la suivante :<br />
<code><br />
DELIMITER $$<br />
</code><code><br />
DELIMITER $$<br />
</code><code><br />
CREATE DEFINER=`root`@`localhost` PROCEDURE `gen_table`(IN total INT)<br />
BEGIN<br />
&nbsp;&nbsp;	DECLARE i INT DEFAULT 0;<br />
&nbsp;&nbsp;	WHILE i &lt; total DO<br />
&nbsp;&nbsp;&nbsp;&nbsp;		INSERT INTO t (col1,col2) VALUES (&#039;aaaa&#039;,i*2+1);<br />
&nbsp;&nbsp;&nbsp;&nbsp;		SET i = i+1;<br />
&nbsp;&nbsp;	END WHILE;<br />
END<br />
</code><br />
et un programme PHP réalisant la même opération pourrait être :<br />
<code><br />
&lt;?php<br />
</code><code><br />
$dbh = mysqli_connect('localhost','root','','test');<br />
</code><code><br />
for($i=0;$i&lt;$argv[1];$i++){<br />
</code><code><br />
       &nbsp;&nbsp; $sql = "INSERT INTO t (col1,col2) VALUES ('aaaa',$i*2+1)";<br />
</code><code><br />
       &nbsp;&nbsp; $dbh-&gt;query($sql) or die(mysqli_error($dbh));<br />
}<br />
</code><code><br />
?&gt;<br />
</code></p>
<p>En cherchant à insérer 100 000 enregistrements dans la table par chacune des méthodes, j&#8217;obtiens les temps d&#8217;exécution suivants :</p>
<ul>
<li>procédure stockée : 4,48s</li>
<li>programme PHP : 9,67s</li>
</ul>
<p>Je vous laisse imaginer un exemple basé sur des calculs un peu compliqués, et qui tournerait à l&#8217;avantage du programme PHP&#8230;</p>
<h3>Débogage</h3>
<p>Voici bien un point pour lequel les routines stockées MySQL sont très faibles : rien, absolument rien n&#8217;est prévu pour vous aider à comprendre pourquoi une routine stockée est lente ou pourquoi le comportement observé n&#8217;est pas celui que vous attendiez. Pire, si vous activez le general_log pour essayer de voir toutes les requêtes qui sont faites par votre routine, vous ne verrez rien : en effet, seul l&#8217;appel à la routine sera stocké.</p>
<h3>Conclusion</h3>
<p>Alors, pour ou contre les routines stockées ? Comme j&#8217;espère vous l&#8217;avoir montré dans cet article, le tableau est loin d&#8217;être tout blanc ou tout noir. D&#8217;autant plus qu&#8217;il vous faudra également prendre en compte dans vos sauvegardes le fait d&#8217;utiliser des routines stockées et que les interactions entre réplication et routines stockées (si vous avez mis en place la réplication) sont loin d&#8217;être simples à gérer.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.dbnewz.com/2010/12/08/pour-ou-contre-les-procedures-fonctions-stockees/feed/</wfw:commentRss>
		<slash:comments>2</slash:comments>
		</item>
		<item>
		<title>Les SSD (Solid-State Drive) : une technologie d&#8217;avenir pour nos SGBD ?</title>
		<link>http://www.dbnewz.com/2008/05/13/les-ssd-solid-state-drive-une-technologie-davenir-pour-nos-sgbd/</link>
		<comments>http://www.dbnewz.com/2008/05/13/les-ssd-solid-state-drive-une-technologie-davenir-pour-nos-sgbd/#comments</comments>
		<pubDate>Tue, 13 May 2008 06:12:34 +0000</pubDate>
		<dc:creator>arnaud</dc:creator>
				<category><![CDATA[IBMDB2]]></category>
		<category><![CDATA[MSSQL]]></category>
		<category><![CDATA[MySQL]]></category>
		<category><![CDATA[Oracle]]></category>
		<category><![CDATA[benchmarks]]></category>
		<category><![CDATA[hardware]]></category>

		<guid isPermaLink="false">http://www.dbnewz.com/2008/05/13/les-ssd-solid-state-drive-une-technologie-davenir-pour-nos-sgbd/</guid>
		<description><![CDATA[Modifier une petite ligne dans le fichier de configuration de son SGBD et obtenir les performances souhaitées, c&#8217;est possible&#8230; si vous êtes chanceux. La performance globale d&#8217;un SGBD repose en effet sur un ensemble de briques, logicielles ou matérielles, qui une fois empilées correctement forment un ensemble cohérent (et performant) : la seule étape du [...]]]></description>
			<content:encoded><![CDATA[<p>Modifier une petite ligne dans le fichier de configuration de son SGBD et obtenir les performances souhaitées, c&#8217;est possible&#8230; si vous êtes chanceux. La performance globale d&#8217;un SGBD repose en effet sur un ensemble de briques, logicielles ou matérielles, qui une fois empilées correctement forment un ensemble cohérent (et performant) : la seule étape du fichier de configuration ne suffit pas.</p>
<p>Dans un de ses <a href="http://www.bigdbahead.com/?p=49" target="_blank">récents billets</a>, Matt Yonkovit a déclenché une série de <a href="http://www.mysqlperformanceblog.com/2008/04/25/is-disk-everything-for-mysql-performance/" target="_blank">réflexions intéressantes</a> à propos de l&#8217;impact des performances des disques durs sur l&#8217;ensemble du SGBD.</p>
<p>Selon lui, les problèmes de performance au sein d&#8217;un SGBD sont la plupart du temps relatifs aux disques durs et notamment au nombre d&#8217;I/O (Entrées/Sorties) qu&#8217;ils sont capables de traiter par seconde (IOPS).</p>
<p>Comparés aux processeurs actuels capables de prendre plusieurs milliards de décisions par seconde (Ghz) et aux mémoires vives dont les temps d&#8217;accès se mesurent en nanosecondes, le temps d&#8217;accès d&#8217;un disque dur se compte encore en millisecondes&#8230; Difficile de lutter contre des éléments purement électroniques quand on est constitué d&#8217;éléments mécaniques en mouvement (têtes de lecture, plateaux&#8230;).</p>
<p><span id="more-37"></span></p>
<p>Afin d&#8217;avoir recours le moins possible aux disques, l&#8217;utilisation des index est une première étape qu&#8217;on complètera par différents mécanismes de caching afin de limiter encore davantage les accès à ce support et éviter ainsi que le disque ne constitue un goulet d&#8217;étranglement (&laquo;&nbsp;I/O bound&nbsp;&raquo;).</p>
<p>Outre ces mécanismes, la technologie SSD pourrait bien à l&#8217;avenir changer la donne.</p>
<p>Les SSD, littéralement <a title="Open HDD and SSD" href="http://en.wikipedia.org/wiki/Image:Open_HDD_and_SSD.JPG" target="_blank">Solid-State Drives</a> (ou Disk par abus de langage), ne sont pas des  disques mais des unités de stockage constituées de mémoire flash (persistante).</p>
<p>Au vu des benchmarks les concernant, il y&#8217;a fort à parier que les SSD seront de plus en plus d&#8217;actualité dans les mois qui viennent.<br />
Ces <a href="http://www.bigdbahead.com/?p=44" target="_blank">benchmarks </a>sont unanimes sur un point : les SSD obtiennent d&#8217;excellentes performances lors des random read, laissant loin derrière les disques &laquo;&nbsp;classiques&nbsp;&raquo;. Grosse ombre au tableau néanmoins : les tests effectués sur des random write ne sont pas aussi concluants. Pourquoi ?</p>
<p>Sur un disque classique un &laquo;&nbsp;random read&nbsp;&raquo; entraîne (du plus couteux au moins couteux) :<br />
- le déplacement de la tête de lecture/écriture sur la bonne piste (&laquo;&nbsp;seek time&nbsp;&raquo;)<br />
- une fois la tête sur la bonne piste, il faut encore repérer sur celle-ci le bloc secteur demandé (&laquo;&nbsp;rotational latency&nbsp;&raquo;)<br />
- la lecture et la transmission de la donnée vers le système.</p>
<p>Avec un SSD, le même &laquo;&nbsp;random read&nbsp;&raquo; est beaucoup plus rapide : pas de tête de lecture à déplacer ni d&#8217;attente liée à la rotation d&#8217;un plateau. Conclusion, comptez environ 5 ms de temps d&#8217;accès à un secteur particulier pour un disque performant et environ 0.15 ms pour un SSD.</p>
<p>En revanche, lors d&#8217;une écriture, le SSD est par conception beaucoup plus lent qu&#8217;en lecture : la &laquo;&nbsp;préparation&nbsp;&raquo; obligatoire de l&#8217;importante zone dédiée à l&#8217;écriture (&laquo;&nbsp;erase block&nbsp;&raquo;) et un <a href="http://managedflash.com/technology/problem.htm" target="_blank">ensemble d&#8217;écritures spécifique</a> à cette technologie pénalisent les performances.</p>
<p>Face à ce problème connu, des parades logicielles voient le jour et la plupart des constructeurs de SSD proposeront sûrement leur propre solution dans les mois à venir. Actuellement <a href="http://managedflash.com/what/index.htm" target="_blank">la technologie MFT</a> (Managed Flash Technology) offre déjà de grandes améliorations (cf lien &laquo;&nbsp;benchmarks&nbsp;&raquo; ci-dessus, 3ème graphique). Les performances obtenues sont sensiblement égales lors des random read par rapport aux SSD classiques mais les résultats sont 30x supérieurs en random write par rapport aux SSD et 15x supérieurs aux disque durs.</p>
<p>Enfin, un autre signe que le SSD est très certainement une technologie d&#8217;avenir : un des plus récents moteurs pour MySQL, <a href="http://www.primebase.org/" target="_blank">PBXT</a>, est <a href="http://assets.en.oreilly.com/1/event/2/Inside%20the%20PBXT%20Storage%20Engine%20Presentation.pdf" target="_blank">conçu pour fonctionner avec les SSD</a> (pdf).</p>
<p>Pour résumer, concernant les SSD :</p>
<p>Avantages :<br />
- Très rapide en random read<br />
- Peu sensible à la fragmentation des fichiers : performances constantes.<br />
- Fiabilité supérieure au HD (pas d&#8217;éléments mécaniques en mouvement)</p>
<p>Inconvénients des SSD :<br />
- Prix<br />
- Capacités en deça des disques actuels<br />
- Durée de vie plus courte qu&#8217;un disque (nombres de cycles d&#8217;écriture limités)</p>
<p>Améliorations attendues (et en cours) :<br />
- Chute des prix<br />
- Augmentation des performances en écriture<br />
- Augmentation de la capacité<br />
- Meilleure répartition des écritures sur le support (augmentation du nombre de cycles écritures / durée de vie)</p>
<p>Si cette rapide présentation des SSD a aiguisé votre curiosité, voici quelques pistes pour aller plus loin  :<br />
- <a href="http://feedblog.org/category/ssd/" target="_blank">Le blog</a> de Kevin Burton.<br />
- <a href="http://en.wikipedia.org/wiki/Solid-state_drive" target="_blank">La rubrique SSD</a> sur Wikipédia (notamment les références en bas de page).</p>
]]></content:encoded>
			<wfw:commentRss>http://www.dbnewz.com/2008/05/13/les-ssd-solid-state-drive-une-technologie-davenir-pour-nos-sgbd/feed/</wfw:commentRss>
		<slash:comments>7</slash:comments>
		</item>
		<item>
		<title>Réplication et Log binaires</title>
		<link>http://www.dbnewz.com/2007/04/06/replication-et-log-binaires/</link>
		<comments>http://www.dbnewz.com/2007/04/06/replication-et-log-binaires/#comments</comments>
		<pubDate>Fri, 06 Apr 2007 20:58:43 +0000</pubDate>
		<dc:creator>pébé</dc:creator>
				<category><![CDATA[4.1]]></category>
		<category><![CDATA[MySQL]]></category>
		<category><![CDATA[réplication]]></category>
		<category><![CDATA[benchmarks]]></category>
		<category><![CDATA[pratique]]></category>

		<guid isPermaLink="false">http://www.dbnewz.com/2007-04/4-replication-et-log-binaires.htm</guid>
		<description><![CDATA[Qui n&#8217;a jamais utilisé MySQL sans la réplication? La réplication permet à votre application de supporter un nombre de lecture beaucoup plus important. Les updates se font sur une base de donnée &#171;&#160;maître&#160;&#187; (master) et sont ensuite répliquées sur plusieurs &#171;&#160;esclaves&#160;&#187; (slaves). Le maître n&#8217;a pas à supporter les requêtes venant de clients qui sont [...]]]></description>
			<content:encoded><![CDATA[<p>Qui n&#8217;a jamais utilisé MySQL sans la réplication? La réplication permet à votre application de supporter un nombre de lecture beaucoup plus important. Les updates se font sur une base de donnée &laquo;&nbsp;maître&nbsp;&raquo; (master) et sont ensuite répliquées sur plusieurs &laquo;&nbsp;esclaves&nbsp;&raquo; (slaves). Le maître n&#8217;a pas à supporter les requêtes venant de clients qui sont gérées par les esclaves. Un autre jour je rentrerai plus en détails la dessus mais en résumé, le maître écrit dans des fichiers toutes les requêtes qui ont modifié ses informations (insert, update et delete). Les slaves viennent à leur tour récupérer ces fichiers (binary logs) et les &laquo;&nbsp;copie&nbsp;&raquo; localement (relay logs) avant de les rejouer.</p>
<p>Il est conseillé en général de dédier un disque pour ces fichiers car beaucoup d&#8217;écriture entraîne une baisse de vos performances. Dans le cas qui nous intéresse, l&#8217;activité du CPU m&#8217;a très étonné. En effet jusqu&#8217;à 60% du temps CPU étaient utilisé par &#8216;USER&#8217; juste en activant la réplication.<br />
<span id="more-4"></span><br />
Suite à cela j&#8217;ai décidé avec mon ami Laurent de faire un peu de profiling&#8230; sommes nous un peu DBCSI? (comprenez database crime scene investigators <img src='http://www.dbnewz.com/wp-includes/images/smilies/icon_wink.gif' alt=';)' class='wp-smiley' /> )  Pour cela un outil intéressant est <a href="http://mysqldump.azundris.com/archives/61-Using-oprofile.html" target="_blank">oprofile</a>.</p>
<p>Pour tester ça, nous avons un DELL 2850 sous RHEL4 1 disque (hélas) et 2Go de RAM. Le programme de test à été exécuté pendant 30 minutes, et voila les résultats surprenant.</p>
<ul>
<li>Avec binlog</li>
<p>Profiling through timer interrupt<br />
samples  %        image name               symbol name<br />
1680924  47.9708  /lib64/tls/libc-2.3.4.so __ctype_toupper_loc<br />
1651101  47.1197  /usr/libexec/mysqld      dict_create_foreign_constraints_low<br />
54986     1.5692  /usr/libexec/mysqld      yylex(void*, void*)<br />
9083      0.2592  /usr/libexec/mysqld      __do_global_ctors_aux<br />
8541      0.2437  /usr/libexec/mysqld      buf_pool_init<br />
8284      0.2364  /lib64/tls/libc-2.3.4.so memcpy<br />
5918      0.1689  /usr/libexec/mysqld      my_snprintf_ucs2<br />
4934      0.1408  /usr/libexec/mysqld      log_buffer_flush_to_disk<br />
4640      0.1324  /usr/libexec/mysqld      my_strntod_ucs2<br />
4268      0.1218  /usr/libexec/mysqld      MD5Transform<br />
3650      0.1042  /usr/libexec/mysqld      my_parse_charset_xml</p>
<li>Sans binlog</li>
<p>Profiling through timer interrupt<br />
samples  %        image name               symbol name<br />
34847     9.7094  /usr/libexec/mysqld      __do_global_ctors_aux<br />
30416     8.4748  /lib64/tls/libc-2.3.4.so memcpy<br />
30041     8.3703  /usr/libexec/mysqld      buf_pool_init<br />
20615     5.7439  /usr/libexec/mysqld      my_snprintf_ucs2<br />
17065     4.7548  /usr/libexec/mysqld      my_strntod_ucs2<br />
16656     4.6408  /usr/libexec/mysqld      log_buffer_flush_to_disk<br />
14908     4.1538  /usr/libexec/mysqld      dict_create_foreign_constraints_low<br />
9154      2.5506  /lib64/tls/libpthread-2.3.4.so pthread_mutex_trylock<br />
8354      2.3277  /lib64/tls/libc-2.3.4.so __ctype_toupper_loc<br />
8216      2.2892  /lib64/tls/libpthread-2.3.4.so pthread_mutex_unlock<br />
5347      1.4898  /usr/lib/debug/lib/modules/2.6.9-22.ELsmp/vmlinux copy_user_generic<br />
3380      0.9418  /usr/libexec/mysqld      buf_flush_try_page</ul>
<p>On remarque que lorsque les logs binaires sont activés, beaucoup de temps CPU est utilisé par cette fonction &laquo;&nbsp;dict_create_foreign_constraints_low&nbsp;&raquo;. Ce qui très étrange, car elle est supposé être utilisé lorsque d&#8217;une modification de DDL (création de tables,&#8230;) pour effectuer des vérifications sur les clés étrangères. Et sur cette application, même si nous sommes en InnoDB, il n&#8217;y en a aucune.</p>
<p>Des que nous aurons un peu de temps devant nous, nous referons le test sous MySQL 5.0.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.dbnewz.com/2007/04/06/replication-et-log-binaires/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
	</channel>
</rss>

