locked
La Paged Pool ocupa toda la RAM y aparece Blue Screen RRS feed

  • Pregunta

  • Tengo un problema de agotamiento de memoria y el sistema termina sin recursos mostrando un Blue Screen.

    Lo considero más un problema de Windows/Drivers que de programación, ya que el problema de agotamiento de recursos aparece simplemente cuando se ejecuta el siguiente código cuando el disco está lleno:
    for (int cnt=0; cnt<1000; cnt++)  
    {
         FILE* f = fopen("Hola.txt", "wb");
         if (f != NULL) fclose(); // Nunca llega  a ejecutarse esto porque f siempre es NULL.
    }

    Creo que puede deberse a un posible bug de Windows debido a un Leak en el Paged Pool.

         -> Uso Windows 7 Profesional 64 bits, en un i7 con 32 Gb de RAM.
         -> He desactivado el Paging File, para poder hacer mejor las pruebas de agotamiento de recursos.
         -> Mi aplicación está desarrollada en VC++.
    - Tengo una aplicación que necesita almancenar gran cantidad de datos en disco (SSD).
    - La memoria RAM ocupada por la aplicación se mantiene estable (inferior a 1Gb). La aplicación no tiene Leaks.
    - Conforme se almacenan datos, la memoria RAM aumenta. Según he visto, puede deberse al File Caching.
    - Si elimino algunos de los ficheros que han sido almacenados, se libera memoria RAM. Por lo que parece confirmar el punto anterior relativo a que la memoria incrementa debido al File Caching.
    - Si cierro la aplicación, sólo se libera la RAM que ésta ocupaba, que es inferior a 1Gb de RAM.
       * Pregunta 1: ¿Cómo limito el uso del File Caching?
       * Pregunta 2: ¿Puede ser perjudicial para mi caso, ya que mi aplicación necesita almacenar 24 horas gran cantidad de datos a disco, estando la tasa de transferencia a disco cercana al límite?
       * Pregunta 3: Lo más importante, si no lo limitase, y el File Caching ocupara toda la RAM, si alguna aplicación necesitara de pronto usar más memoria, ¿el File Caching liberaría memoria para dejársela a la aplicación o la aplicación fallaría? Hacer notar, que la memoria usada por el File Caching se muestra como 'En Uso', no como 'En Espera' (StandBy).
    Ahora comento mi verdadero problema:
    - Cuando se da el caso de que el disco se llena, y ya no hay espacio disponible, cada vez que se intenta crear el fichero para almacenar datos, con la instrucción de C fopen(), ésta devuelve NULL. EL error producido es 112 (no hay suficiente espacio en disco). Se aborta por tanto la escritura del fichero. Hasta ahí todo correcto.
    - Pero a lo largo del tiempo, observo que se va incrementando el PagedPool, hasta ocupar toda la memoria RAM.
    - Aunque reinicie mi aplicación, la memoria usada en el Paged Pool, no se reduce. Tampoco lo hace cuando elimino todos los ficheros del disco.
    Por lo que si el disco estuviera sin espacio durante el tiempo suficiente para que el Paged Pool ocupara toda la RAM, la única solución para liberar RAM es reiniciando Windows.
    Creo que esto puede deberse a un Leak en el Paged Pool durante la creación de ficheros (al menos con fopen) cuando se produce un error debido a que no hay espacio suficiente en disco (error 112).
    Le agradezco me confirmen este hecho y si hay alguna solución ya encontrada.
    De momento, mi solución pasa por comprobar antes de hacer el fopen el espacio disponible en disco (en ese caso, me preocupa especialmente la 'Pregunta 3', ya que aunque evite el posible Leak en el Paged Pool, si se termina llenando la RAM y no deja espacio para nada más, mi aplicación fallará). 
    Una posible solución puede ser limitar el espacio usado por el File Caching, pero no sé si esto afectará al rendimiento (Pregunta 2).
    Pregunta 4: ¿Y qué tal limitar el Paged Pool? ¿Es mejor o peor? ¿Está desaconsejado?
     
    Muchas gracias por adelantado y disculpen tan larga explicación.
    • Cambiado Omar Ortiz lunes, 4 de marzo de 2013 22:54 Foro Erroneo
    martes, 26 de febrero de 2013 19:03

Respuestas

  • Tengo un problema de agotamiento de memoria y el sistema termina sin recursos mostrando un Blue Screen.

    Lo considero más un problema de Windows/Drivers que de programación, ya que el problema de agotamiento de recursos aparece simplemente cuando se ejecuta el siguiente código cuando el disco está lleno:
    for (int cnt=0; cnt<1000; cnt++)  
    {
         FILE* f = fopen("Hola.txt", "wb");
         if (f != NULL) fclose(); // Nunca llega  a ejecutarse esto porque f siempre es NULL.
    }

    Creo que puede deberse a un posible bug de Windows debido a un Leak en el Paged Pool.

         -> Uso Windows 7 Profesional 64 bits, en un i7 con 32 Gb de RAM.
         -> He desactivado el Paging File, para poder hacer mejor las pruebas de agotamiento de recursos.
         -> Mi aplicación está desarrollada en VC++.
    - Tengo una aplicación que necesita almancenar gran cantidad de datos en disco (SSD).
    - La memoria RAM ocupada por la aplicación se mantiene estable (inferior a 1Gb). La aplicación no tiene Leaks.
    - Conforme se almacenan datos, la memoria RAM aumenta. Según he visto, puede deberse al File Caching.
    - Si elimino algunos de los ficheros que han sido almacenados, se libera memoria RAM. Por lo que parece confirmar el punto anterior relativo a que la memoria incrementa debido al File Caching.
    - Si cierro la aplicación, sólo se libera la RAM que ésta ocupaba, que es inferior a 1Gb de RAM.
       * Pregunta 1: ¿Cómo limito el uso del File Caching?
       * Pregunta 2: ¿Puede ser perjudicial para mi caso, ya que mi aplicación necesita almacenar 24 horas gran cantidad de datos a disco, estando la tasa de transferencia a disco cercana al límite?
       * Pregunta 3: Lo más importante, si no lo limitase, y el File Caching ocupara toda la RAM, si alguna aplicación necesitara de pronto usar más memoria, ¿el File Caching liberaría memoria para dejársela a la aplicación o la aplicación fallaría? Hacer notar, que la memoria usada por el File Caching se muestra como 'En Uso', no como 'En Espera' (StandBy).
    Ahora comento mi verdadero problema:
    - Cuando se da el caso de que el disco se llena, y ya no hay espacio disponible, cada vez que se intenta crear el fichero para almacenar datos, con la instrucción de C fopen(), ésta devuelve NULL. EL error producido es 112 (no hay suficiente espacio en disco). Se aborta por tanto la escritura del fichero. Hasta ahí todo correcto.
    - Pero a lo largo del tiempo, observo que se va incrementando el PagedPool, hasta ocupar toda la memoria RAM.
    - Aunque reinicie mi aplicación, la memoria usada en el Paged Pool, no se reduce. Tampoco lo hace cuando elimino todos los ficheros del disco.
    Por lo que si el disco estuviera sin espacio durante el tiempo suficiente para que el Paged Pool ocupara toda la RAM, la única solución para liberar RAM es reiniciando Windows.
    Creo que esto puede deberse a un Leak en el Paged Pool durante la creación de ficheros (al menos con fopen) cuando se produce un error debido a que no hay espacio suficiente en disco (error 112).
    Le agradezco me confirmen este hecho y si hay alguna solución ya encontrada.
    De momento, mi solución pasa por comprobar antes de hacer el fopen el espacio disponible en disco (en ese caso, me preocupa especialmente la 'Pregunta 3', ya que aunque evite el posible Leak en el Paged Pool, si se termina llenando la RAM y no deja espacio para nada más, mi aplicación fallará). 
    Una posible solución puede ser limitar el espacio usado por el File Caching, pero no sé si esto afectará al rendimiento (Pregunta 2).
    Pregunta 4: ¿Y qué tal limitar el Paged Pool? ¿Es mejor o peor? ¿Está desaconsejado?
    Muchas gracias por adelantado y disculpen tan larga explicación.

    Filecahching no puedes eliminarlo y es dinamico en funcion del os recursos por lo que no puede ser fuente de error.

    Si el disco está lleno, tal y como comentas, el error es normal y puede sucerder en cualquier punto, bien de la aplicacion o bien en cualquier rutina del sistema. Un disco debe estar siempre al menos con el 15% de espacio libre.

    Con respecto a los posibles leaked de memoria, bien tuyos o bien de drivers de terceros (por ejemplo, el simple Diskeeper bastante usado como defragmentador en causante de perdidas de memoria), debes analizarlo con le herramienta Poolmon.exe del Windows Driver Kit. Puedes hacerlo de forma online para ver que etiqueta tiene la perdida de memoria y analizar psoteriormente el responsable de esa etiqueta.

    Con respecto al filecahcing, en caso de agotamiento de memoria entraria el mecanismo de paginacion con lo cual no es problema,. Unicamente debes saber que la memoria virtual de tu proceso estaria limitada a 2 GB si es de 32 bits y por encima de ella el proceso fallaria. Hay que hablar siempre de memoria virtual.. no de memoria real que no tiene sentido para el sistema.


    Jose Manuel Tella Llop news://jmtella.com

    • Propuesto como respuesta Uriel Almendra viernes, 8 de marzo de 2013 21:49
    • Marcado como respuesta Uriel Almendra lunes, 8 de abril de 2013 22:16
    martes, 5 de marzo de 2013 4:15

Todas las respuestas

  • Hola Santi_81

    Gracias por utilizar los Foros de MSDN

    Te comento que al revisar el problema que tienes, es mejor que lo movamos al foro correcto para que los especialistas en este tema puedan guiarte de manera mas rapida  y eficaz.

    Recuerda que si una respuesta te ha servido debes Proponerla o Marcarla como Respuesta y Votar como Útil para asi apoyar a nuestra Comunidad y esta siga creciendo.

    Saludos y no dudes en volver a tus Foros MSDN


    Omar Ortiz

    Microsoft Contingent Staff
    Mexico City

    • Propuesto como respuesta Omar Ortiz lunes, 4 de marzo de 2013 22:57
    lunes, 4 de marzo de 2013 22:57
  • Tengo un problema de agotamiento de memoria y el sistema termina sin recursos mostrando un Blue Screen.

    Lo considero más un problema de Windows/Drivers que de programación, ya que el problema de agotamiento de recursos aparece simplemente cuando se ejecuta el siguiente código cuando el disco está lleno:
    for (int cnt=0; cnt<1000; cnt++)  
    {
         FILE* f = fopen("Hola.txt", "wb");
         if (f != NULL) fclose(); // Nunca llega  a ejecutarse esto porque f siempre es NULL.
    }

    Creo que puede deberse a un posible bug de Windows debido a un Leak en el Paged Pool.

         -> Uso Windows 7 Profesional 64 bits, en un i7 con 32 Gb de RAM.
         -> He desactivado el Paging File, para poder hacer mejor las pruebas de agotamiento de recursos.
         -> Mi aplicación está desarrollada en VC++.
    - Tengo una aplicación que necesita almancenar gran cantidad de datos en disco (SSD).
    - La memoria RAM ocupada por la aplicación se mantiene estable (inferior a 1Gb). La aplicación no tiene Leaks.
    - Conforme se almacenan datos, la memoria RAM aumenta. Según he visto, puede deberse al File Caching.
    - Si elimino algunos de los ficheros que han sido almacenados, se libera memoria RAM. Por lo que parece confirmar el punto anterior relativo a que la memoria incrementa debido al File Caching.
    - Si cierro la aplicación, sólo se libera la RAM que ésta ocupaba, que es inferior a 1Gb de RAM.
       * Pregunta 1: ¿Cómo limito el uso del File Caching?
       * Pregunta 2: ¿Puede ser perjudicial para mi caso, ya que mi aplicación necesita almacenar 24 horas gran cantidad de datos a disco, estando la tasa de transferencia a disco cercana al límite?
       * Pregunta 3: Lo más importante, si no lo limitase, y el File Caching ocupara toda la RAM, si alguna aplicación necesitara de pronto usar más memoria, ¿el File Caching liberaría memoria para dejársela a la aplicación o la aplicación fallaría? Hacer notar, que la memoria usada por el File Caching se muestra como 'En Uso', no como 'En Espera' (StandBy).
    Ahora comento mi verdadero problema:
    - Cuando se da el caso de que el disco se llena, y ya no hay espacio disponible, cada vez que se intenta crear el fichero para almacenar datos, con la instrucción de C fopen(), ésta devuelve NULL. EL error producido es 112 (no hay suficiente espacio en disco). Se aborta por tanto la escritura del fichero. Hasta ahí todo correcto.
    - Pero a lo largo del tiempo, observo que se va incrementando el PagedPool, hasta ocupar toda la memoria RAM.
    - Aunque reinicie mi aplicación, la memoria usada en el Paged Pool, no se reduce. Tampoco lo hace cuando elimino todos los ficheros del disco.
    Por lo que si el disco estuviera sin espacio durante el tiempo suficiente para que el Paged Pool ocupara toda la RAM, la única solución para liberar RAM es reiniciando Windows.
    Creo que esto puede deberse a un Leak en el Paged Pool durante la creación de ficheros (al menos con fopen) cuando se produce un error debido a que no hay espacio suficiente en disco (error 112).
    Le agradezco me confirmen este hecho y si hay alguna solución ya encontrada.
    De momento, mi solución pasa por comprobar antes de hacer el fopen el espacio disponible en disco (en ese caso, me preocupa especialmente la 'Pregunta 3', ya que aunque evite el posible Leak en el Paged Pool, si se termina llenando la RAM y no deja espacio para nada más, mi aplicación fallará). 
    Una posible solución puede ser limitar el espacio usado por el File Caching, pero no sé si esto afectará al rendimiento (Pregunta 2).
    Pregunta 4: ¿Y qué tal limitar el Paged Pool? ¿Es mejor o peor? ¿Está desaconsejado?
    Muchas gracias por adelantado y disculpen tan larga explicación.

    Filecahching no puedes eliminarlo y es dinamico en funcion del os recursos por lo que no puede ser fuente de error.

    Si el disco está lleno, tal y como comentas, el error es normal y puede sucerder en cualquier punto, bien de la aplicacion o bien en cualquier rutina del sistema. Un disco debe estar siempre al menos con el 15% de espacio libre.

    Con respecto a los posibles leaked de memoria, bien tuyos o bien de drivers de terceros (por ejemplo, el simple Diskeeper bastante usado como defragmentador en causante de perdidas de memoria), debes analizarlo con le herramienta Poolmon.exe del Windows Driver Kit. Puedes hacerlo de forma online para ver que etiqueta tiene la perdida de memoria y analizar psoteriormente el responsable de esa etiqueta.

    Con respecto al filecahcing, en caso de agotamiento de memoria entraria el mecanismo de paginacion con lo cual no es problema,. Unicamente debes saber que la memoria virtual de tu proceso estaria limitada a 2 GB si es de 32 bits y por encima de ella el proceso fallaria. Hay que hablar siempre de memoria virtual.. no de memoria real que no tiene sentido para el sistema.


    Jose Manuel Tella Llop news://jmtella.com

    • Propuesto como respuesta Uriel Almendra viernes, 8 de marzo de 2013 21:49
    • Marcado como respuesta Uriel Almendra lunes, 8 de abril de 2013 22:16
    martes, 5 de marzo de 2013 4:15