Los siguientes son el uso de memoria de mysql
y apache
respectivamente en mi servidor. Según la salida de pmap
say, mysql
está usando aproximadamente 379M y apache
está usando 277M.
[root@server ~]# pmap 10436 | grep total
total 379564K
[root@server ~]# pmap 10515 | grep total
total 277588K
Comparando esto con la salida de top
, veo que los valores son casi coincidentes.
PID USER PR NI VIRT RES SHR S %CPU %MEM TIME+ COMMAND
10515 apache 20 0 271m 32m 3132 S 0.0 6.6 0:00.73 /usr/sbin/httpd
10436 mysql 20 0 370m 21m 6188 S 0.0 4.3 0:06.07 /usr/libexec/mysqld --basedir=....
Ahora estos valores definitivamente no son el uso de memoria actual de esos dos procesos, ya que si lo hubiera hecho, habría excedido los 512M ram
en mi sistema y entiendo el hecho de que estos son el tamaño de las páginas asignadas a estos dos procesos y no realmente El tamaño de la memoria utilizada activamente por ellos. Ahora, cuando usamos pmap -x
, veo un color adicional Dirty
que muestra mucho menos uso de memoria para el proceso. Como se ve en el ejemplo que se muestra a continuación, el Dirty
color muestra 15 millones en comparación con 379 millones en el primer color. Mi pregunta es: ¿el valor bajo coloumn Dirty
es la cantidad 'real' de memoria utilizada activamente por ese proceso? Si no es así, ¿cómo podemos descubrir el uso real de la memoria de un proceso? No ps
y top
por las mismas razones anteriores. ¿Tenemos algo debajo/proc
eso le dará esta información?
[root@server ~]# pmap -x 10436 | grep total
total kB 379564 21528 15340
[root@server ~]#
[root@server ~]# free -m
total used free shared buffers cached
Mem: 489 447 41 0 52 214
-/+ buffers/cache: 180 308
Swap: 1023 0 1023
[root@server ~]#
fuente
Respuestas:
No hay ningún comando que proporcione el "uso de memoria real de un proceso" porque no existe el uso de memoria real de un proceso .
Cada página de memoria de un proceso podría ser (entre otras distinciones):
Creo que la cifra "sucia" suma todo lo que está en la RAM (no intercambio) y no está respaldado por un archivo. Esto incluye tanto la memoria compartida como la no compartida (aunque en la mayoría de los casos, aparte de bifurcar servidores, la memoria compartida consiste solo en archivos asignados a la memoria).
La información mostrada por
pmap
proviene de y . Ese es el uso real de la memoria del proceso: no se puede resumir en un solo número./proc/PID/maps
/proc/PID/smaps
fuente
Citaré algo que escribí en la página de manual para una aplicación que hace un análisis similar a la parte superior y extrae información de las mismas fuentes que
pmap
(por ejemplo/proc/[N]/maps
):pmap
principalmente le informa información sobre el espacio de direcciones virtuales . Su observación de que "los valores son casi coincidentes" en latop
salida presumiblemente se refiere a la figura VIRT, que es muy diferente a la figura RES. Estos corresponden exactamente a lo que he marcado "VirtualSz" y "ResidentSz" (el VIRT es para virtual, el RES es para residente).No, pero más o menos. La memoria "sucia" se refiere a los datos que se han cargado desde el disco y posteriormente modificados; Como se ha modificado, debe formar parte de la memoria residente porque estos cambios se almacenan actualmente en la RAM. Sin embargo, no es sinónimo de ello.
fuente
La memoria virtual es como los números de marcación rápida, excepto que hay alrededor de 3 mil millones o ellos (para el sistema de 32 bits, 4 mil millones para la aplicación de 32 bits en el núcleo de 64 bits, mucho más para la aplicación de 64 bits), y no puede marcar números directamente, tienen para ser mapeado a marcación rápida.
Varios procesos pueden tener asignaciones diferentes (números de marcación rápida) para la misma dirección (números de teléfono). Por ejemplo, pueden compartir varias bibliotecas, así que tenga direcciones virtuales para toda la biblioteca (puede ver eso en pmap). Incluso pueden compartir el mismo ejecutable, por ejemplo, 2 instancias de bash.
Hasta ahora, esto explica cómo puede encajar el sub de todas las direcciones virtuales, pero hay más. Un proceso puede tener tanta memoria virtual que no debería caber, ¿cómo? Es posible que algunas partes de una biblioteca o archivos ejecutables no se usen, no se copiarán del disco a la memoria RAM, o la memoria RAM se llena y los bits que se cargaron desde el disco se caen, porque pueden volver a buscarse desde el disco si es necesario, o la memoria que no está respaldada, mi disco se asigna para intercambiar, se copia para intercambiar y luego se cae. Luego se puede leer desde el intercambio si es necesario. Si alguna de estas últimas estrategias se usa demasiado, el sistema se vuelve lento.
fuente