Antiguo y abandonado blog de Ricardo Galli :-(

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 ;-)

11 Comments

  1. Attention, freak alert level 1 xD

    Buen artículo.

    Comment by Arturo — Sunday 19/8/2007 @ 19:15

  2. En mi trabajo (que no tiene nada que ver con la informática) usamos un programa desde distinatas oficinas ubicadas en toda la península, y accedemos a él mediante Terminal Server. Ni qué decir que el programa está escrito en VB sobre Access. Pues en un año que llevo trabajando allí he visto este mensaje de error al menos 30 veces. El programa no se cuelga ni nada, le das a aceptar y puedes continuar trabajando. La primera vez que lo ví me hizo mucha gracia, me recordó a las clases de sistemas operativos de la facultad. Y hasta creí que era algo casi normal, pero después de leer este artículo me confirma lo que me decía una vocecita en mi interior, que el programa es una verdadera chapuza…

    Por cierto, no veáis lo que cuesta explicarle este error a cualquier compañero del curro que por supuesto no tiene ni la más remota idea de informática.

    Comment by proclamo — Sunday 19/8/2007 @ 20:04

  3. #2, proclamo, sin duda alguna la mayor de las chapuzas es que estén usando Access para un entorno corporativo y multiusuario. Esa costumbre tan afianzada en chapuceeros-windowceros debería ser parte de la historia de la infamia informática.

    Comment by gallir — Sunday 19/8/2007 @ 20:37

  4. […] Via: El Blog de Ricardo Galli […]

    Pingback by nulleando.com.ar » Deadlocks en web — Sunday 19/8/2007 @ 21:25

  5. Recuerdo que fue el penúltimo tema de mi asignatura de SO2. Todas aquellas medidas que no implicaban liberar recursos matando procesos eran demasiado costosas para un sistema normalizo. Luego existían varias técnicas para decidir cual era el proceso más apropiado para eliminar. Qué pena que se me vayan olvidando estas cosas, con lo que me divertí estudiándolas :(.

    Comment by pmarin — Sunday 19/8/2007 @ 23:31

  6. Genial el artículo. No son pocos los mensajes de error de este tipo que se encuentran dándose una vuelta por páginas con formularios. Has descrito el error perfectamente. Ni que decir tiene que estos mensajes deben de ocultarse siempre por el personal encargado de sistemas. Dar pistas de tu sistema siempre es arriesgado y ya sabemos lo débil que es el SQL Server. Cualquier persona mal intencionada te puede hacer un verdadero estropicio. Se me ocurre un tema para un artículo: “prevención contra la inyección SQL” :-)

    Un saludo.

    Comment by Iñaky — Monday 20/8/2007 @ 8:24

  7. Me ha encantado el artículo, me ha hecho recordar mis clases de sistemas operativos… Sobre el #2 en mi empresa la intranet de gestión de incidencias está hecha en ASP + Access, así que podéis imaginar lo fluida que va cuando 3 ó 4 usuarios nos conectamos a la vez y hacemos alguna consulta un poco compleja.

    Saludos, Iván.

    Comment by Iván — Monday 20/8/2007 @ 23:30

  8. Justo lo que comentas es lo que estuve estudiando ayer.
    Hay una opción a todo eso, y es la técnica de la avestruz o agachar la cabeza como si no hubiera pasado nada. Según mis apuntes es la técnica que usa UNIX, y la excusa diciendo que de esta manera no se tienen que estar dedicando recursos para evitar interbloqueos ni tampoco se limita al usuario en la ejecución de procesos.

    Espero no haberme equivocado mucho Ricardo, jeje.

    Comment by Menda — Tuesday 21/8/2007 @ 18:41

  9. #8, has leído demasiado al libro –antiguo y bastante pobre aunque el autor es un crack– de Tanenbaum ;-)

    Lo de la idea del avestruz es relativo y creo que se trataba específicamente del control de concurrencia de acceso a los ficheros.

    Comment by gallir — Tuesday 21/8/2007 @ 18:51

  10. Yo no dudo que los apuntes que me estoy estudiando sean antiguos, ¿pero de verdad crees que los sistemas operativos han cambiado en su interior tanto en unos pocos años? ¿Alguna sugerencia a mi profesor (jeje)?
    Por cierto, te admiro por la cantidad de cosas que tienes que hacer y que siempre tengas algo de tiempo para todas.

    Saludos desde Jaén!

    Comment by Menda — Wednesday 22/8/2007 @ 22:39

  11. Que buen articulo!!! me ha servido mucho sobre todo para la clase de sistemas operativos

    Comment by ArthurElyon — Thursday 23/8/2007 @ 2:18

RSS feed for comments on this post.

Sorry, the comment form is closed at this time.

Powered by WordPress