Antiguo y abandonado blog de Ricardo Galli :-(

Wednesday 12/9/2007

Semántica adecuada: particiones, federación, sharding

Filed under: Personal, En la prensa, Hackerdom — gallir @ 19:41

Muy bueno el apunte Partitioning vs. Federation vs. Sharding (vía high Scalability). Con los “web sociales” y grandes bases de datos se están popularizando términos sin que se conozca muy bien su semántica. Como bien explica Theo Schlossnagle cuando las cosas se vuelven más complicadas se necesitan describirlas y documentarlas de forma más clara, la proliferación de términos confusos no ayuda nada. De allí su “fanatismo” semántico.

Hay tres términos muy usados:

  1. Partitioning (particionado).
  2. Federation (federación).
  3. Sharding (algo así como “desmembrar”, “romper en pedazos”, un trozo de de un cristal roto es un shard)

    (more…)

Saturday 8/9/2007

Arte, ingeniería y ciencia

Filed under: Software, Hackerdom — gallir @ 18:50

Debería matizarse mucho, pero es una simplificación interesante de las tres fases de un proyecto de software según Joel Spolsky:

  • Diseño: La fase artística.

  • Desarrollo: La fase de ingeniería.

  • Debugging: La fase de ciencias [de la computación].

Meritocracias y cotos cerrados

Filed under: ciencia, chorradas, Cultura, Educación, Hackerdom — gallir @ 2:42

Vía ¿Tenemos dictador benevolente? ¿Lo queremos? veo dos interesantes apuntes.

El primero de John Berkus criticando la idea del dictador benevolente.

(more…)

Thursday 6/9/2007

A condiciones de uso similares, la carga de los servidores varía con el horario

Filed under: Curiosidades, Trucos, Hackerdom — gallir @ 0:42

No sé si mucha gente que administre servidores por estos lares se ha dado cuenta. Lo cuento:

  1. Un servidor tiene más o menos el mismo número de visitas y páginas vistas por unidad de tiempo entre las 12 y 24 hs (incluso se incrementa después de las 22 hs).

  2. El tráfico total por períodos también bastante similar (lógico).

  3. El servidor está más “cargado de CPU” [1] (casi el doble) a las 12, 13 ó 15 horas que a las 22 horas.

  4. El servidor necesita más memoria RAM (un 20-25%) en las primeras horas que a las últimas de la noche.

La explicación es simple y lógica aunque no deja de ser curiosa (la dejo en suspense unas horas a ver si alguien lo explica mejor de lo que haría yo, también hay una solución para minimizar este impacto, lo comenté en algún apunte anterior).

[1] No es tan exacto, me refiero al load average. No es que consuma el doble de CPU sino que la longitud media de la lista de procesos para ejecutar es casi el doble. El tamaño de esta lista depende de dos factores fundamentales: el consumo de CPU y los cambios de contexto (schedules) que se produzcan.

Sunday 2/9/2007

Demostrado: Vista no está preparado para el escritorio

Filed under: chapucillas, Hackerdom — gallir @ 3:32

Aunque no sé si lo está para servidores… ;-) Antes de explicar el último ridículo, una breve introducción al tema.

¡Alerta! hay contenido técnico, tome precauciones. En caso de atragantarse consulte urgentemente a su guild/gild oficial correspondiente ;-).

(more…)

Wednesday 29/8/2007

Recursividad, punteros, estadísticas y pseudociencia del software

Filed under: ciencia, Educación, Hackerdom — gallir @ 21:03

En ACM Queue hacen una entrevista a Joel Spolsky, una persona a la que le tengo entre mis lecturas obligatorias por su experiencia, sensatez y sentido común… a pesar de ser informático (y ex-programador de Microsoft, y dueño de una empresa que desarrolla y comercializa software privativo :-) ).

Unas palabras que suscribiría y que van muy en línea con uno de los enésimos debates en los que me meto sobre la “profesión informática”, pero prometo porque puedo que es pura casualidad:

(more…)

Tuesday 28/8/2007

Respuesta –y última– a ingenieros de primera

Filed under: FUD, Legales, Software, Weblogs, Educación, Hackerdom — gallir @ 19:04

Hace unos días hubo un intenso debate en comentarios a dos noticias del menéame: Ingenieros Informáticos reclaman una Ley Competencial que logre frenar el creciente intrusismo profesional en el sector y Manifestación en Madrid de Ingenieros e Ingenieros Técnicos en Informática. Como resultado de ello escribí de coña Convoco a una manifestación de licenciados matemáticos y físicos.

Ese apunte ayer llegó a sitios de gente relacionada con ingenieros de primera. El resultado de puede observar en lo comentarios a mi apunte y en la respuesta Respuesta al señor Ricardo Galli (me llama la atención que en un sitio que se autodenomina “ingenieros” desde el propio URL me trate tan formalmente de “Señor”, y por qué en todo caso no me llaman como ellos, ingeniero, o doctor, aunque no sea de “primera”).

En todo caso aquí va mi respuesta, razonablemente argumentada. No quería hacerla muy extensa –total no lo van a leer cuidadosamente– ni demasiado breve como para que me acusen de “no dar argumentos”. De todas formas, si dejo de contestar algún punto es porque no tengo opinión clara sobre el mismo, o porque lo desconozco.

Nota: Respuesta de Pablo Pérez admin de Ingenieros de Primera y mi breve réplica.

(more…)

Monday 27/8/2007

“Scare tactics” (las de moda)

Filed under: Curiosidades, Hackerdom — gallir @ 19:47

Entrevista a Vinton Cerf (¿no le cansa que le llamen el “abuelo de Internet?). La pregunta sobre el ciber-catastrofismo de moda que no podía faltar:

Algunos críticos, incluyendo a unos cuantos proveedores de Internet importantes, han alertado que el aumento de vídeo en el web podría eventualmente colapsar Internet….

Dr. Cerf rechazó estos anuncios como “tácticas de miedo”… Algunos gurúes predijeron 20 años atrás que le red se colapsaría cuando se la empiece a usar de forma masiva… Durante los últimos 30 años se multiplicó más de un millón de veces… Estamos muy lejos de agotar la capacidad.

Afortunadamente todavía hay gurúes que saben de lo que hablan.

Saturday 25/8/2007

La eficiencia y medio ambiente en la ingeniería

Filed under: menéame, Software, Hackerdom — gallir @ 5:05

Siempre he admirado el obtener el mismo resultado con menos partes o procedimientos. Es un beneficio para todos. Usé ese concepto en mi forma de diseñar. Estuve determinado a dar mi mayor estima a los ingenieros, y en ingeniería siempre nos esforzamos por obtener mayor eficiencia, definida matemáticamente como “más de salida con menos entrada” — Steve Wozniak, the Woz.

Lo dice un maestro de la optimización, los que conocen algo del diseño de Apple II podrán certificarlo, dicen que es una obra maestra de reducción de puertas lógicas y electrónica en general, aunque muy modular y extensible.

Está muy bien que nos lo recuerde, especialmente a los informáticos.

(more…)

Thursday 23/8/2007

Lo que se puede aprender –o confirmar– de la caída de Skype

Filed under: chorradas, Software, Hackerdom — gallir @ 0:19

La red Skype se cayó la semana pasada, el 16-17 de agosto. Dicen los responsables que se debió a un bug disparado por una actualización masiva de Windows.

Skype asegura que su red es P2P –aunque ahora está claro que tiene un fuerte componente centralizado– con algoritmos self healing (que se “auto reparan”) que esta vez no parece haber funcionado muy bien. Como el protocolo es ultra privativo –no hay siquiera información adecuada de la arquitectura y funcionamiento básico– no se puede investigar el tema y quizás nunca conoceremos las razones reales, a pesar de segundas explicaciones.

Aún así se pueden sacar algunas conclusiones:

(more…)

Monday 20/8/2007

Sincronizar el correo de tu servidor con Gmail

Filed under: chapucillas, Trucos, Hackerdom — gallir @ 0:55

Hace ya bastantes años que tengo centralizado todo mi correo en mnm.uib.es. Allí me llegan los correos (re-enviados) de @uib.es y @mnm.uib.es. Además tengo el fetchmail que me recoge el correo vía POP3 desde otro par de cuentas de antiguos ISPs y de AtlasInternet, empresa de la que fui socio fundador.

Desde casi el primer día que salió también uso Gmail, y cada vez más. De hecho ahora se convirtió en mi dirección principal. Pero siempre he tenido todo duplicado, lo que me llega a Gmail lo re-envió a mnm.uib.es y viceversa (así cuando estoy en casa o la UIB uso el Kmail con IMAP del mnm, pero cuando voy de viajes o con el portátil uso siempre Gmail).

En fin, que es una chorrada monumental pero puede servir a alguien: la forma más simple de hacer lo anterior sin perder correos y fundamental sin tener correos duplicados que se re-envían de una cuenta a otra. Para ello uso el formato usuario+etiqueta@...

(more…)

Sunday 19/8/2007

Los mensajes del asesino (de procesos)

Filed under: Curiosidades, Software, Hackerdom — gallir @ 16:44

Para los que hayan estudiado informática (o sean buenos programadores :-) ) les sonará el término deadlock, o “interbloqueo”, o “abrazo mortal”. Es una situación que se puede producir en la compartición de recursos de un ordenador cuando muchos procesos intentan acceder a recursos compartidos y se llega a una situación de “bucle” (es en grafo de asignación) en el que ningún proceso puede continuar porque está esperando recursos asignados a otro que a su vez también espera que se liberen otros recursos…

Hay muchos métodos para evitar que se produzcan los interbloqueos, desde prevenirlo evitando que se produzca una de las cuatro condiciones necesarias:

  1. exclusión mutua,
  2. retención y espera (hold and wait),
  3. no apropiativo (no preemption),
  4. espera circular (circular wait).

Muchas veces no es posible evitar que se produzcan esas condiciones y se deben tomar otras medidas más complejas:

  1. Prevención dinámica: en cada solicitud de recursos se verifica si la satisfacción de esa asignación podría llevar a una situación “peligrosa” de interbloqueo. Aquí se usan algoritmos o técnicas similares y derivadas del algoritmo del banquero.

  2. Detección y recuperación: otra forma es detectar cuando se ha producido un interbloqueo mediante técnicas de detección de bucles en un grafo. Es un poco más complejo (fundamentalmente de complejidad O(n^2)) por lo que se usan simplificaciones –por ejemplo poniendo tiempos de expiración a los bloqueos–. El problema es cómo “recuperarse” de un interbloqueo, no es nada simple. Hay dos técnicas fundamentales:

    a. Matar a unos o varios de los procesos involucrados en el interbloqueo. De esta forma se “rompería” la espera circular y los demás procesos podrían continuar. Este tipo de soluciones es subóptima, ya que es muy difícil escoger al proceso adecuado (lo que pasaba con el Out of Memory Killer del Linux, que era una forma de soluciones el interbloqueo generado por la falta de memoria) y además producen que se acaben procesos de forma errónea.

    b. Vuelta atrás o roll back. Esta técnica se basa en retornar el estado del proceso a uno anterior conocido y luego dejarlo continuar. Es muy difícil hacerlo en un sistema operativo genérico, pero es un área muy conocida y usada en las bases de datos transaccionales.

¿A qué viene todo este rollo? Al siguiente mensaje que me encontré varias veces en una página web enlazada desde Slashdot:

Microsoft OLE DB Provider for ODBC Drivers error ‘80004005′ [Microsoft][ODBC SQL Server Driver][SQL Server]Transaction (Process ID 156) was deadlocked on lock resources with another process and has been chosen as the deadlock victim. Rerun the transaction. /efytimes/lefthome.asp, line 193

Me llamó mucho la atención por varios motivos:

  1. El problema en este caso era claramente una “sobrecarga” de la base de datos. En estos caso lo que suele ocurrir es una “espera infinita” (o starvation) y no un interbloqueo.

  2. El tiempo entre el acceso a la página y el mensaje que obtenía era muy corto y se cargaba rápidamente, por lo que quizás no era una espera infinita sino de un interbloqueo de verdad que haya sido detectado por la base de datos (en este caso SQL Server).

  3. Que una base de datos transaccional tenga problemas de deadlocks con un caso tan sencillo de consultas para generar una página web. Quizás tengan alguna actualización para registrar accesos, pero en todo caso ésta debería ser independiente de las consultas para generación por lo que:

    1. La página se podría haber generado igualmente y ocultar el error al visitante.

    2. EL SQL Server o el programa de la página web tiene un serio problema en las actualizaciones.

En todo caso esto me recuerda nuevamente a que “no hay soluciones mágicas”, muchas veces los sistemas más complejos y sofisticados no son lo mejor para tareas sencillas como generar una página web. Lo que explica en gran parte el porqué la base de datos MySQL se hizo tan popular en servicios web aún cuando no tenía ni los mínimos requisitos para ser una base de datos ACID. También explica porqué se sigue usando mucho el motor MyISAM (sin locks por filas ni transacciones) en vez del InnoDB que sí tiene todas las características transaccionales (y rollback por interbloqueos).

Y por otro lado me recuerda lo estúpido que pueden ser los presuntos “mensajes de error ultra explicativos”. ¿Cuántos lectores entenderían ese mensaje?

Es más, ¿cuántos “informáticos” o presuntos geeks lo entenderían correctamente?

Pues eso, que este apunte sirva para entusiasmar a estudiar esa “informática dura” pero que en realidad es la más divertida… o al menos tenga valor didáctico para entender los mensajes tan guais del SQL Server ;-)

Monday 13/8/2007

Desafío que un “programador” respondería en segundos

Filed under: provocación, chorradas, Hackerdom — gallir @ 16:14

Como era de esperar, el apunte Diez señales de que no eres tan buen programador como piensas generó mucho debate (también en Java Hispano, como era de esperar por mencionar a Java:-) ), como también respuestas falaces y alguna que otra crítica como “que es muy generalista y/o poco técnico”. Pues vale, empecemos con algo más “técnico” para seguir pasando el agosto.

Supongamos que en C (en Java debería dar resultados comparables [1]) inicializamos una matriz de tamaño considerable:

#define S 10000

int a[S][S];

Al bucle siempre lo haríamos de la siguiente forma:

for (i=0; i<S; i++)
    for (j=0; j<S; j++)
        a[i][j] = 0;

Preguntas:

  1. Explicar porqué –casi intuitivamente aunque muchas veces sin saberlo– hacemos la asignación así y no a[j][i].

  2. Fundamental aunque derivada de la anterior. ¿Por qué si hacemos la asignación a[j][i] el código se ejecuta al menos un orden de magnitud más lento? La respuesta es muy concreta y se puede dar en menos de dos tres líneas.

  3. ¿Por qué pongo a la matriz como global y no local?

  4. ¿Por qué a veces las primeras veces que se ejecuta el código toma más tiempo que en las siguientes?

  5. ¿Qué relación tienen este problema de eficiencia con la programación estructurada?

[1] Pruebas con Java

Hice las pruebas en un “sencillo” programa en Java.

class j1 {
        public static void main(String[] args) {
            int[][] a = new int[10000][10000];
            int i, j;
            for (i=0;i<10000;i++)
                    for (j=0;j<10000; j++)
                            a[i][j] = 0;
       }
}

Con Java GNU no tuve ningún problema para ejecutarlo, todavía no sé cómo lograr que se ejecute el Java6 de Sun sin que me de problemas de heap y luego que pueda pre-asignar la memoria con el -Xmx y -Xms, me da siempre Could not create the Java virtual machine ¿Alguien sabe cómo resolverlo si liarme con clases especiales? En resumen, el ejecutable “óptimo” tarda unas 6 veces más que C, unos 6.5 segundos. Mientras que en C el bucle erróneo toma 11 segundos, en Java 25 segundos.

Conclusión de Java: la gestión de memoria es bastante más lenta y se nota menos la diferencia entre uno y otro (no llega al orden de magnitud). Pero lo importante: también hay con el mismo cuidado que con C, el compilador no “optimza” estos casos. No vale la excusa, “en Java no te preocupas de estos temas”.

PS: Por favor abstenerse mis alumnos y amigos que me hayan escuchado sobre este ejemplo ;-)

Saturday 11/8/2007

Diez señales de que no eres tan buen programador como piensas

Filed under: ironías incomprendidas, chorradas, Hackerdom, soft libre — gallir @ 20:37

Como es verano, hay mucho tiempo para pensar, me hizo gracia Diez señales de que no eres tan listo como piensas, y tenía ganas de provocar un poquillo elaboro la misma lista pero para programadores.

  1. Estás convencido que eres “muy buen programador”.

    En general los buenos programadores interactúan y trabajan mucho con el código de otros programadores, y siempre hay alguien que tiene soluciones más creativas, eficientes y elegantes que lo que se le puede ocurrir a una sola persona.

    Los buenos programadores suelen pensar que hay demasiadas personas que programan mejor que él.

  2. Reconoces inmediatamente a Jobs, Gates o Torvalds pero no sabes quiénes son y/o qué han hecho Turing –además de su modelo matemático tan conocido–, von Neumman –además de su famosa definición de “arquitectura”–, Dijkstra, Knuth, Wirth, Kernighan, Ritchie, Engelbart, Corbató, Hoare, Minsky…

    ¿Irías a un médico que no sabe qué ha hecho Pasteur o Ramón y Cajal? Pues eso. (No significa que saber la vida de esos personajes garantiza ser buen médico, pero un buen médico seguro que lee mucho sobre su profesión, si no sabe es que ni siquiera se preocupa en leer más allá de lo que le exigieron en la carrera, y que además se le olvidó una gran parte).

  3. A primera vista del código de programas grandes de otras personas dices “vaya mierda de código, muy complicado, yo lo puedo hacer mejor”.

    En general los programas grandes son desarrollados por muchas personas, cada una con su visión –a veces contradictoria con otros– y estilo propio. Aunque haya sido desarrollado por una sola persona, seguramente ésta evolucionó y cambió –en general a mejor– durante el desarrollo. También van cambiando la “realidad” y las herramientas, lo que implica que las soluciones no son siempre las mismas. Además el software se hace cada vez más complejo y requiere soluciones sofisticadas para solucionar los diversos problemas –por ejemplo las race conditions– que aparecen.

    Un programador que ha participado en proyectos grandes reconoce inmediatamente estos patrones y problemas asociados, además de tener muy claro que una sólo persona es incapaz de desarrollar grandes programas por sí sola, por eso nunca desmerecería el trabajo de otros sin un conocimiento exhaustivo del programa y sus problemas asociados (y lo más seguro es que envíe parches o soluciones mejores).

  4. Justificas que tu código es ilegible para no mostrarlo o publicarlo.

    Este es un problema bastante importante en la gente que empieza a programar… y si perdura con el tiempo es que nunca ha llegado a comprender que los lenguajes de alto nivel se han desarrollado para las personas, no para la CPU –que sigue entendiendo sólo binario–.

    Así te encuentras con código sin sangrar, variables y funciones con nombres que no dan ninguna pista de lo que hace –kaka, pepito, f1, v1…–, variables de una letra –como i, j, k– usadas en variables que no son contadores ni índices, ningún comentario… o lo que es peor, exceso de comentarios del tipo /* asigno 0 a la variable i */.

    Como las novelas, ¿alguien leería novelas sin ningún tipo de estructura de oraciones, párrafos y capítulos? ¿o sin signos de puntuación o escritas en lenguaje de teléfonos móviles? Si uno sabe de antemano que su código será revisado y modificado por otras personas se plantea escribirlo de otra forma, más acorde con el estilo de cada lenguaje y que sea agradable de leer.

    Ésta es una gran ventaja de los programadores de software libre, además que se programa pensando en que otros lo mirarán, en general ya ocurre lo que está explicado en #2: se aprende mucho mirando el código de otros.

  5. No sabrías definir en pocas palabras qué es la programación estructurada, ni sus relaciones y ventajas/desventajas con las arquitecturas y diseño del hardware.

    Pues eso, un buen programador sabría explicar que las estructuras de control tienen un sólo punto de entrada y puede tener varios puntos de salida –aunque hubo bastantes discusiones sobre este aspecto–, y que estas restricciones tienen mucho que ver con las “localidad espacial y temporal” del código –además de las ventajas obvias del código fuente de alto nivel estructurado–.

  6. Afirmas “el último lenguaje/librerías/framework XYZ es el mejor”. O que “C y ensamblador desaparecerán”, o peor aún, “el C++ reemplazará al C en los sistemas operativos”.

    Cualquiera que haya vivido o leído sobre las diferentes tecnologías y soluciones informáticas entenderá muy bien lo que explica Brooks en “no existe la bala de plata” (There is no silver bullet, mejor traducido como “no hay soluciones mágicas”). Cada lenguaje además tiene sus ventajas y desventajas para cada tipo de problema. Hay cosas que se pueden solucionar mejor con un lenguaje que con otros. Por ejemplo el tratamiento y control de la memoria –gracias a los odiados punteros y asignación dinámica de memoria– que se puede hace con C son casi imposibles o tan costosos que no merece la pena en lenguajes como Java. Aún más, hay cosas necesarias en determinados programas que sólo se pueden hacer con ensamblador, como gestionar registros, TLB, cache, etc.

    El que crea que con su lenguaje preferido puede solucionar todo es como el refrán para el que sólo tiene un martillo todo lo que ve son clavos. La informática y programación es mucho más amplio que programar sistemas de facturación o páginas web.

  7. Te dicen que puedes tener una race condition en tu código y pones cara de pasmado.

    La programación de sistemas modernos es cada vez más compleja, lo que hace que habitualmente se usen modelos de multiprogramación, programación concurrente y programación distribuida. Incluso la programación web es un ejemplo típico de multiprogramación. Todos esos modelos tienen asociados los problemas de concurrencia por compartición de recursos que hacen que los programas tengan fallos que parecen casi aleatorios aunque los algoritmos analizados independientemente sean correctos. Los conceptos y problemas de concurrencia son de los más difíciles de aprender, lo que sólo se logra con el estudio de los problemas fundamentales y mucha práctica.

  8. Piensas que en la universidad deberían enseñar Java desde el primer curso y que enseñar Pascal no tiene sentido.

    Este es el típico argumento de los que piensan que la universidad sólo debe enseñar lo que “demanda el mercado”, o aún peor, que él o ella sólo debe aprender lo que demanda su mercado.

    El primer objetivo cuando se empieza a programar es aprender qué es un algoritmo, cómo se representa en un lenguaje de alto nivel, estructurado, secuencial e imperativo –es el modelo más usado y con más métodos formales de diseño y verificación–. Lenguajes como C++ o Java son antes que nada estructurados, secuenciales e imperativos.

    Estos son conocimientos previos necesarios para aprender correctamente las abstracciones y estructuras orientadas a objetos, empezar con estos lenguajes con abstracciones y construcciones más complejas sólo introducen problemas y ruido en el aprendizaje, y lo que es peor, introduce vicios que luego son muy difíciles de eliminar.

  9. Te han explicado alguna que tu código quizás se ejecute más rápido si lo compilas para reducir el tamaño antes que optimizar código y has pensado que te engañaban.

    Así como está enunciado parece una tontería, pero sólo podrían entenderlo los que tienen un conocimiento más profundo de los que conocen a la arquitectura del hardware que ejecutan al programa. Esto significa conocimientos de gestión de memoria virtual, memoria cache, características del TLB, etc. (De hecho este es un caso real, el núcleo del Linux, la velocidad de los procesadores se incrementó notablemente más rápido que la memoria RAM, por lo que el papel de las técnicas de caché creció en relevancia).

  10. Eres parte del movimiento mileurista, o te quejas del intrusismo laboral.

    No conozco a ningún buen programador que cobre mil euros al mes –y conozco a muchísimos, la ventaja de haber sido su profesor–. El paro de los programadores es casi cero –casi diría que negativo en Balears, es una lucha dura evitar que los buenos programadores que están en tercero de informática no empiecen a trabajar sin acabar al menos la técnica, luego se eternizan como alumnos–.

    Además, ¿no hablan tanto al “libre mercado”? Un buen programador no tiene problemas para encontrar puestos mejores. Un buen programador no está preocupado del “intrusismo”, si los “intrusos” son buenos programadores, bienvenidos sean.

    Si en cambio no lo son no representan ningún problema para él, todo lo contrario, le quitan el trabajo que él no está interesado en hacer.

Y por último y aunque está fuera de las diez no podría dejar de ponerla

10bis. Si te dicen expresiones regulares y sólo tienes un problema

Yo he cometido todos esos “pecados”, y sigo cometiendo algunos. Pero intento dejar de hacerlo. Lo malo es que cuando ya deje de hacerlo tendré muchas más “pistas” que agregar a la lista, y así volveré al punto inicial nuevamente.

O quizás eso es justamente lo mejor de ser un programador. ;-)

Edición: Paco propone una que no sé cómo se me ha pasado:

10bis2. Consideras que ya eres suficientemente buen programador y que debes dedicarte a otras tareas como el análisis, diseño o planificación. La programación es una tarea secundaria y trivial que puede hacer cualquiera.

Thursday 9/8/2007

noatime y nodiratime ¡ya!

Filed under: Linux, Hackerdom — gallir @ 3:53

Las actualizaciones del atime son de lejos la más grande de las deficiencias que Linux tiene actualmente. Eliminando las actualizaciones del atime mejorará el rendimiento de los Linux normales más que todas las mejoras del pagecache de los últimos 10 años, combinadas. — Ingo Molnar

No puedo estar más de acuerdo, hace tiempo que todos mis ordenadores –de escritorio y hasta del Menéame– tienen deshabilitada las opciones de atime y diratime. No sé porqué las distros como Ubuntu ya no vienen así por defecto.

Es muy fácil, basta agregar las opciones “noatime,nodiratime” en el /etc/fstab. Por ejemplo (la siguiente es la línea del servidor del menéame):

Actualización: Leo en LWN que no hace falta el nodiratime si se especifica atime, ya que este último lo engloba.

/dev/sda1    /   ext3    defaults,noatime,nodiratime,errors=remount-ro 0       1

Si no quieres reiniciar el servidor/ordenador para que tengan efecto las modificaciones, también es muy fácil:

mount -o remount,noatime,nodiratime /

Breve explicación

Siguiendo el diseño original de Unix, para cada fichero se almacenan una serie de “metadatos”, entre ellos la fecha de creación/modificación –mtime–, modificación del inodo –ctime–, y también la fecha de último acceso –el atime–. Eso significa que aunque se acceda a un fichero para sólo lectura se genera una escritura al disco para actualizar la hora de acceso –tiene precisión de un segundo–. Esto ocurre aunque el contenido del fichero esté completamente en el pagecache, lo que lo hace aún más ridículo.

El noatime indica que no se actualice la hora de acceso a un fichero. nodiratime es similar pero para accesos a directorios (por ejemplo cuando se busca un fichero por su nombre).

¿Por qué se sigue usando? Sobre todo por razones históricas y porque unos pocos programas de correo –creo que también el mutt– lo usan para verificar si han llegado un correo nuevo. Ya no tiene ni sentido para esto, porque el Linux tiene interfaces más adecuadas para ello, por ejemplo el inotify, que notifican a los programas cuando se modifica un fichero o directorio.

Next Page »

Powered by WordPress