<?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>El blog de LandM &#187; Mario</title>
	<atom:link href="http://blog.landm.net/author/mario/feed/" rel="self" type="application/rss+xml" />
	<link>http://blog.landm.net</link>
	<description>System Administrators and IT experts Blog</description>
	<lastBuildDate>Thu, 17 Jun 2010 08:34:05 +0000</lastBuildDate>
	<generator>http://wordpress.org/?v=abc</generator>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
			<item>
		<title>Creating a swap file under Linux</title>
		<link>http://blog.landm.net/2008/12/creating-a-swap-file-under-linux/</link>
		<comments>http://blog.landm.net/2008/12/creating-a-swap-file-under-linux/#comments</comments>
		<pubDate>Thu, 25 Dec 2008 16:49:32 +0000</pubDate>
		<dc:creator>Mario</dc:creator>
				<category><![CDATA[System]]></category>
		<category><![CDATA[swap]]></category>
		<category><![CDATA[swapfile]]></category>

		<guid isPermaLink="false">http://blog.landm.net/?p=132</guid>
		<description><![CDATA[Last week Lucas my co-worker Lucas noticed that in one of our servers didn’t have a swap partition, until now things were going ok because server didn’t have much RAM usage, but now servers is getting more traffic each day and sometimes free ram gets extremely low.
In a normal situation the process here should be, [...]]]></description>
			<content:encoded><![CDATA[<p>Last week Lucas my co-worker Lucas noticed that in one of our servers didn’t have a swap partition, until now things were going ok because server didn’t have much RAM usage, but now servers is getting more traffic each day and sometimes free ram gets extremely low.</p>
<p>In a normal situation the process here should be, reboot the server, and using gparted or similar create a small amount of free space and allocate that as a swap partition. Fortunately this not needed nowadays, since Kernel 2.6 swap file performance has increased dramatically so the possible benefits from having a dedicated swap partition against  a swap file are so small that in some situations it is preferable to have a swap file in case you wan’t to increase / decrease it’s size.</p>
<p>The process for building this kind of swap files is very simple:</p>
<p><em># dd if=/dev/zero of=/home/swap bs=1M count=1024</em></p>
<p>Replacing 1024 with the number of megabytes you want will change the swap file size.</p>
<p>Now that we have the size we want on disk we can prepare it for usage as a swap partition:</p>
<p><em># mkswap /home/swap</em></p>
<p>Now the swap file has being built you must introduce the following line in /etc/fstab file so this partition get’s mounted once the system is rebooted:</p>
<p><em>/home/swap       swap            swap    defaults 0       0</em></p>
<p>And finally to test the swap file you should type, which would activate all the partitions marked as “swap” in /etc/fstab</p>
<p><em># swapon –a</em></p>
<p>Now finally we can check that the swap partition has being activated:<br />
<em><br />
# free -m<br />
total       used       free     shared    buffers     cached<br />
Mem:          2028       1719        308          0        132       1119<br />
-/+ buffers/cache:        468       1559<br />
Swap:         1023          0       1023<br />
</em></p>
<p>Finally there are two useful commands you should be aware if you are playing around with swap files:</p>
<p><em># swapon | swapoff <swapfile></em></p>
<p>This commands activate and deactivate the usage of swap file.</p>
]]></content:encoded>
			<wfw:commentRss>http://blog.landm.net/2008/12/creating-a-swap-file-under-linux/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Exchange 2007: Configuracion de Whitelists</title>
		<link>http://blog.landm.net/2008/08/exchange-2007-whitelists/</link>
		<comments>http://blog.landm.net/2008/08/exchange-2007-whitelists/#comments</comments>
		<pubDate>Thu, 07 Aug 2008 11:51:20 +0000</pubDate>
		<dc:creator>Mario</dc:creator>
				<category><![CDATA[Exchange Server]]></category>
		<category><![CDATA[Servidores Correo]]></category>
		<category><![CDATA[exchange 2007]]></category>
		<category><![CDATA[whitelist]]></category>

		<guid isPermaLink="false">http://blog.landm.net/?p=81</guid>
		<description><![CDATA[A menudo cuando gestionamos servidores Exchange 2007, nos encontramos ante la situación de que Exchange 2007 se niega a recibir emails de un determinado origen (ya sea dominio o una cuenta especifica) por que no pasa sus políticas de filtrado de emails.
En los casos en el que el origen es confiable, podemos específicamente indicarle a [...]]]></description>
			<content:encoded><![CDATA[<p>A menudo cuando gestionamos servidores Exchange 2007, nos encontramos ante la situación de que Exchange 2007 se niega a recibir emails de un determinado origen (ya sea dominio o una cuenta especifica) por que no pasa sus políticas de filtrado de emails.</p>
<p>En los casos en el que el origen es confiable, podemos específicamente indicarle a Exchange 2007 que queremos que acepte email de un determinado origen de forma incondicional. Para poder llevar a cabo esto prácticamente todos los MTA soportan una funcionalidad que se conoce como whitelists.</p>
<p>En Exchange 2007, una de las formas de acceder a la configuración de las Whitelists es a traves del PowerShell que se instala automáticamente cuando instalamos Exchange 2007. Una vez abierta la shell la gestión de las whitelist se realiza con los comando <code>set-ContentFilterConfig</code> y <code>get-ContentFilterConfig</code></p>
<p>Para añadir un determinado email origen a la whitelist:</p>
<p><code>set-ContentFilterConfig -BypassedSenders usuario@dominio.com</code></p>
<p>En el caso de que queramos crear una whitelist para un dominio origen completo:</p>
<p><code>set-ContentFilterConfig -BypassedSenderDomains dominio.com</code></p>
<p>Además de crear whitelists para dominios origen, podemos hacerlo de la forma contraria, si queremos que todo lo que vaya a un determinado usuario de un dominio que alojamos nosotros podemos hacer whitelists en destino de la siguiente forma:</p>
<p><code>set-ContentFilterConfig -BypassedRecipients abc@tudominio.com,info@tudominio.com</code></p>
<p>Como podemos observar aquí la diferencia es que utilizamos el comando BypassedRecipients en vez de BypassedSenders.</p>
<p>La consulta del estado de las whitelists es muy sencilla y se realiza con el comando <code>get-ContentFilterConfig</code> esto nos devolverá el estado actual de la configuración de los filtros de una forma bastante detallada.</p>
<p>Para hacer más cómoda la introducción de múltiples dominios, el comando <code>set-ContentFilterConfig</code> acepta atributos con múltiples valores, esto nos permite solucionar el hecho de que este comando sobrescribe siempre el valor que hayamos metido en la whitelist. Por lo tanto la forma de introducir un número de emails y/o dominios es separarlos con comas.</p>
<p><code>Set-ContentFilterConfig -BypassedSenderDomains "dominio1.com","dominio2.com","dominio3.com"</code></p>
<p>Para una gestión más eficiente de las listas, existe la posibilidad de introducir y eliminar elementos de forma individual de las listas sin que se vean afectados el resto de los elementos de la lista, para ello podemos utilizar un poco de scripting de PowerShell</p>
<p>Si quisiéramos añadir un dominio sin tocar el resto de lo que tengamos en la whitelist:</p>
<p><code>$foo=Get-ContentFilterConfig<br />
$foo.BypassedSenderDomains +="undominio.com"<br />
$foo | Set-ContentFilterConfig</code></p>
<p>Análogamente, para eliminar un dominio de dicha lista, podemos utilizar los  siguientes comandos:</p>
<p><code>$foo=Get-ContentFilterConfig<br />
$foo.BypassedSenderDomains -="undominio.com"<br />
$foo | Set-ContentFilterConfig</code></p>
<p>Hasta aquí, es todo lo que necesitamos saber para hacer una gestión de Whitelists en Exchange 2007.</p>
]]></content:encoded>
			<wfw:commentRss>http://blog.landm.net/2008/08/exchange-2007-whitelists/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>memcache: Cacheando el contenido dinámico</title>
		<link>http://blog.landm.net/2008/08/memcache-cacheando-el-contenido-dinamico/</link>
		<comments>http://blog.landm.net/2008/08/memcache-cacheando-el-contenido-dinamico/#comments</comments>
		<pubDate>Thu, 07 Aug 2008 08:18:34 +0000</pubDate>
		<dc:creator>Mario</dc:creator>
				<category><![CDATA[Servidores Web]]></category>
		<category><![CDATA[memcached]]></category>
		<category><![CDATA[cacheo contenido dinamico]]></category>
		<category><![CDATA[memcache]]></category>
		<category><![CDATA[optimizacion]]></category>

		<guid isPermaLink="false">http://blog.landm.net/?p=67</guid>
		<description><![CDATA[En toda infraestructura más o menos grande, hay un punto de inflexión importante y es el momento en el que los frontales no son capaces de dar más resultados por segundo. Las causas por las que esto ocurren pueden ser de diversa índole, pero suelen estar muy relacionadas con la naturaleza del contenido Web. Últimamente [...]]]></description>
			<content:encoded><![CDATA[<p>En toda infraestructura más o menos grande, hay un punto de inflexión importante y es el momento en el que los frontales no son capaces de dar más resultados por segundo. Las causas por las que esto ocurren pueden ser de diversa índole, pero suelen estar muy relacionadas con la naturaleza del contenido Web. Últimamente las tendencias es a que todo sea dinámico y generado “on the fly” apoyándose para todo en la base de datos y eso crea un cuello de botella importante en el momento en el que los frontales tienen que interactuar con la BD.</p>
<p><strong>Posibles soluciones para esto hay varias:</strong></p>
<ul>
<li><strong>Estatificar el contenido:</strong> Pongamos por caso una aplicación típica cuyo contenido es dinámico: Fotolog, LiveJournal, etc. Este tipo de sitios Web podrían aumentar el hitrate notablemente estatificando el contenido de sus páginas. Si lo pensamos, realmente estas páginas solo se modifican en el momento en el que se añaden comentarios, fotos o similar, no sería excesivamente difícil estatificar todo el contenido y regenerarlo cuando haya modificaciones. Las ventajas son muchas. Aumentamos el hitrate de las maquinas ya que únicamente sirven contenido estático y disminuimos drásticamente los posibles fallos de seguridad que puedan surgir, al no haber aplicación, no hay fallo que buscar. En un post anterior ya comentamos posibles usos de proxy http para segregar contenido. Como en toda solución, tenía que tener algo negativo. Hay que modificar la aplicación para que genere contenido de naturaleza estática, esto normalmente a no ser que estemos desarrollando nosotros mismos la aplicación es realmente complicado ya que estatificar todo el contenido implicaría reescribir y convertir una aplicación que fue pensada como dinámica en un backend de generación de contenido estático.</li>
</ul>
<ul>
<li><strong>Cacheo dinámico de contenido</strong>: Esta es la solución de moda a día de hoy. Surgió como solución intermedia entre estatificar el contenido y sacarlo directamente de base de datos, la solución pasa por tener un numero de maquinas dedicadas que almacenan en RAM a modo de hash los resultados de las consultas a base de datos. Con esto conseguimos que, si esa consulta que íbamos a lanzar a la BD ha sido pedida recientemente, la recogemos directamente desde la memoria RAM del cache, y la devolvemos directamente. En caso de que no estuviera, la pedimos a la BD y la almacenamos en el cache, usando como “key” del hash la consulta a la base de datos serializada. De esta forma el rendimiento aumenta muchísimo al disminuir notablemente la interacción con la base de datos, con todo lo que eso implica (interfaz con la BD, consultas SQL, acceso a disco, recuperar la información, etc.). Como en toda solución, siempre hay aspectos a tener en cuenta, lo primero es la inversión en hardware, se necesitan maquinas con una CPU moderada pero con una cantidad de RAM muy elevada y además hay que hacer pequeños cambios en las aplicaciones que vayan a utilizar cacheo de contenido dinámico.</li>
</ul>
<p>Si nos decidimos a implementar un cacheo de contenido dinámico, una de las principales aplicaciones en este mundo es <a title="memcached" href="http://www.danga.com/memcached/" target="_blank">memcached</a>, esta aplicación fue desarrollada por <a href="http://www.danga.com/" target="_blank">Danga</a>, que es la empresa creadora de LiveJournal. Desde su creación ha ido evolucionando y ganando adeptos hasta el punto en el que lo están utilizando sitios de tanta repercusión como: YouTube, LiveJournal, Slashdot, Wikipedia, SourceForge, Wordpress.com, GameFAQs, Facebook, Digg, Twitter, Fotolog, BoardGameGeek, NYTimes.com, deviantART, Jamendo, Kayak, VxV y Netlog</p>
<p><strong>Modificación de una aplicación para que funcione con memcached</strong></p>
<p>Si finalmente nos decidimos a montar memcached como solución de cacheo dinámico, tenemos que afrontar el tema de las modificaciones a realizar en la aplicación. El aspecto positivo de todo esto es que si la aplicación que queremos montar bajo memcached es OpenSource hay muchas posibilidades de que alguien ya se haya ocupado de hacer las modificaciones, como es el caso de aplicaciones tan conocidas como WordPress,WikiMedia y phpBB. ¿Pero, y en el caso de que no sea una aplicación conocida, o incluso que estemos desarrollando nuestra propia aplicación? En este caso, la solución pasa por meter unas pocas llamadas en el flujo de la aplicación para que en vez de realizar la consulta directamente a la BD, primero consultemos al cache.</p>
<p>Un escenario típico podría ser el siguiente. Tenemos una función que realiza una consulta a la BD:</p>
<p><code>function get_foo (int userid) {<br />
result = db_select("SELECT * FROM users WHERE userid = ?", userid);<br />
return result;<br />
}</code></p>
<p>Tras realizar las modificaciones, para que primero se consulte a memcached la función quedaría de la siguiente forma:<br />
<code>function get_foo (int userid) {<br />
result = memcached_fetch("userrow:" + userid);<br />
if (!result) {<br />
result = db_select("SELECT * FROM users WHERE userid = ?", userid);<br />
memcached_add("userrow:" + userid, result);<br />
}<br />
return result;<br />
}</code><br />
En este caso, primero consultamos al cache, si el cache tiene almacenada esa clave la devuelve directamente. En caso contrario, preguntamos a la base de datos y lo almacenamos en el cache para que las siguientes consultas sean desde RAM.</p>
<p>Así mismo, las actualizaciones en BD hay que modificarlas porque si no el cache empezaría a devolver información incorrecta, la forma más fácil de hacer esto es directamente desde la aplicación, en el momento en el que se produzca una actualización, directamente eliminamos esa “key” y la substituimos por la nueva de la siguiente forma:<br />
<code>function update_foo(int userid, string dbUpdateString) {<br />
result = db_execute(dbUpdateString);<br />
if (result) {<br />
data = createUserDataFromDBString(dbUpdateString);<br />
memcached_set("userrow:" + userid, data);<br />
}<br />
}</code></p>
<p>Con modificaciones similares las explicadas, y una buena configuración de la plataforma de cacheo, se consigue un hitrate de un 70%, esto quiere decir que un 70% de las peticiones le llegan directamente a memcached sin que llegue un solo byte a la BD.</p>
<p>En posteriores artículos haremos un ejemplo completo de cómo se monta un memcached con un par de ejemplillos de acceso y alguna estadística.</p>
]]></content:encoded>
			<wfw:commentRss>http://blog.landm.net/2008/08/memcache-cacheando-el-contenido-dinamico/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
	</channel>
</rss>
