1 votos

¿A partir de qué se calcula la memoria de la aplicación?

Estoy tratando de usar Geektool para mantener un control de funcionamiento en mi sistema, y quería incluir el uso de la memoria adecuada en mis estadísticas. Estoy usando el Monitor de Actividad como la base de mi monitorización de la memoria, pero me estoy encontrando con un problema.

Puedo encontrar y calcular con precisión la memoria cableada utilizando el siguiente comando:

vm_stat | grep wired | awk '{print $4*4096/1024/1024/1024"GB"}'

Sin embargo, no puedo obtener un cálculo preciso de la memoria de la aplicación. He tratado de sumar diferentes porciones del comando vm_stat para mostrar la memoria de la aplicación, pero parece que nunca suma.

También he tratado de obtener la memoria utilizada tratando de calcular la utilizada, pero siempre vuelve con más uso de la memoria que los informes del Monitor de Actividad. He buscado en Internet, y todo el sitio web de Apple dice que la memoria de la aplicación es la memoria utilizada por las aplicaciones y los procesos de fondo, que no es realmente útil.

¿Hay alguna combinación de páginas vm_stat que sume la memoria utilizada o la memoria de la aplicación para poder mostrar correctamente el uso de la memoria en mi geeklet?

2voto

user43889 Puntos 266

Después de algunas frustraciones, creo que tengo la respuesta.

vm_stat es sólo una parte de la imagen, también necesitamos:

$ sysctl vm.page_pageable_internal_count

La memoria de la aplicación es entonces:

page_pageable_internal_count - Páginas purgables (de vm_stat)

Este script de Python obtiene todo vm_stat, trozos de sysctl, y lo imprime todo de forma bonita. Las últimas 6 líneas dan los mismos números que el Monitor de Actividad.

#!/usr/bin/python

import sys
import subprocess
import re

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

# vm_stat (get all results)
vm = subprocess.Popen(['vm_stat'], stdout=subprocess.PIPE).communicate()[0]

vmLines = vm.split('\n')
sep = re.compile(':[\s]+')
vmStats = {}
for row in range(1,len(vmLines)-2):
    rowText = vmLines[row].strip()
    rowElements = sep.split(rowText)
    vmStats[(rowElements[0])] = int(rowElements[1].strip('\.')) * 4096

# sysctl  (just get a couple of numbers)
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])   # This is Mbytes

appMemory = page_pageable_internal_count - vmStats["Pages purgeable"] 

print 'Wired Memory:\t\t%9.3f GB' % ( vmStats["Pages wired down"] * f )
print 'Active Memory:\t\t%9.3f GB' % ( vmStats["Pages active"] * f )
print 'Inactive Memory:\t%9.3f GB' % ( vmStats["Pages inactive"] * f )
print 'Speculative:\t\t%9.3f GB' % ( vmStats["Pages speculative"] * f )
print 'Throttled:\t\t%9.3f GB' % ( vmStats["Pages throttled"] * f )
print 'Free Memory:\t\t%9.3f GB' % ( vmStats["Pages free"] * f )

print 'Compressor:\t\t%9.3f GB' % ( vmStats["Pages occupied by compressor"] * f )
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"]) * f )
print ''
print 'Compressed:\t\t%9.3f GB' % ( vmStats["Pages stored in compressor"] * f )
print 'Purgeable:\t\t%9.3f GB' % ( vmStats["Pages purgeable"] * f )
print 'File-backed:\t\t%9.3f GB' % ( vmStats["File-backed pages"] * f )
print 'Anonymous:\t\t%9.3f GB' % ( vmStats["Anonymous pages"] * f )
print ''
print 'Pageable Internal:\t%9.3f GB' % (page_pageable_internal_count * f) 
print ''

print 'App Memory:\t\t%9.3f GB' % ( appMemory * f )
print 'Wired Memory:\t\t%9.3f GB' % ( vmStats["Pages wired down"] * f )
print 'Compressor:\t\t%9.3f GB  %9.3f MB' % ( vmStats["Pages occupied by compressor"] * f ,vmStats["Pages occupied by compressor"] * 1/(1024*1024) )
print 'Memory Used:\t\t%9.3f GB' % ( (appMemory + vmStats["Pages wired down"] + vmStats["Pages occupied by compressor"] ) * f )
print 'Cached Files:\t\t%9.3f GB' % ( (vmStats["File-backed pages"] + vmStats["Pages purgeable"]) * f )
print 'Swap Used:\t\t%9.3f GB  %9.3f MB' % ( swapUsed * 0.0009765625, swapUsed )

sys.exit(0);

Los extraños factores de manipulación se deben a que un MB es 1024*1024 y un GB es 1024*1024*1024. Un GB no es 1000 veces un MB.

Hace tiempo que tengo la mayor parte de este script. La última pieza del rompecabezas se derivó de https://stackoverflow.com/questions/31469355/how-to-calculate-app-and-cache-memory-like-activity-monitor-in-objective-c-in-ma

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