viernes, diciembre 16, 2005

El problema de los interbloqueos

Quien me iba a decir a mí, que esta mañana en el trabajo, repasando una lista de procesos en ejecución y un log de consultas SQL, me tropezaría con un problema que habia estudiado en la universidad con la asignatura de Sistemas Operativos. El problema es conocido como el de 'Los Interbloqueos' y se estudia conjuntamente con la concurrencia de procesos.

Este problema, tiene mucho que ver con la planificación de procesos de un sistema operativo. El sistema operativo debe gestionar los recursos que utilizan los procesos y evitar que ciertos procesos se bloqueen cuando uno de ellos (proceso1) solicita un recurso que esta siendo utilizado por otro (proceso2). A su vez, ese proceso2 está bloqueado porque no puede acceder a un recurso que está siendo utilizado por el proceso1, quedando los dos procesos en una espera infinita y bloqueados porque ninguno de los dos puede avanzar y liberar los recursos utilizados por ellos y que estan bloqueando.

Existen diferentes formas de intentar solucionar el problema y una serie de reglas para que no se den. Las dos mas importantes es que los recursos que solicita un proceso y que pueden dar lugar al interbloqueo sean siempre pedidos en el mismo orden por todos aquellos procesos susceptibles de generar el bloqueo. La otra es que si un proceso no puede obtener un recurso porque esta en uso, ese proceso a su vez, libere cualquier recurso que este usando.

Todo lo anterior es teoría y en la práctica, con unas normas básicas, se puede solventar. En el trabajo, de forma casual hemos paliado el problema en el sistema de mensajeria. Recalco de forma casual, porque las mejoras introducidas iban encaminadas a evitar consultas UPDATES, sin otro objetivo más -ver una lección de mysql-. El sistema de mensajeria no se construyó pensando que existiesen esos problemas y dudo que muchos sistemas de mensajes (o de otro tipo) que se programan lo hagan contemplando esa posibilidad, más real de lo que parece.

En este caso, un usuario cuando escribe o lee un mensaje actualiza con update varias tablas simultanemente. Puede darse el caso, de que otro usuario, esté también mandando un mensaje y que bloquee otras tablas de la base de datos. Algunas de ellas comunes a las que esta usando el primer usuario. Como en mysql, las consultas UPDATE o DELETE son bloqueantes de toda la tabla, tenemos un serio problema porque pueden aparecer los dichosos interbloqueos.

El porqué se tienen varias tablas es para separar y optimizar el acceso a las tablas de datos de los mensajes. Las tablas grandes son muy pesadas de tratar con ellas (tablas con cientos de miles de registros). Por ello se opta por una partición de ellas en función de un codigo hash obtenido del identificador de usuario. Esto hace que el sistema sea más escalable en su crecimiento y no se degrade el rendimiento. Hasta cierto punto, porque hay un momento en el que el trasiego de uso del sistema produce que el porcentaje de interbloqueos sea tan grande que el sistema puede caer en picado en cuanto al rendimiento ofrecido.

Y acabo el momento académico con un enlace patrocinado explicando con más detalle el asunto interbloqueos.

2 comentarios:

  1. Bueno, en BBDD el problema del interbloqueo es más sencillo que en sistemas operativos, donde los casos son muchos más variados y las combinaciones casi infinitas.

    En BBDD la solución al problema de los interbloqueos (y consistencia) es las bases de datos se soluciona con las transacciones y los rollbacks.

    Mysql tiene desde hace tiempo (no recuerdo desde que versión) bloqueos a nivel de filas, no de tablas completas. Si lo quieres hacer a nivel de tablas tienes que hacerlo explícitamente (con "LOCK TABLES").

    Así que supongo el problema reside en los programas mas que en la BBDD.

    ResponderEliminar
  2. El bloqueo a nivel de filas se obtiene utilizando Innodb, pero el rendimiento de innodb es muy flojo en comparación con myisam (40 q/s vs 160 q/s).

    Ni de lejos se asemeja al obtenido con myisam, aun teniendo en cuenta el problema de los updates y deletes que presenta myisam.

    ResponderEliminar

Cómo utilizar el servicio Secrets Manager para guardar las claves privadas de SSH

Para guardar la clave privada en el servicio Secrets Manager como un secreto en modo texto sin formato, sigue estos pasos Supongamos que la ...