7 votos

¿Existe una herramienta de línea de comandos que describa con precisión la cantidad de memoria utilizada?

Por "describir con precisión la cantidad de memoria utilizada", me refiero a si informa (o se puede calcular) la misma cantidad de uso de memoria que se describe en el Monitor de Actividad.

Activity monitor memory use: 14.20 gb

Mi intención es encontrar un método para acceder mediante programación a la cantidad de memoria física utilizada en el sistema. En .NET Core 3.1 en Mac, esto es imposible. Mi siguiente opción es consultar una herramienta de línea de comandos. Mi preocupación es que las cifras reportadas a continuación no suman 14,20 GB de memoria utilizada como se espera en la captura de pantalla anterior. Por eso afirmo que son inexactas.

A continuación se muestra lo que he probado hasta ahora y por qué esto no es una pregunta duplicada. Todos los comandos se ejecutaron con un segundo de diferencia entre ellos después de tomar la captura de pantalla anterior.

  • ¿Existe una versión para Mac OS X Terminal del comando "free" en los sistemas Linux? La respuesta aceptada de Python script no proporciona números precisos. "Real Mem Total" (que se calcula sumando los rss de todos los procesos en ejecución y convirtiéndolos en bytes) sale 11,2 GB cuando en realidad estoy usando 14,20 GB.

    Wired Memory: 5247 MB Active Memory: 4170 MB Inactive Memory: 3813 MB Free Memory: 609 MB Real Mem Total (ps): 11226.922 MB

  • top El campo "PhysMem" afirma que estoy usando 15 GB en mi sistema está en uso. Esto es algo cercano, pero tiene un redondeo muy aproximado y a veces redondea hasta 16 GB en uso.

    PhysMem: 15G used (5269M wired), 960M unused.

  • ¿Cómo calcular la memoria utilizada en Mac OS mediante la línea de comandos? La única respuesta describe vm_stat que es inexacta y no responde adecuadamente a la pregunta. He leído en la web que para obtener la cantidad de memoria utilizada, hay que sumar las filas "Activa", "Inactiva" y "Desconectada", y luego multiplicarla por el tamaño de la página. En esta máquina Catalina, el resultado es de 13,8 GB (resultado de abajo). Aún así está cerca, pero este cálculo está fuera de lugar por más de un GB en otra máquina Catalina.

    Mach Virtual Memory Statistics: (page size of 4096 bytes) Pages free: 161443. Pages active: 1065326. Pages inactive: 974107. Pages speculative: 89929. Pages throttled: 0. Pages wired down: 1343201. Pages purgeable: 18630. "Translation faults": 2149730807. Pages copy-on-write: 123210957. Pages zero filled: 965651547. Pages reactivated: 129523087. Pages purged: 3285194. File-backed pages: 292639. Anonymous pages: 1836723. Pages stored in compressor: 3394212. Pages occupied by compressor: 559818. Decompressions: 166263782. Compressions: 206698757. Pageins: 358184714. Pageouts: 10064704. Swapins: 123517427. Swapouts: 126184348.

  • memory_pressure no parece proporcionar ninguna información precisa relacionada con el uso de la memoria. El "Porcentaje de memoria libre en todo el sistema" dice ser del 54%, pero hay 14,2 / 16 GB en uso.

    The system has 2147483648 (524288 pages with a page size of 4096).

    Stats: Pages free: 162828 Pages purgeable: 16659 Pages purged: 3285194

    Swap I/O: Swapins: 123517427 Swapouts: 126184348

    Page Q counts: Pages active: 1062737 Pages inactive: 972247 Pages speculative: 89910 Pages throttled: 0 Pages wired down: 1346397

    Compressor Stats: Pages used by compressor: 559818 Pages decompressed: 166263778 Pages compressed: 206698757

    File I/O: Pageins: 358184697 Pageouts: 10064704

    System-wide memory free percentage: 54%

15voto

user43889 Puntos 266

La respuesta estricta (bastante trillada) a la pregunta es que la cantidad de memoria que se utiliza es igual a la cantidad de memoria física. Pero seamos más útiles y obtengamos algunas respuestas sobre cómo se está utilizando esa memoria física.

Para complicar las cosas, hay al menos dos formas de conjuntos de números que se suman a la memoria física:

  • Estilo "tradicional" de unix con cableado, activo, inactivo, libre, etc. con adiciones para la memoria comprimida.
  • "Monitor de actividad" que introduce la memoria de la aplicación.

Los números que necesitamos pueden extraerse de los resultados de estos comandos:

  • vm_stat que nos da la mayor parte de lo que necesitamos,
  • números seleccionados de sysctl y
  • memory_pressure de los cuales sólo uso un número.

Los resultados de estos comandos se solapan con los del memory_pressure presenta más bien la inversa de la presión del Monitor de Actividad.

Presión de la memoria es sólo un número que proporciona una forma sencilla de indicar la carga de memoria. Se puede calcular a partir de vm_stat resultados o simplemente tomados de memory pressure . No debemos preocuparnos demasiado por su interpretación física: es sólo un número indicativo.

Pido disculpas por adelantado porque utilizo un script de Python para recoger los datos y presentarlos en un formato digerible. Primero los resultados.

En mi MacBook de 8 GB, ahora mismo me sale esto:

Traditional memory:
Wired Memory:           2.174 GB
Active Memory:          2.428 GB
Inactive Memory:        2.359 GB
Speculative:            0.067 GB
Throttled:              0.000 GB
Free Memory:            0.016 GB
Compressed:             0.937 GB
Total:                  7.981 GB

Activity Monitor memory
App Memory:             2.586 GB
Wired Memory:           2.174 GB
Compressed:             0.937 GB
Memory Used:            5.698 GB
Cached Files:           2.268 GB
Total:                  7.981 GB

Swap Used:              0.508 GB    520.000 MB
Memory Pressure:        3.1   GB     39 percent

Así pues, dos formas de presentar los números que suman casi 8 GB. Los números están todos en tamaños de RAM que se basan en potencias de 2, es decir, 1KB de RAM son 1024 bytes.

Además, al final, el intercambio utilizado y la presión de la memoria.

Tenga en cuenta que "Comprimido" significa la RAM física que es utilizada por el Compresor que ha comprimido una cantidad esperablemente mayor de RAM sin comprimir.

Aquí está el (no muy elegante) Python script:

#!/usr/bin/python

import sys, subprocess, re

f1 = 0.00000000093132257    # 1/(1024*1024*1024) Converts bytes to GB

# Get memory info from VM_STAT andprocess into a dictionary
vm = subprocess.Popen(['vm_stat'], stdout=subprocess.PIPE).communicate()[0]
# Process vm_stat
vmLines = vm.split('\n')
sep = re.compile(':[\s]+')
vmStats = {}
for row in range(1,len(vmLines)-2):
    rowElements = sep.split(vmLines[row].strip())
    vmStats[(rowElements[0])] = int(rowElements[1].strip('\.')) * 4096

# 2 quantities from sysctl
sy = subprocess.Popen(['sysctl','vm.page_pageable_internal_count'], stdout=subprocess.PIPE).communicate()[0]
p1 = sy.find(':')
page_pageable_internal_count = float(sy[p1+1:50]) * 4096
sy = subprocess.Popen(['sysctl','vm.swapusage'], stdout=subprocess.PIPE).communicate()[0]
p1 = sy.find('used')
p2 = sy.find('M',p1)
swapUsed = float(sy[p1+7:p2])   # MBytes

# Pressure - just get the pressure value
sy = subprocess.Popen(['memory_pressure'], stdout=subprocess.PIPE).communicate()[0]
p1 = sy.find('tage:')
p2 = sy.find('%')
mp = 100 - int(sy[p1+6:p2])

# There are 2 tricks to get Activity Monitor's App Memory (which is best?)
#appMemory = page_pageable_internal_count - vmStats["Pages purgeable"] 
appMemory = vmStats["Anonymous pages"] - vmStats["Pages purgeable"] 

print 'Traditional memory:'
print 'Wired Memory:\t\t%9.3f GB' % ( vmStats["Pages wired down"] * f1 )
print 'Active Memory:\t\t%9.3f GB' % ( vmStats["Pages active"] * f1 )
print 'Inactive Memory:\t%9.3f GB' % ( vmStats["Pages inactive"] * f1 )
print 'Speculative:\t\t%9.3f GB' % ( vmStats["Pages speculative"] * f1 )
print 'Throttled:\t\t%9.3f GB' % ( vmStats["Pages throttled"] * f1 )
print 'Free Memory:\t\t%9.3f GB' % ( vmStats["Pages free"] * f1 )
print 'Compressed:\t\t%9.3f GB' % ( vmStats["Pages occupied by compressor"] * f1 )
# These add up close to phyical RAM
print 'Total:\t\t\t%9.3f GB' % ( (vmStats["Pages free"] + vmStats["Pages wired down"] + vmStats["Pages active"] + vmStats["Pages inactive"] + vmStats["Pages speculative"] + vmStats["Pages throttled"] + vmStats["Pages occupied by compressor"]) * f1 )
print ''
print 'Activity Monitor memory'
print 'App Memory:\t\t%9.3f GB' % ( appMemory * f1 )
print 'Wired Memory:\t\t%9.3f GB' % ( vmStats["Pages wired down"] * f1 )
print 'Compressed:\t\t%9.3f GB' % ( vmStats["Pages occupied by compressor"] * f1 )
print 'Memory Used:\t\t%9.3f GB' % ( (appMemory + vmStats["Pages wired down"] + vmStats["Pages occupied by compressor"] ) * f1 )
print 'Cached Files:\t\t%9.3f GB' % ( (vmStats["File-backed pages"] + vmStats["Pages purgeable"]) * f1 )
# and these add up to physical rAM
print 'Total:\t\t\t%9.3f GB' % ( (appMemory + vmStats["Pages wired down"] + vmStats["Pages occupied by compressor"] + vmStats["File-backed pages"] + vmStats["Pages purgeable"] + vmStats["Pages free"]) * f1)
print ''
print 'Swap Used:\t\t%9.3f GB  %9.3f MB' % ( swapUsed * 0.0009765625, swapUsed )
print 'Memory Pressure:\t%7.1f   GB %6.0f percent' % ( (appMemory + vmStats["Pages wired down"] + vmStats["Pages occupied by compressor"] + vmStats["File-backed pages"] + vmStats["Pages purgeable"] + vmStats["Pages free"]) * f1 * mp / 100, mp) 

sys.exit(0);

Utilizo un script muy similar llamado por el snmpd para proporcionar información a Cactus . Esto muestra la actividad en formato gráfico, así:

Cacti

Esto es para las últimas 24 horas (mi MacBook estaba durmiendo durante parte de eso) con los números siendo los valores más recientes de cada parámetro.

AppleAyuda.com

AppleAyuda es una comunidad de usuarios de los productos de Apple en la que puedes resolver tus problemas y dudas.
Puedes consultar las preguntas de otros usuarios, hacer tus propias preguntas o resolver las de los demás.

Powered by:

X