¿A qué escala o medida se adhiere la "presión de memoria" de Mavericks y Yosemite?
57
El Monitor de actividad de Mavericks (y también de Yosemite) muestra un nuevo diagrama, la presión de la memoria . Lamentablemente, su texto de ayuda solo explica vagamente qué mide exactamente. ¿Cómo se calcula la presión de memoria?
Los credenciales de las imágenes van a esta respuesta de una pregunta de la encuesta sobre la mejor característica nueva de Mavericks.
La presión de la memoria no es un simple indicador del porcentaje de memoria libre y parece ser un gráfico de 0 a 100%. El sysctlvalor de vm.memory_pressurese calcula en relación con un objetivo calculado que rastrea la relación entre las páginas de memoria libres e inactivas y las páginas cableadas y activas. Los contadores absolutos se ven utilizando la vm_statherramienta de línea de comandos para inspeccionar la asignación detallada de la memoria virtual. Jonathan Levin tiene una excelente documentación en http://newosxbook.com/articles/MemoryPressure.html que cubre tanto la memoria virtual de macOS como de iOS y cómo calculan la presión de la memoria, así como las acciones que se toman cuando el índice de presión es alto.
La memoria virtual relevante (vm) que alimenta el cálculo de vm.memory_pressureson:
vm.page_free_count - un recuento absoluto de páginas gratuitas
vm.vm_page_free_target - un objetivo u objetivo calculado para una situación "libre de presión"
vm.page_free_wanted - qué le gustaría liberar al sistema vm para aliviar el índice de presión calculado actual
Entonces, si está rastreando la presión de su memoria con el Monitor de actividad (o si estoy verificando los valores de sysctl mediante programación o en el shell de la línea de comando), haría bien en observar estos cuatro valores:
sysctl -a vm | egrep "page_free|pressure"
Se memory_pressureintrodujo un nuevo comando con Mavericks y cuando lo ejecuto para llevar el subsistema de memoria a un estado de advertencia, puede ver que la presión de la memoria aumenta a un rango amarillo.
La herramienta asignado alrededor de 4 GB de memoria a la herramienta como el gráfico de presión aumentó constantemente a este estado donde aparentemente se representa gráficamente el nivel de "alerta": sudo memory_pressure -l warn. Como puede ver, el sistema antes de que la presión usara 5.9 GB y después usaba hasta 7.99 GB, lo que ni siquiera necesita sumarse debido al intercambio y la compresión.
Después de ver cómo se vm_stat 15mostró el resultado de la advertencia en una paginación no medible, salí de la herramienta (Control-C) y luego volví a ejecutar la herramienta para hacer que la presión de la memoria sea crítica:sudo memory_pressure -l critical
No dejé que esto se ejecutara durante más de unos minutos mientras se iniciaba la paginación y una vez que la herramienta dijo que tenía 5 GB de RAM paginada en el disco, no quería llenar mi unidad y cerrar la herramienta.
Puede observar qué tan rápido el sistema liberó RAM después de que finalizó la advertencia y también cómo se estrelló en territorio "rojo" para mostrar que el sistema de memoria virtual no podía comprimir suficientes páginas para evitar el intercambio en el disco. Mi suposición educada es roja sobre la presión indica el intercambio y la sobreasignación dramática y / o un momento en que las páginas libres están por debajo de la cantidad que el sistema prefiere y está purgando activamente las páginas inactivas y / o intercambiando las páginas que se espera que se usen para intercambiar. Del mismo modo, el sistema se recupera rápidamente una vez que se liberan las asignaciones y se elimina la presión del sistema de memoria virtual.
Gracias por la aclaración. Me gustaría saber si hay un comando (o un conjunto de comandos) que calcule los parámetros de Memoria virtual, Caché de archivos y Memoria de aplicaciones en la captura de pantalla anterior.
Muhammad Hassan Nasr
@MuhammadHassan La respuesta a continuación cubre un buen resumen de ingeniería inversa del algoritmo y señala dónde buscar en xnucódigo abierto las partes internas. Extraje los 4 valores cubiertos que son más relevantes para la visualización de la presión de la GUI.
bmike
30
Para aclarar un poco y hacer que esa suposición sea más precisa: la presión de la memoria es una métrica utilizada por el núcleo (xnu) con un hilo dedicado llamado memory_status (anteriormente conocido como Jetsam). Este hilo es responsable de detectar cuándo la RAM disponible es baja, lo que en OS X puede forzar el intercambio, y en iOS mata la aplicación que consume más memoria (ya que no hay intercambio). En Mavericks, los dos sistemas operativos están más juntos. Memorystatus emite una nota de kernel, que el tiempo de ejecución Obj-C eventualmente se traduce en una appDidReceiveLowMemoryWarning. Se supone que las aplicaciones purgan la memoria no utilizada o extraña (por ejemplo, cachés). La libC de Darwin también purga la memoria automáticamente.
Hay una llamada específica (aunque no documentada) del sistema, vm_pressure_monitor (# 296, si no recuerdo mal), que le permite al cliente escuchar eventos de presión y ver cuántas páginas físicas se pueden reclamar.
Puede ver eventos de presión en Mavericks utilizando Process Explorer para OS X, descargable desde http://newosxbook.com/index.php?page=downloads . Eso te muestra el "manómetro" de presión, así como los eventos de presión.
xnu
código abierto las partes internas. Extraje los 4 valores cubiertos que son más relevantes para la visualización de la presión de la GUI.Para aclarar un poco y hacer que esa suposición sea más precisa: la presión de la memoria es una métrica utilizada por el núcleo (xnu) con un hilo dedicado llamado memory_status (anteriormente conocido como Jetsam). Este hilo es responsable de detectar cuándo la RAM disponible es baja, lo que en OS X puede forzar el intercambio, y en iOS mata la aplicación que consume más memoria (ya que no hay intercambio). En Mavericks, los dos sistemas operativos están más juntos. Memorystatus emite una nota de kernel, que el tiempo de ejecución Obj-C eventualmente se traduce en una appDidReceiveLowMemoryWarning. Se supone que las aplicaciones purgan la memoria no utilizada o extraña (por ejemplo, cachés). La libC de Darwin también purga la memoria automáticamente.
Hay una llamada específica (aunque no documentada) del sistema, vm_pressure_monitor (# 296, si no recuerdo mal), que le permite al cliente escuchar eventos de presión y ver cuántas páginas físicas se pueden reclamar.
Puede ver eventos de presión en Mavericks utilizando Process Explorer para OS X, descargable desde http://newosxbook.com/index.php?page=downloads . Eso te muestra el "manómetro" de presión, así como los eventos de presión.
fuente
La presión de la memoria está definida por dos contadores que Mach mantiene internamente:
vm_page_free_count
: ¿Cuántas páginas de RAM están actualmente libres?vm_page_free_target
: Cuántas páginas de RAM, como mínimo, deberían ser óptimamente gratuitas.Puede verlos fácilmente con sysctl:
Si la cantidad de páginas libres cae por debajo de la cantidad objetivo, tenemos una situación de presión.
De http://newosxbook.com/articles/MemoryPressure.html
fuente