Una línea de fondo: soy el desarrollador de Redis, a NoSQL database. Una de las nuevas funciones que estoy implementando es la memoria virtual, porque Redis toma todos los datos en la memoria. Gracias a VM Redis es capaz de transferir objetos raramente usados de la memoria al disco, hay varias razones por las que esto funciona mucho mejor que dejar que el sistema operativo haga el trabajo por nosotros intercambiando (los objetos redis están construidos con muchos objetos pequeños asignados en no contiguos lugares, cuando Redis los serializa en disco, toman 10 veces menos espacio en comparación con las páginas de memoria donde viven, y así sucesivamente).C programa atascado en espera ininterrumpida durante la ejecución de E/S de disco en Mac OS X Snow Leopard
Ahora tengo una implementación alfa que funciona perfectamente en Linux, pero no tan bien en Mac OS X Snow Leopard. De vez en cuando, mientras Redis intenta mover una página de la memoria al disco, el proceso de redis ingresa en el estado de espera ininterrumpida durante minutos. No pude depurar esto, pero esto sucede en una llamada al fseeko()
o al fwrite()
. Después de unos minutos, la llamada finalmente vuelve y redis continúa funcionando sin problemas: no se bloquea.
La cantidad de datos transferidos es muy pequeño, algo así como 256 bytes. Por lo tanto, no debería tratarse de una gran cantidad de E/S realizadas.
Pero hay un detalle interesante sobre el archivo de intercambio que es el objetivo de la operación de escritura. Es un archivo grande (26 Gigabytes) creado abriendo un archivo con fopen()
y luego ampliado con ftruncate()
. Finalmente, el archivo es unlink()
ed para que Redis continúe tomando una referencia al mismo, pero estamos seguros de que cuando el proceso Redis salga, el sistema operativo realmente liberará el archivo de intercambio.
Ok, eso es todo, pero estoy aquí para más detalles. Y por cierto, incluso puedes encontrar el código real en Redis git, pero no es trivial entenderlo en cinco minutos dado que es un sistema bastante complejo.
Muchas gracias por cualquier ayuda.
Más información: ahora, al intentar con un archivo de intercambio más pequeño (256 MB), el error desapareció, incluso si los datos están escritos exactamente en las mismas ubicaciones y en el mismo número de páginas. Teniendo esto en cuenta y las otras suposiciones en las respuestas, parece mucho que lo que sucede es que el sistema operativo después de algunas escrituras parece tratar de asignar físicamente el gran archivo en el sistema de archivos, y esto lleva minutos dado el tamaño. Puedo "escribir" algunos bytes aleatorios al inicio para forzar la asignación física lo antes posible, al menos como una opción. Muchas gracias. Será necesario actualizar aquí. – antirez