Perché la memoria trapelata appare spostata in kernel_task, e perché OS X non può quindi raccoglierla


11

Mi è stato precedentemente detto che un segno che alcune applicazioni hanno una perdita di memoria è che kernel_taskha un ingombro di memoria elevato, comunemente nell'ordine dei gigabyte. Se un uso errato della kextmemoria causasse questo utilizzo della memoria, ci aspetteremmo di vedere una discrepanza tra la memoria allocata e quelle che dovrebbero essere allocate, vale a dire

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

restituirebbe qualcosa di diverso dalle parole "Wired" e "Name".

Mentre scrivo la mia tesi, ho notato che la modifica di un pdf mentre è aperto in Anteprima spesso causa cose brutte: occasionalmente, l'utilizzo della memoria kernel_taskpuò arrivare a circa otto gigabyte o più. Se uccido l'anteprima, ritorna alla normalità, all'istante . Quindi, ovviamente qualcosa non va - e in queste condizioni l'anteprima perde memoria.

Quindi, la mia domanda è questa: se io so che un processo è trapelato ariete tramite un improvviso e inaspettato aumento della impronta kernel_task, perché non si può OS X sapere che qualcosa ha sbagliato andato. Se uccidere Preview ripristina la mia malloc()memoria mancante , perché Darwin non esegue automaticamente la garbage collection per me?

Ho un equivoco fondamentale sul funzionamento della gestione della memoria?

EDIT: (15/9/15)

Ecco una dimostrazione di ciò di cui sto parlando. Prima di tutto, noto un elevato utilizzo della memoria da parte kernel_task(nota che l'anteprima è aperta, appena visibile nella parte inferiore di Activity Monitor, usando 333 MiB di RAM):

Elevato utilizzo della memoria del kernel

Seguendo le utili osservazioni di Ashley di seguito, scopriamo quanto sta usando ogni kext:

$ 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
$

Quindi, non una quantità enorme. La mia macchina ha GPU sia discrete che integrate; i loro driver usano solo pochi MiB di RAM cablata. Nel mio sospetto, uccidiamo l'anteprima e guardiamo cosa succede all'impronta di memoria di kernel_task:

Uccidere l'anteprima aiuta le cose

L'anteprima è sparita e l'impronta di memoria del kernel è diminuita drasticamente. Non ci sono ancora prove di un cambiamento nell'uso del kext: l'output del comando sopra è invariato.

Modifica : Bug segnalato come n. 22701036. Sto ancora aspettando una risposta da Apple. Non c'è nulla di particolarmente interessante se si ispeziona il processo in ActivityMonitor, ma forse mi manca qualcosa.


Sono confuso su due cose: potresti chiarire? 1) Penso che il tuo diffcomando stia confrontando le colonne Sizee dall'output. Sono d'accordo che si tratta di "memoria allocata", ma non credo che si debba "allocare" (la descrive come "Il numero di byte cablati della memoria del kernel occupata dal kext"). 2) Stai vedendo la discrepanza tra e quando hai il problema con l'anteprima? WiredkextstatSizeWiredman kextstatSizeWired
Ashley,

1) Hai ragione - sto confrontando gli elementi in Dimensioni e Cablato da kextstat. La mia comprensione è che se un kext perde, allora i byte allocati e quelli che il kernel sa che sono allocati saranno diversi. In questo caso, l'ho messo lì per dimostrare che non ho un kext che perde - quindi, 2) questo non si verifica quando Anteprima mangia ram. Invece, kernel_taskcresce molto. Proverò a ricreare questo problema e farò una foto :-).
Landak,

Grazie! Aspetta un secondo: sto solo scrivendo una risposta che potrebbe aiutare.
Ashley,

Risposte:


6

Il nucleo di OS X non è la garbage collection; Il runtime C ++ libkern di IOKit richiede agli sviluppatori di gestire la propria memoria.

Gestione della memoria del Mac

Da Come funziona la gestione della memoria in Mac OS X?

Apple documenta abbastanza bene i livelli più bassi del Mach Kernel e del sottosistema di memoria virtuale sul Web come parte della documentazione per gli sviluppatori.

Poiché quel kernel è stato sviluppato dalla Carnegie Mellon University , puoi trovare decine di articoli che lo descrivono abbastanza facilmente.

Altre fonti

Raccolta dei rifiuti

La garbage collection esiste a livello di utente o applicazione. Anche a questo livello, la garbage collection aiuta solo se l'applicazione ha rilasciato tutti i reclami in memoria. Una dipendenza circolare può sconfiggere la raccolta dei rifiuti. La stessa raccolta di rifiuti è un'area di ricerca in evoluzione e difficile da ottenere .

Segnala bug e perdite di memoria

I bug all'interno di OS X perdono memoria. Data la dimensione della base di codice, questo è quasi certo.

Si prega di segnalare i bug riproducibili direttamente ad Apple . Ogni segnalazione di bug aiuta e forse il tuo esempio sarà quello che aiuta gli ingegneri di Apple a individuare la causa.


Questo è deludente, ma senza dubbio corretto. Ho segnalato il bug ad Apple - lo trovo solo fastidioso!
Landak,

2
Per favore, puoi condividere il numero di bug come modifica alla tua domanda. Altri che trovano utile la tua domanda possono quindi presentare bachi duplicati rilevando l'originale. Un mucchio di bug correlati aiuterà a giustificare più tempo di progettazione.
Graham Miln,

4

Ecco la mia ipotesi, supponendo che il tuo Mac abbia una GPU integrata (ad esempio Intel Iris Graphics).

Quando la tesi è aperta in Anteprima, la memoria della scheda grafica viene utilizzata per contenere l'immagine ("trama") della finestra Anteprima, e forse anche alcune pagine fuori schermo ma decodificate dalla tesi.

Con una scheda grafica integrata, la memoria video si trova effettivamente (parzialmente?) Nella RAM di sistema, che è condivisa tra CPU e GPU. Su alcune schede grafiche integrate, la quantità di RAM di sistema utilizzata viene allocata in modo dinamico (vedi Apple HT204349 ).

Immagino che stai vedendo a intermittenza un bug nel driver della scheda grafica e / o Anteprima, che non rilascia correttamente la memoria di sistema quando Anteprima ricarica il tuo PDF della tesi. (Tuttavia, questo bug è mitigato da OS X / il driver rilascia correttamente la memoria all'uscita da Anteprima.)

Potresti provare a guardare l'output di kextstate vedere se i numeri nella Sizecolonna aumentano quando riscontri il problema. La mia teoria è che l'aumento di 8 GB menzionato sarà dovuto al driver della scheda grafica.

Il seguente comando (da un commento su questa risposta correlata e interessante ) ordina l'output di kextstatper rendere più facile vedere quale kext sta usando la maggior quantità di memoria (anche se nota questo tipo per la Wiredcolonna ... c'è un simile, più semplice incantesimo in questo rispondere con una spiegazione se si desidera modificare questo).

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

Buona ipotesi - e grazie enorme per un risultato utile e ordinato di kextstat. Tuttavia, non sembra che sia quello che sta realmente succedendo: durante l'anteprima-gobbling, l'impronta di memoria di com.apple.nvidia.driver.*è rimasta invariata. Ho modificato la mia domanda per riflettere questo.
Landak,
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.