Desde hace un par de meses uno de nuestros servidores nos estaba trayendo por la calle de la amargura. Resulta que de manera aleatoria pero con una frecuencia aproximada de 1 semana o semana y pico, de repente empezaba a dar errores con cualquier web que tuviera que hacer conexiones hacia el exterior. Esto significa que todas las webs dinámicas o aplicaciones web que intentasen conectarse con una base de datos, por ejemplo, de repente no podían hacerlo. Lo cual implicaba aplicaciones caídas, páginas web basadas en algún CMS (como WordPress) dando errores de ejecución y no pudiendo servir páginas, etc...

La única solución era reiniciar la máquina. Al hacerlo todo volvía a la normalidad, pero al cabo de unos días o una semana, vuelta a empezar.

El log del sistema no ofrecía información interesante. Mi experiencia me decía que tenía algo que ver con una actualización del sistema operativo. No es la primera vez que la fastidian a base de bien con una. Pero lo cierto es que tenemos muchos servidores y solo pasaba en este en particular, que por otro lado es también el que más tráfico recibe... Un absoluto misterio. Y una desesperación.

Las aplicaciones en sí, lo único que decían era que no se podían conectar a la base de datos. En el log del sistema, los mensajes de advertencia (ni siquiera error) simplemente decían que no se podía conectar a las bases de datos ninguna de las aplicaciones, con algo como esto:

An operation on a socket could not be performed because the system lacked sufficient buffer space or because a queue was full.

 o en español:

Una operación en un socket no se pudo realizar porque el sistema no disponía de suficiente espacio de buffer o porque una cola estaba llena

 

Lo cierto es que para mi esto no tenía ningún sentido. Se trata de una máquina potente, con espacio en disco y memoria más que de sobra. Lo único que hubiera algún programa fuera de nuestro control que estuviese gastando los sockets, abriéndolos sin parar y no cerrándolos...

Efectivamente el problema era este.

Haciendo un netstat no se averiguaba nada útil, pues las conexiones que había eran las normales. Pero de repente me encontré con un detalle interesante: había una unidad iSCSI intentando conectarse todo el tiempo sin éxito.

Todos nuestros servidores hacen las copias de seguridad como mínimo a dos unidades de copia de seguridad diferentes, utilizando iSCSI para ello. iSCSI es un protocolo que permite utilizar espacios de almacenamiento remotos, como si fueran locales. Es decir, tienes un espacio reservado en una unidad de almacenamiento remoto (LUN o Logical Unit Number) pero tu servidor la ve como si fuera un disco duro local. Esto tiene diversas ventajas y se suele utilizar mucho (te remito al artículo anterior de la Wikipedia si quieres saber más).

El caso es que una de las unidades de backup se estropeó hace unos meses. Como era vieja decidimos deshacernos de ella y utilizar una de las otras. Pero, el enlace existente entre el servidor y la LUN (la unidad remota) que utilizaba no se rompió. Lo que esto provocaba era que todo el tiempo estuviese intentando conectar con ella:

Esto en condiciones normales, si bien no es lo ideal, no supone tampoco un problema.

El problema surgió el pasado mes de mayo, cuando Microsoft liberó las actualizaciones mensuales de Windows. Éstas incluían el "Monthly Rollup" de Windows, que incluye multitud de parches para varias cosas y que viene incluido también en actualizaciones acumulativas posteriores. Uno de ellos provoca una fuga que implica que al cabo de un tiempo agota todos los puertos efímeros del sistema pudiendo llegar a provocar incluso el bloqueo del sistema operativo:

De modo que ahí estaba la causa del problema. ¡Buff! Cualquiera da con ella. Microsoft ha reconocido el problema (como puedes ver en la captura anterior) pero no se da prisa en solucionarlo, puesto que tiene que darse la casualidad de que haya un origen iSCSI no disponible, y no es algo tan frecuente.

Mientras tanto ¿cómo puedes solucionarlo?

Bueno, la solución es bastante obvia: evitar que se intenten las conexiones al LUN mediante iSCSI.

Pero para ello no llega con darle al botón "Desconectar" en la figura anterior. Esto no evitará que cuando se reinicie el sistema, automáticamente se intente la reconexión de nuevo. Hay que verdaderamente librarse de él.

Ello implica ir a la pestaña "Favorite Targets" y eliminar el servidor de iSCSI remoto de allí con "Remove":

Además sería bueno que fueses a la pestaña "Discovery" y que eliminases el servidor de almacenamiento de allí también:

De este modo se solucionará el problema y ya no dejará tu servidor "frito".

Y es que las actualizaciones automáticas de Microsoft son estupendas para no preocuparse de muchos aspectos de la gestión del servidor, pero muchas veces vienen con "regalos envenenados". Yo llevo muchos años gestionando servidores Windows y en todo este tiempo no es la primera vez (ni mucho menos), ni tampoco será la última, que una actualización crea graves problemas operativos en las máquinas.

Es por eso que, si el coste no es un problema a largo plazo, la nube es cada vez más la mejor opción para gestionar tus sistemas. Obviamente no me refiero a servicios de infraestructura y máquinas virtuales, pues eso no te soluciona nada relativo a lo que estoy comentando. Me refiero a servicios de plataforma como servicio, del estilo de los Sitios Web de Azure, donde este tipo de cosas es mucho más difícil que ocurran. De todos modos no siempre es posible recurrir a este tipo de soluciones, si bien con el tiempo (y en gran parte gracias a Docker y los servicios de contenedores) será cada vez una realidad más común y menos problemática.

Espero que si da la casualidad de que estás pasando por lo mismo, este artículo te ayude a solucionar el problema :-)

 

 

💪🏻 ¿Este post te ha ayudado?, ¿has aprendido algo nuevo?
Pues NO te pido que me invites a un café... Te pido algo más fácil y mucho mejor

Escrito por un humano, no por una IA