Problema relacionado con el disco o la memoria

Al igual que una gran parte de la memoria real está disponible para los archivos de almacenamiento intermedio, el espacio de página del sistema está disponible como almacenamiento temporal para los datos de trabajo del programa que se han forzado a salir de la RAM.

Suponga que tiene un programa que lee pocos o ningún dato y que, sin embargo, muestra los síntomas de ser dependiente de E/S. Peor aún, la proporción de tiempo real para tiempo usuario + sistema no mejora con las ejecuciones sucesivas. El programa está probablemente limitado por la memoria y su E/S es a, y posiblemente desde, el espacio de paginación. Se muestra una forma de comprobar esta posibilidad en el siguiente script de shell de vmstatit:
vmstat -s >temp.file   # cumulative counts before the command
time $1                # command under test
vmstat -s >>temp.file  # cumulative counts after execution
grep "pagi.*ins" temp.file >>results   # extract only the data
grep "pagi.*outs" temp.file >>results  # of interest

El script vmstatit resume el voluminoso informe vmstat -s, que proporciona recuentos acumulativos para una serie de actividades del sistema desde que se inició el sistema.

Si el script de shell se ejecuta de la siguiente manera:
# vmstatit "cp file1 file2"  2>results
el resultado es el siguiente:
real    0m0.03s
user    0m0.01s
sys     0m0.02s
     2323 paging space page ins
     2323 paging space page ins
     4850 paging space page outs
     4850 paging space page outs
Las estadísticas de paginación anteriores y posteriores son idénticas, lo que confirma nuestra creencia de que el mandato cp no está vinculado por paginación. Se puede utilizar una variante ampliada del script de shell vmstatit para mostrar la verdadera situación, como se indica a continuación:
vmstat -s >temp.file
time $1
vmstat -s >>temp.file
echo "Ordinary Input:"               >>results
grep "^[ 0-9]*page ins"    temp.file >>results
echo "Ordinary Output:"              >>results
grep "^[ 0-9]*page outs"   temp.file >>results
echo "True Paging Output:"           >>results
grep "pagi.*outs"          temp.file >>results
echo "True Paging Input:"            >>results
grep "pagi.*ins"           temp.file >>results
Debido a que la E/S de archivo en el sistema operativo se procesa a través del VMM, el mandato vmstat -s informa de la E/S del programa normal como entradas de página y salidas de página. Cuando se ejecutó la versión anterior del script de shell vmstatit en el mandato cp de un archivo grande que no se había leído recientemente, el resultado fue el siguiente:
real    0m2.09s
user    0m0.03s
sys     0m0.74s
Ordinary Input:
    46416 page ins
    47132 page ins
Ordinary Output:
   146483 page outs
   147012 page outs
True Paging Output:
     4854 paging space page outs
     4854 paging space page outs
True Paging Input:
     2527 paging space page ins
     2527 paging space page ins

La salida del mandato time confirma la existencia de una dependencia de E/S. El aumento de entradas de página muestra la E/S necesaria para satisfacer el mandato cp. El aumento de las salidas de página indica que el archivo es lo suficientemente grande como para forzar la escritura de páginas sucias (no necesariamente las suyas) de la memoria. El hecho de que no haya ningún cambio en los recuentos de E/S de espacio de paginación acumulados confirma que el mandato cp no crea estructuras de datos lo suficientemente grandes como para sobrecargar la memoria de la máquina de prueba.

El orden en el que esta versión del script de vmstatit muestra la E/S es intencionada. Los programas típicos leen la entrada del archivo y luego escriben la salida del archivo. La actividad de paginación, por otra parte, normalmente empieza con la escritura de una página de segmento de trabajo que no se ajusta. La página se vuelve a leer solo si el programa intenta acceder a la misma. El hecho de que el sistema de prueba haya experimentado casi el doble depaging space page outsaspaging space page insdesde que se arrancó indica que al menos algunos de los programas que se han ejecutado en este sistema han almacenado datos en la memoria a los que no se ha accedido de nuevo antes del final del programa. Programas con memoria limitada proporciona más información. Véase también Rendimiento de memoria.

Para mostrar los efectos de la limitación de memoria en estas estadísticas, el ejemplo siguiente observa un mandato determinado en un entorno de memoria adecuada (32 MB) y, a continuación, reduce artificialmente el sistema utilizando el mandato rmss (consulte Evaluación de requisitos de memoria con el mandato rmss). La secuencia de mandatos siguiente
# cc -c ed.c
# vmstatit "cc -c ed.c" 2>results
primera examina la memoria con el archivo fuente línea 7944 y el archivo ejecutable del compilador C, después mide la actividad de E/S de la segunda ejecución:
real    0m7.76s
user    0m7.44s
sys     0m0.15s
Ordinary Input:
    57192 page ins
    57192 page ins
Ordinary Output:
   165516 page outs
   165553 page outs
True Paging Output:
    10846 paging space page outs
    10846 paging space page outs
True Paging Input:
     6409 paging space page ins
     6409 paging space page ins
Claramente, esto no es un sistema limitado por E/S. No hay ninguna E/S necesaria para leer el código fuente. Si luego emitimos el siguiente mandato:
# rmss -c 8
para cambiar el tamaño efectivo de la máquina a 8 MB y realizamos la misma secuencia de mandatos, obtenemos la siguiente salida:
real    0m9.87s
user    0m7.70s
sys     0m0.18s
Ordinary Input:
    57625 page ins
    57809 page ins
Ordinary Output:
   165811 page outs
   165882 page outs
True Paging Output:
    11010 paging space page outs
    11061 paging space page outs
True Paging Input:
     6623 paging space page ins
     6701 paging space page ins

Los siguientes síntomas de dependencia de E/S están presentes:

  • El tiempo transcurrido es mayor que el tiempo total de CPU
  • Cantidades significativas de E/S ordinaria en la enésima ejecución del mandato
El hecho de que el tiempo transcurrido sea más largo que en la situación sin restricciones de memoria y la existencia de cantidades significativas de E/S de espacio de paginación dejan claro que el compilador está siendo obstaculizado por la falta de memoria.
Nota: Este ejemplo ilustra los efectos de la restricción de memoria. No se ha realizado ningún esfuerzo para minimizar el uso de la memoria por otros procesos, por lo que el tamaño absoluto al que el compilador se ha visto obligado a paginar en este entorno no constituye una medida significativa.
Para evitar trabajar con una máquina colapsada artificialmente hasta el siguiente reinicio, ejecute
# rmss -r

para devolver al sistema operativo la memoria que ha tomado el mandato rmss, restaurando así el sistema a su capacidad normal.