Estoy un poco confundido sobre algunos de los resultados que estoy viendo de ps y gratis .
En mi servidor, este es el resultado de free -m
[root@server ~]# free -m
total used free shared buffers cached
Mem: 2048 2033 14 0 73 1398
-/+ buffers/cache: 561 1486
Swap: 2047 11 2036
Comprendo que Linux gestiona la memoria es que almacenará el uso del disco en la RAM, de modo que cada acceso posterior sea más rápido. Creo que esto está indicado por las columnas "en caché". Además, se almacenan varios búferes en la RAM, indicados en la columna "búferes".
Entonces, si entiendo correctamente, se supone que el uso "real" es el valor "usado" de "- / + buffers / cache", o 561 en este caso.
Asumiendo que todo eso es correcto, la parte que me arroja es el resultado de ps aux
.
Según tengo entendido, los ps
resultados son que la sexta columna (RSS) representa el tamaño en kilobytes que el proceso usa para la memoria.
Entonces cuando ejecuto este comando:
[root@server ~]# ps aux | awk '{sum+=$6} END {print sum / 1024}'
1475.52
¿No debería ser el resultado la columna "usada" de "- / + buffers / cache" de free -m
?
Entonces, ¿cómo puedo determinar correctamente el uso de memoria de un proceso en Linux? Aparentemente mi lógica es defectuosa.
htop
autor a una pregunta similar que tuve el otro día ... Cómo calcular el uso de memoria desde / proc / meminfo (como htop)Respuestas:
Este exacta misma pregunta se hizo en serverfault el otro día :-)
El sistema de memoria virtual de Linux no es tan simple. No puede simplemente sumar todos los campos RSS y obtener el valor informado
used
porfree
. Hay muchas razones para esto, pero llegaré a algunas de las más importantes.Cuando un proceso se bifurca, tanto el padre como el hijo se mostrarán con el mismo RSS. Sin embargo, Linux emplea
copy-on-write
para que ambos procesos realmente estén usando la misma memoria. Solo cuando uno de los procesos modifica la memoria, en realidad se duplicará. Entonces esto hará que elfree
número sea más pequeño que latop
suma RSS.El valor RSS no incluye memoria compartida. Debido a que la memoria compartida no es propiedad de ningún proceso,
top
no la incluye en RSS. Entonces esto hará que elfree
número sea mayor que latop
suma RSS.fuente
shmget
ommap
. La redacción en torno a la memoria es muy complicada. Usar la palabra incorrecta en el lugar equivocado puede arruinar totalmente el significado de una oración.Si está buscando números de memoria que sumen, eche un vistazo a smem :
Por ejemplo aquí:
También lo
PSS
es la columna interesante aquí porque tiene en cuenta la memoria compartida.A diferencia de
RSS
esto es significativo sumarlo. Aquí obtenemos un total de 654Mb para procesos de usuario.La salida de todo el sistema informa sobre el resto:
Entonces, 1Gb de RAM total = 654Mb de procesos de usuario + 346Mb kernel mem + 16Mb gratis
(más o menos Mb)
En general, aproximadamente la mitad de la memoria se usa para caché (494Mb).
Pregunta adicional: ¿qué es la caché de userland vs la caché del kernel aquí?
por cierto para algo intento visual:
fuente
Una herramienta realmente buena es la
pmap
que enumera el uso actual de la memoria para un determinado proceso:Para obtener más información al respecto, consulte la página del manual
man pmap
y también eche un vistazo a las 20 herramientas de monitoreo del sistema Linux que todo SysAdmin debe conocer , que enumeran las excelentes herramientas que siempre uso para obtener información sobre mi caja de Linux.fuente
free
te dice.pmap -x PID
también incluye una columna RSS que a menudo es bastante útil para tener una idea de dóndetop
proviene la suma RSS de un proceso (como se observa, por ejemplo, a través de).Corre arriba, presiona
h
para obtener ayuda y luegof
agrega campos. puede agregar los siguientes campos:RSS
cantidad de memoria física que usa la aplicaciónCODE
cantidad total de memoria que usa el código ejecutable del procesoDATA
- cantidad total de memoria (kb) dedicada a los datos y la pila de un procesoEntre estos 3 deberías tener resultados bastante precisos. También puede usar reemplazos más detallados para la parte superior que recomiendo
htop
oatop
.Editar: Casi se me olvida si quieres información realmente detallada. Encuentre el PID y obtenga el siguiente archivo.
PID=123
cat /proc/123/status
Edición 2: si puede encontrarlo o tenerlo en el libro:
-tiene una sección Capítulo 5: Herramientas de rendimiento: memoria específica del proceso -tiene mucha más información de la que nunca desearía.
fuente
ps
le brinda la cantidad de memoria utilizada por cada proceso. Parte de esa memoria son archivos mmapped, que cuentan bajo caché. Parte de esa memoria (especialmente el código) se comparte con otros procesos, por lo que si suma los valores RSS, se cuenta varias veces.No hay una respuesta correcta a “¿cuánta memoria usa este proceso?”, Porque no depende solo del proceso, sino que también depende del entorno. Hay muchos valores diferentes que podría llamar el "uso de memoria" del proceso, y no coinciden ni se suman porque están contando cosas diferentes.
fuente
Como otros han señalado correctamente, es difícil controlar la memoria real utilizada por un proceso, con regiones compartidas y archivos mmap'ed y demás.
Si eres un experimentador, puedes ejecutar valgrind y macizo . Esto puede ser un poco pesado para el usuario casual, pero con el tiempo obtendrá una idea del comportamiento de la memoria de una aplicación. Si una aplicación malloc () es exactamente lo que necesita, esto le dará una buena representación del uso real de la memoria dinámica de un proceso. Pero este experimento puede ser "envenenado".
Para complicar las cosas, Linux le permite comprometer en exceso su memoria. Cuando malloc () memoria, estás indicando tu intención de consumir memoria. Pero la asignación realmente no sucede hasta que escribe un byte en una nueva página de su "RAM" asignada. Puedes probarte esto escribiendo y ejecutando un pequeño programa en C como este:
Ejecuta esto en una máquina con menos de 16 GB de RAM y, ¡listo !, acabas de obtener 16 GB de memoria! (no en realidad no).
Observe
top
que ve "VIRT" como 16.004G pero% MEM es 0.0Ejecute esto de nuevo con valgrind:
Y el macizo dice "suma de todos los alocs () = 16GB". Entonces eso no es muy interesante.
PERO, si lo ejecutas en un proceso sensato :
Y aquí vemos (muy empíricamente y con mucha confianza) que el compilador asignó 77 KB de almacenamiento dinámico.
¿Por qué esforzarse tanto para obtener solo el uso del montón? Debido a que todos los objetos compartidos y las secciones de texto que usa un proceso (en este ejemplo, el compilador) no son terriblemente interesantes. Son gastos generales constantes para un proceso. De hecho, las invocaciones posteriores del proceso casi son "gratis".
Además, compare y contraste lo siguiente:
MMAP () un archivo de 1GB. Su tamaño de VMS será de 1 + GB. Pero su Tamaño de conjunto residente solo serán las partes del archivo en las que causó que se pagine (al desreferenciar un puntero a esa región). Y si "lee" todo el archivo, para cuando llegue al final, es posible que el núcleo ya haya paginado los comienzos (esto es fácil de hacer porque el núcleo sabe exactamente cómo / dónde reemplazar esas páginas si se desreferencia de nuevo ) En cualquier caso, ni VMSize ni RSS son un buen indicador del "uso" de su memoria. En realidad no has malloc () editado nada.
Por el contrario, Malloc () y toque MUCHA memoria, hasta que su memoria se cambie al disco. Entonces su memoria asignada ahora excede su RSS. Aquí, su VMSize podría comenzar a decirle algo (su proceso posee más memoria de la que realmente reside en su RAM). Pero aún es difícil diferenciar entre VM que son páginas compartidas y VM que son datos intercambiados.
Aquí es donde Valgrind / Macizo se pone interesante. Le muestra lo que ha asignado intencionalmente (independientemente del estado de sus páginas).
fuente
Pruebe esto: le dará la RAM total realmente utilizada por todo el proceso que se ejecuta en MB
fuente
size
reportado porps
tiene poca relación con el uso de memoria real. Es el tamaño virtual de cada proceso que no necesariamente se asigna a la memoria. Tampoco incluye algunos segmentos que están asignados.Le mostrará cuánta memoria usuario por usuario.
fuente
Use este comando para encontrar la utilización de la memoria en%.
Memoria utilizada:
memoria libre
fuente
grep
simplemente se sentará allí esperando la entrada.free -m | grep Mem | awk '{print $3/$2 * 100.0}'