<?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>Decrypt &#187; EC2</title>
	<atom:link href="http://decrypt.ysance.com/tag/ec2/feed/" rel="self" type="application/rss+xml" />
	<link>http://decrypt.ysance.com</link>
	<description>Le site de decryptage des technologies de l&#039;informatique</description>
	<lastBuildDate>Fri, 03 Feb 2012 08:25:47 +0000</lastBuildDate>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>http://wordpress.org/?v=3.1.3</generator>
		<item>
		<title>Benchmark CPU sur Amazon EC2</title>
		<link>http://decrypt.ysance.com/2010/11/benchmark-cpu-sur-amazon-ec2/</link>
		<comments>http://decrypt.ysance.com/2010/11/benchmark-cpu-sur-amazon-ec2/#comments</comments>
		<pubDate>Fri, 26 Nov 2010 18:02:33 +0000</pubDate>
		<dc:creator>Frédéric Faure</dc:creator>
				<category><![CDATA[Benchmark]]></category>
		<category><![CDATA[Cloud Computing]]></category>
		<category><![CDATA[Infrastructure]]></category>
		<category><![CDATA[Amazon Web Services]]></category>
		<category><![CDATA[EC2]]></category>

		<guid isPermaLink="false">http://decrypt.ysance.com/?p=1643</guid>
		<description><![CDATA[<img class="size-medium wp-image-1645 alignleft" title="Bench CPU" src="http://decrypt.ysance.com/wp-content/uploads/2010/11/cpu-001-231x300.jpg" alt="Bench CPU" width="162" height="210" />

Cet article constitue un retour d'expérience sur un benchmark CPU sur différents types (tailles) d'instances <a title="Site de Amazon Web Services, Rubrique Elastic Compute Cloud" href="http://aws.amazon.com/ec2/">EC2</a> sur AWS. L'objectif était de constater le comportement, au niveau des ressources CPU, desdites instances lors d'une montée en charge sur un traitement multi-threadé et de les comparer par rapport à un étalon plus récent (choisi arbitrairement, comme un portable) que celui proposé par AWS : l'ECU ou EC2 Compute Unit.

Tout d'abord, je tiens à remercier <a title="Blog de Sylvain Terret" href="http://www.tme520.net/golbbew/">Sylvain Terret</a> qui a effectué le test "en ressortant un vieux bout de code du placard" et qui a aussi écrit un billet sur son blog sur le sujet. Ensuite, je fais également écho à un <a title="SmugMug's Don MacAskill, EC2 isn't 50% slower" href="http://don.blogs.smugmug.com/2008/02/27/ec2-isnt-50-slower/">article intéressant (EC2 isn't 50% slower)</a> qui répond à quelques controverses sur la réalité des ressources CPU mises à disposition lors du lancement d'une instance EC2. Je vous invite à lire cet article synthétique et instructif, ainsi que les commentaires associés.

Pour commencer, le bench a été effectué sur un Ubuntu Lucid Lynx. Le code ci-dessous a été utilisé pour charger les différents types d'instances EC2 : il s'agit d'une multiplication de matrices basée sur l'API <a title="Site de OpenMP, The OpenMP API specification for parallel programming" href="http://openmp.org/wp/">OpenMP</a>.

[...]
]]></description>
			<content:encoded><![CDATA[<p><img class="size-medium wp-image-1645 alignleft" title="Bench CPU" src="http://decrypt.ysance.com/wp-content/uploads/2010/11/cpu-001-231x300.jpg" alt="Bench CPU" width="162" height="210" /></p>
<p>Cet article constitue un retour d&#8217;expérience sur un benchmark CPU sur différents types (tailles) d&#8217;instances <a title="Site de Amazon Web Services, Rubrique Elastic Compute Cloud" href="http://aws.amazon.com/ec2/">EC2</a> sur AWS. L&#8217;objectif était de constater le comportement, au niveau des ressources CPU, desdites instances lors d&#8217;une montée en charge sur un traitement multi-threadé et de les comparer par rapport à un étalon plus récent (choisi arbitrairement, comme un portable) que celui proposé par AWS : l&#8217;ECU ou EC2 Compute Unit.</p>
<p>Tout d&#8217;abord, je tiens à remercier <a title="Blog de Sylvain Terret" href="http://www.tme520.net/golbbew/">Sylvain Terret</a> qui a effectué le test &laquo;&nbsp;en ressortant un vieux bout de code du placard&nbsp;&raquo; et qui a aussi écrit un billet sur son blog sur le sujet. Ensuite, je fais également écho à un <a title="SmugMug's Don MacAskill, EC2 isn't 50% slower" href="http://don.blogs.smugmug.com/2008/02/27/ec2-isnt-50-slower/">article intéressant (EC2 isn&#8217;t 50% slower)</a> qui répond à quelques controverses sur la réalité des ressources CPU mises à disposition lors du lancement d&#8217;une instance EC2. Je vous invite à lire cet article synthétique et instructif, ainsi que les commentaires associés.</p>
<p>Pour commencer, le bench a été effectué sur un Ubuntu Lucid Lynx. Le code ci-dessous a été utilisé pour charger les différents types d&#8217;instances EC2 : il s&#8217;agit d&#8217;une multiplication de matrices basée sur l&#8217;API <a title="Site de OpenMP, The OpenMP API specification for parallel programming" href="http://openmp.org/wp/">OpenMP</a>.</p>
<p>Ce calcul matriciel va être exécuté plusieurs fois en incrémentant à chaque fois le nombre de threads qui vont se partager (parallélisation) le calcul. Ainsi, nous avons pu comparer un même traitement lorsqu&#8217;il est exécuté par 1, 2, &#8230; 12 threads et constater l&#8217;évolution du temps d&#8217;exécution en fonction du type d&#8217;instance EC2, c&#8217;est à dire, dans le cas qui nous intéresse, en fonction du nombre de CPUs disponibles sur chaque type d&#8217;instance. Il est à noter que chaque CPU affecté au traitement d&#8217;un thread donné est monopolisé à 100% lors de l&#8217;exécution du calcul.</p>
<p>Le code source est le suivant :</p>
<blockquote><p>#include<br />
#include<br />
#include<br />
#include</p>
<p>#define SIZE 2000</p>
<p>double get_time() {<br />
struct timeval tv;<br />
gettimeofday(&amp;tv, (void *)0);<br />
return (double) tv.tv_sec + tv.tv_usec*1e-6;<br />
}</p>
<p>int main(int argc, char const *argv[]) {<br />
int nb, i, j, k;<br />
double t, start, stop;<br />
double* matrice_A;<br />
double* matrice_B;<br />
double* matrice_res;</p>
<p>// Allocations<br />
matrice_A = (double*) malloc(SIZE*SIZE*sizeof(double));<br />
matrice_B = (double*) malloc(SIZE*SIZE*sizeof(double));<br />
matrice_res = (double*) malloc(SIZE*SIZE*sizeof(double));</p>
<p>for(i=0; i   for(j=0; j   matrice_A[i*SIZE+j] = (double)rand()/(double)RAND_MAX;<br />
matrice_B[i*SIZE+j] = (double)rand()/(double)RAND_MAX;<br />
}<br />
}<br />
printf(&laquo;&nbsp;Nb.threads\tTps.\n&nbsp;&raquo;);</p>
<p>for(nb=1; nb&lt;=12; nb++){<br />
start = get_time();<br />
#pragma omp parallel for num_threads(nb) private(j,k)<br />
for(i=0; i   for(j=0; j   matrice_res[i*SIZE+j] = 0.0;<br />
for(k=0; k   matrice_res[i*SIZE+j] += (matrice_A[i*SIZE+k] * matrice_B[i*SIZE+j]);<br />
}<br />
}<br />
}<br />
stop = get_time();<br />
t = stop &#8211; start;<br />
printf(&laquo;&nbsp;%d\t%f\n&nbsp;&raquo;, nb, t);<br />
}<br />
// Libérations<br />
free(matrice_A);<br />
free(matrice_B);<br />
free(matrice_res);<br />
return EXIT_SUCCESS;<br />
}</p></blockquote>
<p>Les instances benchées sont les suivantes :</p>
<ul>
<li>Standard Instances &#8211; Large Instance (M1.LARGE) 7.5 GB of memory, <strong><em>4 EC2 Compute Units</em></strong> (<strong><em>2 virtual cores with 2 EC2 Compute Units each</em></strong>), 850 GB of local instance storage, 64-bit platform</li>
<li>Standard Instances &#8211; Extra Large Instance (M1.XLARGE) 15 GB of memory, <strong><em>8 EC2 Compute Units</em></strong> (<strong><em>4 virtual cores with 2 EC2 Compute Units each</em></strong>), 1690 GB of local instance storage, 64-bit platform</li>
<li>High-CPU Instances &#8211; High-CPU Extra Large Instance (C1.XLARGE) 7 GB of memory, <strong><em>20 EC2 Compute Units</em></strong> (<strong><em>8 virtual cores with 2.5 EC2 Compute Units each</em></strong>), 1690 GB of local instance storage, 64-bit platform</li>
</ul>
<p>A noter, la définition de l&#8217;ECU (rien à voir avec une nouvelle-ancienne monnaie unique) qui est l&#8217;étalon AWS en termes de puissance CPU et qui correspond à :</p>
<blockquote><p>EC2 Compute Unit (ECU) – One EC2 Compute Unit (ECU) provides the equivalent CPU capacity of a 1.0-1.2 GHz 2007 Opteron or 2007 Xeon processor.</p></blockquote>
<p>Cela, disons-le, ne représente pas grand chose, mais j&#8217;y reviendrai plus tard.</p>
<p>A noter également notre étalon qui est constitué d&#8217;un portable posé sur le bureau et équipé d&#8217;un Core 2 Quad Q8400 @ 2.66 GHz x 1 (4 cores).</p>
<p><strong><em>Synthèse graphique</em></strong></p>
<div id="attachment_1650" class="wp-caption aligncenter" style="width: 793px"><img class="size-full wp-image-1650" title="CPU benchmark on EC2" src="http://decrypt.ysance.com/wp-content/uploads/2010/11/benchmark-cpu-ec2.png" alt="CPU benchmark on EC2" width="783" height="417" /><p class="wp-caption-text">CPU benchmark on EC2</p></div>
<p><strong><em>Analyse des résultats</em></strong></p>
<ul>
<li>Tout d&#8217;abord de manière macro, il est rassurant de voir que <strong>doubler le nombre de &laquo;&nbsp;virtual cores&nbsp;&raquo;</strong> (2 =&gt; 4 =&gt; 8) <strong>double les performances</strong> pour des &laquo;&nbsp;virtual cores&nbsp;&raquo; sensiblement identiques (2 virtual cores de 2 ECUs chacun =&gt; 4 virtual cores de 2 ECUs chacun =&gt; 8 virtual cores de <strong><em>2.5</em></strong> ECUs chacun). Comme le dit Sylvain : &laquo;&nbsp;Ca sent un peu le Captain Obvious, mais à bien y réfléchir, ce n&#8217;est pas une règle d&#8217;or dans l&#8217;informatique.&nbsp;&raquo;</li>
<li>Le <strong>Core 2 Quad</strong> posé sur le bureau est plus efficace à nombre de coeurs équivalent que les instances EC2 (une M1.XLARGE avec 4 coeurs de 2 ECUs chacun dans notre cas).</li>
<li>Ensuite, il est intéressant de noter que nous n&#8217;avons obtenu sur le lancement des instances que des <strong>processeurs Xeon (Intel)</strong> : E5430 @ 2.66 GHz pour les M1.LARGE et M1.XLARGE et E5410 @ 2.33 GHz pour les C1.XLARGE. Quelles auraient été les résultats si nous avions eu des Opteron (AMD) ? Il faut savoir que l&#8217;on ne choisit pas son type de processeur au lancement d&#8217;une instance. Cependant, cela fait quelques temps que je n&#8217;ai plus vu d&#8217;Opteron au lancement d&#8217;instances EC2 : il faut dire que je travaille depuis quelques temps quasi exclusivement sur la région européenne d&#8217;Amazon (par opposition aux EU, voire à l&#8217;APAC). Je n&#8217;ai pas investigué sur ce sujet beaucoup plus au delà.</li>
<li>Une <strong>anomalie </strong>est à noter concernant les tests sur les M1.XLARGE : la différence de performance sur les 3 premiers calculs (de 1 à 3 threads) entre les deux instances M1.XLARGE (4 virtual cores) : une des 2 instances a donné des performances moins bonnes sur le même bench qui a tourné deux fois sur chaque machine (les résultats ont été constants). Je n&#8217;ai pas trouvé d&#8217;explication sur cette différence entre les 2 instances.</li>
<li>Ce qui n’apparaît pas sur le graphique et que l&#8217;on constate, en se connectant directement sur les instances, via top ou htop : on voit à chaque nouveau calcul exécuté et distribué sur un thread supplémentaire un nouveau CPU passer à 100% (calcul sur 2 threads = 2 CPUs à 100%, &#8230;) et lorsque l&#8217;on atteint <em>&laquo;&nbsp;nombre de threads &gt;= nombre de CPUs de l&#8217;instance&nbsp;&raquo;</em>, on voit apparaître un pourcentage de <strong>steal </strong>sur les CPUs de l&#8217;instance.</li>
</ul>
<p><strong><em>Le % steal</em></strong><br />
Pour analyser un peu plus en détail la présence de steal, nous avons effectué un autre test de performance (merci à <a title="Profil de Yann Le Van" href="http://fr.linkedin.com/pub/yann-le-van/6/545/51B">Yann Le Van</a> pour le graphe !) en monitorant un MongoDB (toujours sur Ubuntu Lucid Lynx) que nous avons maltraité en y injectant par palier de nombreuses requêtes de géolocalisation non bornées avec des critères de recherche sur des attributs supplémentaires (Cf. <a title="Site de MongoDB, Geospatial Indexing" href="http://www.mongodb.org/display/DOCS/Geospatial+Indexing">requêtes géospatiales et indexation composée</a>). Il apparaît de nouveau clairement qu&#8217;un pourcentage non négligeable de steal progresse avec l&#8217;utilisation des CPUs de l&#8217;instance (les 8 coeurs d&#8217;une C1.XLARGE dans ce test).</p>
<div id="attachment_1665" class="wp-caption aligncenter" style="width: 788px"><img class="size-full wp-image-1665" title="CPU Benchmark MongoDB" src="http://decrypt.ysance.com/wp-content/uploads/2010/11/CPU-Benchmark-MongoDB.png" alt="CPU Benchmark MongoDB" width="778" height="390" /><p class="wp-caption-text">CPU Benchmark MongoDB</p></div>
<div id="attachment_1666" class="wp-caption aligncenter" style="width: 788px"><img class="size-full wp-image-1666" title="CPU Benchmark MongoDB - Legende" src="http://decrypt.ysance.com/wp-content/uploads/2010/11/CPU-Benchmark-MongoDB-Legend.png" alt="CPU Benchmark MongoDB - Legende" width="778" height="80" /><p class="wp-caption-text">CPU Benchmark MongoDB - Legende</p></div>
<p>Il ne s&#8217;agit pas de puissance CPU que l&#8217;on nous dérobe honteusement (ce que j&#8217;ai lu dans plusieurs articles concernant ce sujet), mais d&#8217;une puissance de calcul utilisé par l&#8217;hyperviseur qui gère la virtualisation sur laquelle repose notre OS. Ce test le prouve car le % steal progresse (ou décroit) proportionnellement à notre propre sollicitation de l&#8217;instance. Si il s&#8217;agissait de la sollicitation de &laquo;&nbsp;notre&nbsp;&raquo; puissance CPU par une autre instance d&#8217;un autre utilisateur sur le même hardware, l&#8217;évolution de la valeur du % steal ne serait pas directement reliée à notre utilisation (elle pourrait être constante par exemple).</p>
<p>La valeur du % steal n&#8217;est cependant pas négligeable et l&#8217;hyperviseur est quelque peu gourmand sur une sollicitation importante des ressources CPU de notre instance.</p>
<p><strong><em>Conclusion</em></strong><br />
Comme je disais précédemment concernant l&#8217;étalon Amazon, l&#8217;ECU, il donne une idée de la puissance comparative des instances EC2 entre elles : si vous faites fonctionner une application multi-threadée sur une instances EC2 et que vous avez besoin de plus de puissance CPU, prendre une instance 2 fois plus puissante en termes d&#8217;ECUs vous permettra d&#8217;aller 2 fois plus vite (à noter qu&#8217;en fonction du type d&#8217;instance, un coeur à une puissance de 2 à 3.25 ECUs, si on fait abstraction de la <em>Small Instance</em> et de la <em>Micro Instance</em> qui sont moins puissantes).</p>
<p>Sorti du paradigme AWS, l&#8217;ECU ne signifie plus rien car la valeur du GHz dépend de l&#8217;architecture, de la génération et du fabricant (Intel, AMD, &#8230;) du processeur. Un &laquo;&nbsp;1.0-1.2 GHz 2007 Opteron or 2007 Xeon&nbsp;&raquo; ne vous donnera pas une indication très précise sur la puissance réelle dont vous allez disposer, à part le fait qu&#8217;à GHz égal, votre ordinateur de bureau équipé de la dernière génération de processeurs vous donnera de meilleurs résultats.</p>
<p>La meilleure (et probablement la seule valable) solution afin de constituer votre choix d&#8217;instances à déployer pour votre application est de mettre en place quelques tests de performances afin de constater réellement les ressources utilisées dans le paradigme AWS et de sélectionner les instances et de choisir leur nombre (scale-out) en fonction du résultat obtenu.</p>
<p><em><strong>Frédéric FAURE</strong></em> <a title="Frédéric FAURE @Twitter" href="http://twitter.com/fredericfaure">@Twitter</a> <a title="Ysance, Simplifions les projets informatiques" href="http://www.ysance.com/">@Ysance</a></p>
]]></content:encoded>
			<wfw:commentRss>http://decrypt.ysance.com/2010/11/benchmark-cpu-sur-amazon-ec2/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
		<item>
		<title>Conception d’une infrastructure sur AWS : best practices !</title>
		<link>http://decrypt.ysance.com/2009/04/cloud-computing-conception-infrastructure-aws-best-practices/</link>
		<comments>http://decrypt.ysance.com/2009/04/cloud-computing-conception-infrastructure-aws-best-practices/#comments</comments>
		<pubDate>Fri, 10 Apr 2009 14:10:57 +0000</pubDate>
		<dc:creator>Frédéric Faure</dc:creator>
				<category><![CDATA[Cloud Computing]]></category>
		<category><![CDATA[Amazon Web Services]]></category>
		<category><![CDATA[EBS]]></category>
		<category><![CDATA[EC2]]></category>
		<category><![CDATA[HaaS]]></category>
		<category><![CDATA[S3]]></category>

		<guid isPermaLink="false">http://godard.ysance.com/~decrypt/?p=22</guid>
		<description><![CDATA[Ce post va présenter une description de la phase de conception et des choix à effectuer pour une infrastructure sur <a href="http://aws.amazon.com/" title="Site de Amazon">AWS</a> (Amazon Web Services). Je me base sur mon expérience dans le cadre de la mise en place d’une application sociale à forte sollicitation (plusieurs (>20) millions de pages vues par jour et plus de 800K DAU – Daily Active User). L’objectif de ce post est de décrire les étapes de réflexion à avoir lors de la mise en place d’une infrastructure pour une application sociale en particulier et de n’importe quelle infrastructure sur AWS en général et de donner les « tips and tricks » sur le sujet ainsi que les informations importantes à connaître et à prendre en considération lors des différentes phases. Je donnerai de temps en temps nos choix de manière plus spécifique sur le sujet et ce qui nous a conduit en ce sens, mais ce n’est pas le cœur de ce post qui reste la démarche de conception générale à suivre lors de la mise en place d’une telle infrastructure.

[...]]]></description>
			<content:encoded><![CDATA[<p>Ce post va présenter une description de la phase de conception et des choix à effectuer pour une infrastructure sur <a href="http://aws.amazon.com/" title="Site de Amazon">AWS</a> (Amazon Web Services). Je me base sur mon expérience dans le cadre de la mise en place d’une application sociale à forte sollicitation (plusieurs (&gt;20) millions de pages vues par jour et plus de 800K DAU – Daily Active User). L’objectif de ce post est de décrire les étapes de réflexion à avoir lors de la mise en place d’une infrastructure pour une application sociale en particulier et de n’importe quelle infrastructure sur AWS en général et de donner les « tips and tricks » sur le sujet ainsi que les informations importantes à connaître et à prendre en considération lors des différentes phases. Je donnerai de temps en temps nos choix de manière plus spécifique sur le sujet et ce qui nous a conduit en ce sens, mais ce n’est pas le cœur de ce post qui reste la démarche de conception générale à suivre lors de la mise en place d’une telle infrastructure.</p>
<p><strong><em>Application sociale / Cloud Computing : adéquation !<br />
</em></strong>Tout d’abord il est important de souligner l’adéquation entre les besoins, en termes d’infrastructure, des applications sociales et le Cloud Computing : le succès des applications sociales est, en effet, basé sur un phénomène de viralité et celles-ci peuvent connaître le succès du jour au lendemain. Il est alors nécessaire de rentrer dans une phase d’extension/paramétrage de l’infrastructure qui doit être rapide pour répondre à la nouvelle fréquentation explosive de l’application et ne pas prendre le risque de voir le succès brisé sur sa lancée, faute d’ infrastructure permettant la montée en charge. Le succès étant difficile à prévoir sur ce genre d’application, il n’est pas envisageable d’acheter et de conserver à disposition un grand nombre de ressources matérielles en attendant l’hypothétique succès. Ca peut fonctionner, comme ça peut ne pas fonctionner : n’investissons pas… Mais soyons prêts ! C’est tout l’intérêt du Cloud Computing !</p>
<p>Il me paraît important de préciser que quand je parle de « ne pas investir », j’entends en termes de logistique. Faire l’économie d’un investissement sur la réflexion lors de la conception de l’infrastructure et, par la suite, lors de la mise en place des composants de base qui vont supporter l’application, reviendrait à ne pas être prêt, donc à un échec… ou bien à un surcoût dans le meilleur des cas !</p>
<p><strong><em>Application sociale &amp; conception</em></strong><br />
Une brève digression à ce niveau me paraît indispensable avant d’entamer le vif du sujet sur l’infrastructure. Il est indispensable de savoir qu’un code optimisé et réfléchi permettra d’économiser beaucoup d’argent et de complexité de l’infrastructure par la suite. Pas des choses compliquées, mais juste un minimum de réflexion :</p>
<p style="padding-left: 30px;">• Quelles sont les informations que nous mettrons à disposition dans des caches et celles accédées en base ?</p>
<p style="padding-left: 30px;">• Quelles sont les informations volatiles (en générale à destination du cache) ?</p>
<p style="padding-left: 30px;">• Comment gérer mes connexions aux ressources pour les maintenir un temps minimal : gestion d’un pool de connexions afin d’optimiser les temps d’accès, respect de la cinématique connexion/récupération des données/fermeture de la connexion/traitement des informations récupérées afin de ne pas maintenir de connexions inutiles, groupage des requêtes, …</p>
<p style="padding-left: 30px;">• Gérer un code modulaire afin de pouvoir le faire évoluer rapidement en fonction notamment des temps de réponse induits par telle ou telle fonctionnalité en fonction de la montée en charge,</p>
<p style="padding-left: 30px;">• Séparation de l’IHM et du traitement, séparation des fonctionnalité de l’application et des APIs du réseau social, séparation des ressources et du code… On ne sait jamais ! Si ça fonctionne bien, il serait dommage de se priver d’un portage sur une autre réseau social parce que l’application est mal conçue au niveau découpage.</p>
<p>De part mon expérience, les principales optimisations, en termes de temps de réponse, que l’on peut constater sur une application à forte sollicitation sont réalisées au niveau du code de l’application ! Sur une application présentant des problèmes de conception, il apparaît au fur et à mesure de l’augmentation des capacités de l’infrastructure que le bénéfice retiré sera moindre. On peut rapprocher cela d’une courbe logarithmique : au début l’augmentation des capacités de l’infrastructure compensera les problème liés à la conception de l’application, mais arrivé à un certain seuil le bénéfice en termes de résistance à la charge sera faible par rapport aux investissements sur l’infrastructure.</p>
<p>Ce point est à méditer fortement…</p>
<p><strong><em>Il était une fois…</em></strong><br />
RDV sur le site <a href="http://aws.amazon.com/" title="Site de Amazon">http://aws.amazon.com/</a> , préparez votre numéro de carte bleue, enregistrez-vous… Bravo ! Vous venez d’acquérir votre passe pour les nuages composé d’une « access key » et d’une « secret key ».</p>
<p>Le Cloud Computing AWS est composé comme son nom l’indique de… services web ! Pour y accéder, rien de plus simple : soit vous utiliser des APIs en ligne de commande, pratique pour l’automatisation des tâches à venir par la suite mais rebutant pour une première expérience, soit vous optez pour Elasticfox (Firefox Extension for Amazon EC2) proposant une IHM permettant d’accéder aux fonctionnalités des AWS et d’avoir un tableau de bord de vos instances, volumes, snapshots, groupes de sécurité, … Vous pouvez télécharger la « console élastique » sur <a href="http://developer.amazonwebservices.com/connect/entry.jspa?externalID=609" title="Site de Amazon, section Développeurs">http://developer.amazonwebservices.com/connect/entry.jspa?externalID=609</a> .</p>
<p><strong><em>Une infrastructure à part entière</em></strong><br />
La premier piège à éviter est de considérer votre infrastructure comme une sandbox dans laquelle vous pouvez un peu tout tester et puis vous dire que vous pourrez revenir en arrière par la suite, un peu plus tard, si vos choix ne vous satisfont pas quand votre application commencera à fonctionner… Non ! Il s’agit d’une véritable infrastructure où vous devrez faire des choix, faire preuve de réflexion, anticiper,… Le Cloud Computing vous décharge de nombre de problèmes logistiques, vous permet d’être réactif, de disposer de ressources quasi illimitées, de réduire vos coûts, … Mais vous demandera la même réflexion que pour toute infrastructure.</p>
<p><strong><em>La prise en main</em></strong><br />
La première étape de la mise en place d’une infrastructure sur AWS consiste en une prise en main. Une journée de prise en main fera l’affaire, c’est pas compliqué !</p>
<p><em><span style="text-decoration: underline;">Documentation</span></em><br />
Il est important dans un premier temps de consulter le site d’Amazon et de prendre connaissances des différentes briques/options à votre disposition, de lire la documentation en quelque sorte ! C’est rapide mais indispensable…</p>
<p><em><span style="text-decoration: underline;">Tests</span></em><br />
Vous pouvez ensuite effectuer des tests et vous mettre à l’aise en démarrant des instances EC2, en y attachant des volumes EBS, … Rassurez-vous ca ne coûte pas grand-chose !</p>
<p><em><span style="text-decoration: underline;">RAZ</span></em><br />
Vous êtes à l’aise ? Supprimez tout ce que vous avez fait et passez à la phase de conception. Supprimez tout ? Oui ! Premièrement, parce que dépenser de l’argent inutilement, même peu, en laissant des instances fonctionner, c’est pas terrible et surtout parce que l’étape de conception va vous amener à faire des choix fondateurs… Donc supprimez tout !</p>
<p><strong><em>Réflexion macro…</em></strong><br />
La seconde étape est de décider :</p>
<p style="padding-left: 30px;">• de leur répartition géographique,</p>
<p style="padding-left: 30px;">• du niveau de disponibilité que vous souhaitez accorder à vos services en fonction de leur criticité.</p>
<p><em><span style="text-decoration: underline;">Région et répartition géographique<br />
</span></em>Il faut tout d’abord sélectionner une région, à savoir « us-east-1 » pour les Etats-Unis (service web endpoint : « us-east-1.ec2.amazonaws.com » ou « ec2.amazonaws.com » &#8211; pour retro compatibilité) et « eu-west-1 » pour l’Europe (service web endpoint : « eu-west-1.ec2.amazonaws.com »). Il faut savoir que chaque région est totalement isolée. Il faut donc effectuer un choix en fonction de sa localisation ou plus exactement en fonction de la localisation des utilisateurs (humains ou systèmes) potentiels. Lors de la mise en place de notre application sociale, la région européenne était en beta, nous avons donc sélectionné la région « us-east-1 » pour notre environnement de production, même si la cible majeure de nos utilisateurs était européenne.</p>
<p><em><span style="text-decoration: underline;">Zone d’accessibilité et disponibilité des services<br />
</span></em>Il faut ensuite choisir si il est nécessaire de mettre en place un système de résistance à la panne (fault tolerance) via les zones d’accessibilité à l’intérieur d’une région. Les zones d’accessibilités sont distinctes et isolées les unes des autres au niveau réseau. Il faut savoir que les ressources AWS n’ont pas la même portée : par exemple une instance EC2 et un volume EBS n’ont une portée que sur la zone d’accessibilité et doivent être dans la même bien évidemment pour être attachés. S3, en revanche, à une portée sur la région et permet d’échanger des données et de générer des EBS à partir de snapshots dans n’importe quelle zone d’accessibilité d’une région donnée. Un doublement du service dans 2 zones différentes doit être chapoté par une « Elastic IP » qu’il est possible de mapper à tel ou tel point d’entrée. Il est à noter qu’une « Elastic IP » peut être mappée sur 2 instances d’une même zone, bien sûr, afin de parer à la défaillance d’une instance (en point d’entrée) plutôt que d’une zone complète. Dans le cas de notre application, nous sommes restés dans une seule zone d’accessibilité, sans « Elastic IP ». La criticité d’une application sociale est moindre et la rupture de service acceptable (dans une certaine limite bien sûr). Nous avons en revanche mis en place une architecture solide dans la zone d’accessibilité sélectionnée.</p>
<p>Ci-dessous un schéma tiré du site d’Amazon représentant les régions et zones d’accessibilité.</p>
<div class="mceTemp">
<div id="attachment_38" class="wp-caption alignnone" style="width: 560px"><img class="size-full wp-image-38" title="AWS : Regions et Zones" src="http://decrypt.ysance.com/wp-content/uploads/2009/04/locality2.png" alt="AWS : Regions et Zones" width="550" height="325" /><p class="wp-caption-text">AWS : Regions et Zones</p></div>
</div>
<div class="mceTemp">Il y a actuellement 3 zones d’accessibilité pour la région des Etats Unis et 2 pour l’Europe. Les régions et zones disponibles, ainsi que leur statut (beta, …), sont à vérifier sur le site d’Amazon avant de mettre en place une infrastructure afin de faire le bon choix.</div>
<p>Le tableau ci-dessous résume la portée (scope) des ressources pour Amazon EC2 (globale, régionale ou zone d’accessibilité) :</p>
<p style="text-align: left;"><span style="text-decoration: underline;"><span style="color: #339966;"><strong>Ressource</strong> </span></span>- <strong><em><span style="text-decoration: underline;"><span style="color: #3366ff;">Portée</span></span></em></strong><br />
<span style="color: #339966;"><strong>Compte AWS</strong> </span>- <strong><em><span style="color: #3366ff;">globale</span></em></strong><br />
<strong><span style="color: #339966;">Système d’identifiants EC2 (dont AMI ID, Instance ID, EBS Volume ID, EBS Snapshot ID, …)</span></strong> &#8211; <strong><em><span style="color: #3366ff;">régionale</span></em></strong><br />
<strong><span style="color: #339966;">Instances EC2</span></strong> &#8211; <strong><em><span style="color: #3366ff;">zone d’accessibilité</span></em></strong><br />
<strong><span style="color: #339966;">AMIs</span></strong> &#8211; <strong><em><span style="color: #3366ff;">régionale</span></em></strong><br />
<strong><span style="color: #339966;">Groupe de sécurité</span></strong> &#8211; <strong><em><span style="color: #3366ff;">régionale</span></em></strong><br />
<strong><span style="color: #339966;">Clés SSH (Key Pairs)</span></strong> &#8211; <strong><em><span style="color: #3366ff;">régionale</span></em></strong><br />
<strong><span style="color: #339966;">Elastic IP</span></strong> &#8211; <strong><em><span style="color: #3366ff;">régionale</span></em></strong><br />
<strong><span style="color: #339966;">Volumes EBS</span></strong> &#8211; <strong><em><span style="color: #3366ff;">zone d’accessibilité</span></em></strong><br />
<strong><span style="color: #339966;">Snapshot EBS (stockage sur S3)</span></strong> &#8211; <strong><em><span style="color: #3366ff;">régionale</span></em></strong></p>
<p> <strong><em>…Et jeu de Légos !<br />
</em></strong>Le choix des briques est fonction de l’application, dans notre cas nous avons utilisé les composants décrits ci-dessous.</p>
<p><em><span style="text-decoration: underline;">EC2 : instances virtuelles</span></em><br />
Il est à noter que les informations sur les instances ne sont pas sauvegardées et sont perdues en cas d’arrêt de l’instance, il ne doit donc pas y avoir de données applicatives stockées dessus ou bien elles doivent être backupées régulièrement. Les instance EC2 sont attachées à une zone d’accessibilité. Il est à noter qu’il est possible sur des instances EC2 de rencontrer des « hardware failures ». Cela nous est arrivé 3 fois sur un parc d’une trentaine d’instances EC2 en l’espace de 5 mois. D’où l’importance de ne pas stocker de données applicatives ou de les backuper, de prévoir une remontée rapide des instances (utilisation d’un gestionnaire de configuration centralisé type « Puppet », utilisation d’AMIs, …) et d’utiliser les composants mis à disposition par Amazon comme les volumes EBS ou bien S3 pour le stockage fiable de données critiques.</p>
<p><em><span style="text-decoration: underline;">EBS : volumes de stockage haute performance pour EC2</span></em><br />
Les EBS permettent de stocker les données de notre base de données afin d’offrir persistance (contrairement à EC2) et une bien meilleur gestion des i/o nécessaire pour les nombreuses lectures/écritures sur disque. Un EBS est attaché à une unique instance EC2, il est possible d’attacher X EBS à une instance EC2. Les volumes sont alors perçus au niveau des instances EC2 comme des « devices » qu’il est alors possible de formater et de monter. L’EBS peut être détaché et rattaché à une autre instance EC2 à chaud. Les volumes EBS sont attachés à une zone d’accessibilité, il est alors possible de les attacher à des instances EC2 appartenant à la même zone. Concernant la persistance, et plus exactement la durabilité, les données sur EBS sont répliquées sur différents serveurs dans une même zone d’accessibilité, ce qui permet de prévenir la perte de données. La perte est toujours possible, mais 10 fois moins qu’avec une gestion de disque dur classique selon Amazon. Il est à noter que du mirroring entre EBS dans une même zone d’accessibilité ne va pas servir à grand-chose en termes d’amélioration de la durabilité des données. Dans notre cas, nous avons créé des volumes de 20 Go pour stocker les données de nos bases MySQL, mais il est possible d’en créer de 1 Go à 1 To.</p>
<p><em><span style="text-decoration: underline;">S3 : stockage persistant de données inter zones</span></em><br />
S3 peut être utilisé afin de créer des snapshots d’EBS qui seront répliqués et accessibles entre plusieurs zones d’accessibilités, offrant une durabilité accrue et surtout la possibilité de recréer des volumes EBS à partir de ces snapshots sur différentes zones d’accessibilité, S3 ayant un scope inter zones dans une région donnée. S3 permet également de stocker des données et de les rendre disponibles ou non sur le Web via des ACL. Nous utilisons S3, dans notre cas, afin de faire des backups (donc ACL privée et uniquement accessibles par le(s) détenteur(s) de la clé de sécurité) des données des bases (MySQL), mais utilisons un dump standard que nous poussons ensuite sur S3 via un client (s3cmd). Nous préférons cela car ce fonctionnement nous permet d’effectuer si nécessaire un dump « à chaud » sans avoir à locker les tables (même si locker les tables est plus propre et effectué régulièrement lors de la maintenance nocturne) ou plus exactement à freezer l’EBS et préférons en cas de corruption (improbable) de la sauvegarde avoir à traiter avec un dump standard plus simple à « corriger ». Nous stockons également des logs importants et les configurations importantes de nos EC2. Il est à noter que dans le cas de dump, même sans lock, sur des sites très sollicités, cela n’est possible que sur les bases les plus légères et les moins sollicités. Les éléments les plus sollicités ne peuvent être backupés que durant un phase de fermeture du site. Nous utilisons également S3, avec une ACL publique cette fois-ci, afin de mettre à disposition de notre CDN les données statiques (images, bannières de publicité, …). Des clients graphiques simples (comme « Amazon S3 Firefox Organizer » (S3Fox), une extension Firefox sur le modèle de notre « console élastique ») permettent d’interagir avec S3 afin de rendre accessible les buckets (espace de stockage sur S3) aux responsables du contenu du site, par exemple.</p>
<p>Il est à noter que concernant les EC2 et les EBS qu’une limite de 20 instances de chaque par compte utilisateur est positionnée au départ. Ces limites peuvent être augmentées indépendamment l’une de l’autre à 40, puis à 100, … sur simple demande à un contact. La demande est prise en compte dans les 24 heures, prévoyez donc cela un peu à l’avance.</p>
<p>De plus, une offre de support est disponible en version « Silver » ou « Gold » afin de vous accompagner et répondre à vos questions. Vous pouvez consulter <a href="http://aws.amazon.com/premiumsupport/" title="Site de Amazon, rubrique Support">http://aws.amazon.com/premiumsupport/</a> pour plus d’informations.</p>
<p><strong><em>AMIs</em></strong><br />
Il faut ensuite sélectionner l’AMI, le système virtuel à installer sur le matériel. Il est à noter qu’en fonction de la configuration matérielle choisie (m1.small, m1.large, m1.xlarge, c1.medium ou c1.xlarge), il y a une architecture sous-jacente (32 ou 64 bits). On ne peut donc pas poser n’importe quel système sur n’importe quelle architecture… Et les services AWS le gèrent bien ! Heureusement !</p>
<p>Il est également possible d’enregistrer vos propres AMIs que vous aurez configurées avec soin afin de les utiliser.</p>
<p>Nous avons opté pour une AMI « ubuntu-8.10-intrepid-base-64 » proposée dans la liste des AMIs disponibles.</p>
<p><strong><em>Logiciels</em></strong><br />
Après avoir sélectionné le système, vient la sélection des logiciels. Cette section dépend complètement de l’application que vous allez mettre en place, cependant, sur des applications nécessitant de la scalabilité, on retrouve des axes majeurs et des problématiques récurrentes.</p>
<p>Tout d’abord un balancer Soft (HaProxy, …) distribuant les requêtes sur plusieurs frontaux Web (Apache, lighttpd, …) qui exécutent les traitements dans le cas de langages comme PHP (en CGI ou en mod) ou bien qui eux même redirigent les requête vers des serveurs applicatifs (Tomcat, Jetty, …) exécutants des traitements JAVA par exemple. Il serait possible de faire un post entier rien que sur les optimisations qu’il est possible d’apporter à ces niveaux, sur la gestion des processus et des threads, sur la gestion des piles de connexions, … Nous avons dans notre cas opté pour un HaProxy qui distribue les requêtes sur plusieurs Apache en « mod_php ».</p>
<p>Ensuite vient la base, avec le choix de la base en fonction des besoins (PostgreSQL, MySQL, …) : nous avons opté pour MySQL. A partir de là, les choix clés en termes de stockage : quel stockage ? InnoDB ou MyISAM ? Pour les tables essentiellement accédées en lecture ou nécessitant de la recherche « full text » : MyISAM ! Pour celles accédées en écriture : InnoDB (avec son système de row locking) ! Un mixte des 2 est possible en fonction des données (attention en revanche, les jointures inter stockages sont déconseillées) et pourquoi pas de la réplication sur les données vitales et fortement accédées avec un master InnoDB pour l’écriture et un slave MyISAM pour la lecture ? Non, il y a beaucoup trop d’accès et la réplication du master vers le slave ne sera pas encore effective pour la phase de lecture de certaines données, on optera pour 2 InnoDB avec un seul accédé en lecture/écriture, cela nous permettant lors d’un problème sur le master de le remplacer par le slave qui sera également performant en écriture (en MyISAM, les écritures saturent la base…). On limite les jointures pour bénéficier des avantages du système MySQL. Tout ça sans parler du paramétrage de chaque mode de stockage (InnoDBBufferPool, …) en fonction des opérations et de la volumétrie du site… Plus la volumétrie sera importante, plus le positionnement des index sera vital ! Nous avons également fait du sharding de données (découpage horizontal) via un modulo afin de répartir les données ne nécessitant pas de requêtes ensemblistes sur plusieurs serveurs et permettre de meilleurs temps de réponse et la possibilité d’une meilleure montée en charge.</p>
<p>Une couche de cache gérée par Memcached pour soulager les bases des données les plus souvent accédées…</p>
<p>Et voilà ! Un bref aperçu de la partie qui nous a probablement pris le plus de temps et qu’il est bien souvent nécessaire d’optimiser, une fois les grands axes retenus, au fil de la montée en charge de l’application.</p>
<p><strong><em>Security Groups</em></strong><br />
Une fois les logiciels sélectionnés, il faut mettre en place les groupes de sécurité AWS. Ces groupes vont permettre de limiter les interactions des machines entre elles mais aussi de restreindre les accès de l’extérieur. Un groupe de sécurité se paramètre « tout simplement » comme un firewall avec le protocole utilisé (udp, tcp, icmp, …), le port ou la plage de ports (1 à 65535) ouverts pour les ayants-droits définis soit par un couple « identifiant de compte AWS :groupe », soit par une adresse IP d’un réseau ou d’un host. Cela s’effectue au niveau de la console « Elastic Fox », comme beaucoup de paramétrages.</p>
<p>Exemples :</p>
<p style="padding-left: 30px;">• le groupe « Load-Balancer » octroiera pour tcp sur le port 80 (HTTP) les IPs du réseau extérieur 0.0.0.0/0 ,</p>
<p style="padding-left: 30px;">• le groupe « Web » octroiera pour tcp sur le port 80 (HTTP) les machines de mon compte AWS appartenant au groupe « Load-Balancer »,</p>
<p style="padding-left: 30px;">• le groupe « SQL » octroiera pour tcp sur le port 3306 (MySQL) les machines de mon compte AWS appartenant au groupe « Web »,</p>
<p style="padding-left: 30px;">• …</p>
<p style="padding-left: 30px;">• tous les groupes octroieront pour tcp sur le port 22 (SSH) l’ IP extérieure de l’administrateur de l’infrastructure AWS x.x.x.x/32 ,</p>
<p style="padding-left: 30px;">• tous les groupes octroieront pour udp sur le port 161 (SNMP) les machines de mon compte AWS appartenant au groupe « Monitoring ».</p>
<p>Attention : une fois un EC2 démarré dans un groupe, il n’est pas possible d’en changer, c’est pour cela qu’il est important d’avoir défini les groupes au préalable. C’est de plus un très bon exercice de réflexion afin de concevoir l’infrastructure.</p>
<p>De plus, une même instance peut appartenir à plusieurs groupes, par exemple un EC2 hébergeant un MySQL et un Memcached appartiendra au groupe définissant les règles d’accès aux serveurs MySQL et à celui définissant les règles d’accès aux serveurs Memcached. Cela permet une structuration et une granularité/découpage des règles par fonctionnalités.</p>
<p>Les 2 dernières règles précédentes pourront donc s’écrire :</p>
<p style="padding-left: 30px;">• toutes les machines appartiendront à un groupe supplémentaire qui octroiera pour tcp sur le port 22 (SSH) l’ IP extérieure de l’administrateur de l’infrastructure AWS x.x.x.x/32 ,</p>
<p style="padding-left: 30px;">• toutes les machines appartiendront à un groupe supplémentaire qui octroiera pour udp sur le port 161 (SNMP) les machines de mon compte AWS appartenant au groupe « Monitoring ».</p>
<p>Comme précisé, cela permet de découper la sécurité par fonctionnalité.</p>
<p>Il est à noter également que les modifications des règles de sécurité d’un groupe donné sont instantanées.</p>
<p><strong><em>Ressources et pricing<br />
</em></strong>L’étape suivante est de définir les ressources dont nous aurons besoin pour l’application en termes de puissance et de stockage. Etablir une prévision de l’utilisation des ressources est indispensable afin d’avoir une vision claire des coûts sur le mois, les coûts horaires/trafic ne permettant pas cette vue d’ensemble. Il faut prendre en compte le coût fixe (facilement prédictible) des ressources et également les coût associés au trafic réseau en effectuant une prévision qu’il sera possible d’ajuster en fonction de l’évolution de la fréquentation sur le site. Au final, une bonne feuille Excel résumera pleinement la situation sur le mois et à l’année.</p>
<p>Concernant la puissance (RAM, CPU, …), il est en effet important de prendre ce dont nous avons besoin et de ne pas surestimer les besoins, en effet le prix de chaque configuration dépendant des ressources associées. De plus sur ce genre d’infrastructure, il faut réfléchir en termes de scalabilité et donc de distribuer la charge sur X machines plus réduite que sur une trop importante afin d’avoir la possibilité de lisser au mieux la charge.</p>
<p>Je n’aborderai pas ici le sujet de la conception d’applications « complètement » distribuées, sujet qui n’est pas trivial, loin de là. Il est très peu commun (comprendre rare ;o)) de voir des applications distribuées à tous les niveaux permettant par simple multiplication du service (et des éléments sous-jacents) d’augmenter les capacités de réponse, bien souvent la source de données est un goulet d’étranglement non distribué. La distribution est à mon avis la clé de ce genre d’application mais engendre bien souvent un coût de conception bien trop important. Disons le autrement : nous n’avons pas pris l’habitude de réfléchir naturellement dans ce sens et n’avons pas de modèles/standards évidents et donc le coût de réflexion associé augmente…</p>
<p><strong><em>Tadaaa !</em></strong><br />
Il ne vous reste plus qu’à lancer les instances EC2 à partir de la console « Elastic Fox » en sélectionnant l’AMI retenue (la vôtre ou une « standard »), en lui attribuant une configuration (m1.small, m1.large, m1.xlarge, c1.medium ou c1.xlarge), une clé de sécurité, une zone d’accessibilité et finalement un ou plusieurs groupes de sécurité. Il reste à récupérer 15 secondes plus tard le nom DNS public de la machine et à vous y connecter via un client SSH. Il vous sera également possible de démarrer un volume EBS en précisant sa taille en Go, sa zone d’accessibilité et éventuellement le snapshot à partir duquel il va être généré. Reste ensuite à associer le volume à une instance EC2 en précisant le nom du device qu’il prendra (par exemple « /dev/sdd »). Et voilà, c’est parti !</p>
<p>Il est très important de noter que chaque machine possède un nom DNS privé qu’il est indispensable d’utiliser pour une communication entre les machines car le trafic interne entre les EC2 n’est pas facturé contrairement au trafic entrant via le nom DNS public ou bien une « Elastic IP » ! Une erreur de configuration pourrait avoir comme conséquence une hausse des coûts inutile.</p>
<p><strong><em>Conclusion</em></strong><br />
La conception d’une infrastructure sur AWS demande autant de réflexion que n’importe quelle infrastructure pour la mener à bien. Il faut bien comprendre les spécificités des services Amazon et plus généralement sa conception pour les utiliser au mieux. Cependant, une fois appréhendés, les AWS permettent de monter une infrastructure modulaire et performante en un minimum de temps puisque sortie des considérations logistiques, dynamique et réactive de part les possibilités en termes de scalabilité et pour des coûts correspondant à vos réels besoins.</p>
<p>Il reste à noter qu’il faut également suivre l’évolution des services Amazon qui proposent au fur et à mesure de nouvelles fonctionnalités intéressantes (voir par exemple <a href="http://aws.amazon.com/contact-us/new-features-for-amazon-ec2/" title="Site de Amazon, rubrique Nouvelles Fonctionnalités">http://aws.amazon.com/contact-us/new-features-for-amazon-ec2/</a>) qui suivent la cinématique standard de diffusion privée, diffusion publique en beta puis diffusion publique. Il est nécessaire de se tenir informé afin d’avoir toujours une vue exhaustive des composants à disposition et d’utiliser au mieux les briques mises en place en standard.</p>
<p>Il reste à présent la mise en place d’une telle infrastructure et il convient pour un service hébergé de la sorte de mettre en place un certains nombres de composants en place afin d’automatiser et d’homogénéiser l’infrastructure. Cela fera l’objet de mon prochain post.</p>
<p class="MsoNormal" style="margin: 0cm 0cm 0pt;"><em><strong>Frédéric FAURE</strong></em></p>
<p class="MsoNormal" style="margin: 0cm 0cm 0pt;"> </p>
]]></content:encoded>
			<wfw:commentRss>http://decrypt.ysance.com/2009/04/cloud-computing-conception-infrastructure-aws-best-practices/feed/</wfw:commentRss>
		<slash:comments>12</slash:comments>
		</item>
	</channel>
</rss>

