¿Por qué la memoria filtrada aparece en kernel_task, y por qué el OS X no puede, por lo tanto, recolectar basura?

11

Anteriormente me han dicho que una señal de que alguna aplicación tiene una pérdida de memoria es que kernel_task tiene una gran huella de memoria, generalmente del orden de gigabytes. Si un awry kext estaba causando este uso de la memoria, esperaríamos ver una discrepancia entre la memoria asignada y las que se esperaba asignar, es decir,

diff <(kextstat|tr -s ' ' | cut -d ' ' -f 5) <(kextstat| tr -s ' ' | cut -d ' ' -f 6) 

devolvería algo más que las palabras "Cableado" y "Nombre".

Mientras escribo mi tesis, he notado que cambiar un pdf mientras está abierto en Vista previa a menudo causa cosas malas: ocasionalmente, el uso de memoria de kernel_task puede aumentar a alrededor de ocho gigabytes, o más. Si mato la vista previa, vuelve a la normalidad, al instante . Entonces, obviamente, algo está mal, y la vista previa está perdiendo memoria en estas condiciones.

Entonces, mi pregunta es esta: si yo sé que un proceso ha filtrado ram a través de un aumento repentino e inesperado en la huella de kernel_task , ¿por qué no puede OS X sabe que algo ha salido mal. Si matar Vista previa restaura mi falta de memoria malloc() 'd, ¿por qué no Darwin hace la recolección de basura de forma automática para mí?

¿Tengo una mala interpretación de cómo funciona la administración de memoria?

EDITAR: (15/9/15)

Aquí hay una demostración de lo que estoy hablando. En primer lugar, observo un alto uso de memoria por kernel_task (la vista previa de la nota está abierta, solo visible en la parte inferior del Monitor de actividad, con 333 MiB de RAM):

SiguiendolasobservacionesútilesdeAshleyacontinuación,veamoscuántoestáutilizandocadakext:

$kextstat|awk'NR==1{printf"%10s %s\n", $5, $6; } NR!=1{ printf "%10d %s\n", $5, $6; }' | sort -n

...
...
...
   1249280 com.apple.driver.DspFuncLib
   1769472 com.apple.nvidia.driver.NVDAGK100Hal
   2629632 com.apple.nvidia.driver.NVDAResman
   6184960 com.apple.driver.AirPort.Brcm4360
$

Por lo tanto, no es una cantidad enorme. Mi máquina tiene GPUs discretas e integradas; sus conductores solo usan unos pocos MiB de ram con cable. En mi corazonada, matemos la vista previa y veamos qué sucede con la huella de memoria de kernel_task :

La vista previa se ha ido, y la huella de memoria del kernel se ha reducido drásticamente. Todavía no hay evidencia de un cambio en el uso de kext: la salida del comando anterior no ha cambiado.

Editar : error reportado como No. 22701036. Todavía estoy esperando una respuesta de Apple. No hay nada particularmente interesante si inspeccionas el proceso en ActivityMonitor, pero tal vez me esté perdiendo algo.

    
pregunta Landak 12.09.2015 - 11:11

2 respuestas

6

El núcleo de OS X no se recolecta en la basura; IOKit's requiere que los desarrolladores administren su propia memoria.

Gestión de memoria de Mac

De ¿Cómo funciona la administración de memoria en Mac OS X?

  

Apple documenta los niveles más bajos de Mach Kernel y el subsistema de memoria virtual bastante bien en la web como parte de su documentación de desarrollador.

     

Dado que el núcleo era desarrollado por la Universidad Carnegie Mellon , puede encontrar docenas de documentos que lo describen con bastante facilidad.

Otras fuentes

Recolección de basura

La recolección de basura existe en el usuario o en la capa de aplicación. Incluso en esta capa, la recolección de basura solo ayuda si la aplicación ha liberado todos los reclamos a la memoria. Una dependencia circular puede derrotar la recolección de basura. La recolección de basura en sí misma es un área de investigación en evolución y es difícil de corregir .

Reportar errores y pérdidas de memoria

Los errores en OS X perderán memoria. Dado el tamaño del código base, esto es casi seguro.

Por favor, informe de errores reproducibles directamente a Apple . Todos los informes de errores ayudan y quizás su ejemplo sea el que ayude a los ingenieros de Apple a determinar la causa.

    
respondido por el Graham Miln 15.09.2015 - 14:44
4

Esta es mi suposición, suponiendo que su Mac tenga una GPU integrada (por ejemplo, Intel Iris Graphics).

Cuando tienes tu tesis abierta en Vista previa, la memoria de la tarjeta gráfica se usa para mantener la imagen ("textura") de la ventana de Vista previa, y quizás también algunas páginas fuera de la pantalla pero descodificadas de la tesis.

Con una tarjeta gráfica integrada, la memoria de video se encuentra (¿parcialmente?) en la memoria RAM del sistema, que se comparte entre la CPU y la GPU. En algunas tarjetas gráficas integradas, la cantidad de RAM del sistema utilizada se asigna dinámicamente (consulte Apple HT204349 ).

Supongo que está viendo intermitentemente un error en el controlador de la tarjeta gráfica y / o en la Vista previa, que no libera la memoria del sistema correctamente cuando la Vista previa vuelve a cargar su tesis en PDF. (Sin embargo, este error se ve mitigado por OS X / el controlador libera correctamente la memoria cuando se cierra la vista previa).

Puedes intentar ver la salida de kextstat y ver si los números en la columna Size aumentan cuando experimentas el problema. Mi teoría es que el aumento de 8 GB que mencionas se debe al controlador de la tarjeta gráfica.

El siguiente comando (de un comentario en esta respuesta relacionada e interesante ) ordena la salida de kextstat para que sea más fácil para ver qué kext está utilizando la mayor cantidad de memoria (aunque tenga en cuenta que esto se ordena por la columna Wired ... hay un encantamiento similar y más simple en esta respuesta con una explicación si quieres modificar esto).

kextstat | awk 'NR==1{ printf "%10s %s\n", $5, $6; } NR!=1{ printf "%10d %s\n", $5, $6; }' | sort -n
    
respondido por el Ashley 15.09.2015 - 11:50

Lea otras preguntas en las etiquetas