Чому просочена пам'ять виявляється непридатною до kernel_task, і чому ОС X не може зібрати її сміття


11

Мені раніше було сказано, що ознакою того, що в якійсь програмі є витік пам'яті, є те, що kernel_taskвона має великий слід пам'яті, як правило, на порядок гігабайт. Якщо неприємність kextспричиняла це використання пам’яті, ми очікували б розбіжності між виділеною пам’яттю та тією, яку очікується виділити, тобто

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

поверне щось, крім слів "Провідний" та "Ім'я".

Під час написання своєї дипломної роботи я помітив, що зміна PDF-файлу, поки він відкритий у програмі «Попередній перегляд», часто спричиняє погані речі: час від часу використання пам'яті kernel_taskможе зростати приблизно до восьми гігабайт або більше. Якщо я вбиваю попередній перегляд, миттєво повертається до нормального . Тож, очевидно, щось не так - і Preview просочується пам'яттю в цих умовах.

Отже, моє запитання таке: якщо я знаю, що через процес раптового та несподіваного збільшення сліду kernel_task, протікав операційний талон , чому OS X не може знати, що щось пішло не так. Якщо вбивство Preview відновлює мій відсутній malloc()«d пам'яті, чому НЕ Darwin зробити збір сміття автомагіческі для мене?

Чи є у мене принципове непорозуміння, як працює управління пам'яттю?

Редагувати: (15.9.95)

Ось демонстрація того, про що я говорю. Перш за все, я помічаю високе використання пам'яті kernel_task(примітка. Попередній перегляд відкритий, просто видно внизу Monitor Monitor, використовуючи 333 Мб оперативної пам'яті)

Високе використання пам'яті ядра

Дотримуючись корисних зауважень Ешлі нижче, давайте дізнаємося, скільки використовує кожен кекс:

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

Отже, не величезна кількість. Моя машина має як дискретні, так і інтегровані графічні процесори; їхні драйвери користуються лише декількома МБ провідного тарана. На мій погляд, давайте вбиємо Preview, і подивимося, що відбувається з слідом пам’яті kernel_task:

Попередній перегляд вбивства допомагає щось

Попередній перегляд минув, і слід пам'яті ядра різко знизився. Досі немає доказів зміни використання кексту: вихід вищезгаданої команди не змінюється.

Редагувати : Про помилку повідомили як № 22701036. Я все ще чекаю відповіді від apple. Немає нічого особливо цікавого, якщо ви оглядаєте процес у ActivityMonitor, але, можливо, я чогось пропускаю.


Мене бентежить дві речі - ви могли б уточнити? 1) Я думаю, що ваша diffкоманда порівнює Sizeта Wiredстовпці з kextstatрезультатів. Я погоджуюся, що Sizeце "виділена пам'ять", але я не думаю Wired, що "очікується виділення" ( man kextstatописується це як "Кількість провідних байтів пам'яті ядра, яку займає кекс"). 2) Ви бачите невідповідність між Sizeі Wiredколи виникають проблеми з попереднім переглядом?
Ешлі

1) Ви маєте рацію - я порівнюю елементи в розмірі та проводці від kextstat. Я розумію, що якщо витікає кекс , то виділені байти та ті, які знає ядро, будуть виділені. У цьому випадку я поставив це, щоб показати, що у мене немає течі, що протікає - так, 2) цього не відбувається, коли Preview їсть таран. Натомість kernel_taskбагато росте. Я спробую відтворити це питання і сфотографую :-).
Ландак

Дякую! Зачекайте: я просто пишу відповідь, яка може допомогти.
Ешлі

Відповіді:


6

Ядро OS X не є збір сміття; Ліцензія часу C ++ IOKit вимагає від розробників управління власною пам'яттю.

Управління пам'яттю Mac

З Як працює управління пам'яттю в Mac OS X?

Apple досить добре документує найнижчі рівні ядра Mach і підсистеми віртуальної пам’яті в Інтернеті, як частину документації для розробників.

Оскільки це ядро ​​було розроблено університетом Карнегі Меллона , ви можете знайти десятки робіт, що описують його досить легко.

Інші джерела

Збір сміття

Збір сміття існує на рівні користувача або програми. Навіть на цьому шарі збирання сміття допомагає лише в тому випадку, якщо програма звільнила всі претензії до пам'яті. Кругова залежність може перемогти збирання сміття. Сам збір сміття - це напрямок досліджень, що розвивається, і його важко поправити .

Повідомте про помилки та витоки пам’яті

Помилки в ОС X будуть просочуватися пам'яттю. Зважаючи на розмір бази коду, це майже точно.

Повідомте про помилки, що відтворюються безпосередньо в Apple . Кожен звіт про помилки допомагає, і, можливо, ваш приклад стане тим, що допомагає інженерам Apple вирішити причину.


Це невтішно, але, безсумнівно, правильно. Я повідомив про помилку в Apple - мені просто прикро!
Ландак

2
Будь ласка, можете поділитися номером помилки як редагуванням свого питання. Інші, хто вважає ваше питання корисним, можуть подати дублікати помилок із зазначенням оригіналу. Купа пов’язаних помилок допоможе виправдати більше інженерного часу.
Грехем Мілн

4

Ось я здогадуюсь, якщо припустити, що ваш Mac має інтегрований графічний процесор (наприклад, Intel Iris Graphics).

Коли ваша дипломна робота відкрита в режимі «Попередній перегляд», використовується пам'ять графічної картки для зберігання зображення («текстури») вікна «Попередній перегляд», а також, можливо, і деяких сторінок, які не є екранованими, але розшифровані з тези.

За допомогою інтегрованої відеокарти відеопам'ять фактично (частково?) Розташована в системній оперативній пам'яті, яка спільно використовується між процесором та графічним процесором. На деяких інтегрованих відеокартах динамічно розподіляється кількість використаної оперативної пам’яті (див. Apple HT204349 ).

Я здогадуюсь, що ви переривчасто бачите помилку в драйвері відеокарти та / або Попередній перегляд, який не випускає системну пам'ять правильно, коли Preview перезавантажує ваш PDF-дипломну роботу. (Однак, цю помилку усуває ОС X / драйвер, що вивільняє пам'ять, коли програма попереднього перегляду закінчується.)

Ви можете спробувати подивитися на результат kextstatі побачити, чи Sizeзбільшуються числа у стовпці, коли виникає проблема. Моя теорія полягає в тому, що збільшення, яке ви згадуєте, на 8 Гб, буде пов’язане з драйвером відеокарти.

Наступна команда (від коментарів по цій пов'язаному і цікавого відповіді ) сортує висновок , kextstatщоб зробити його легше побачити , який Kext використовує найбільше пам'яті (хоча це примітка сорт в Wiredколонці ... є подібне, простіше чаклунство в цьому відповідь з поясненням, якщо ви хочете це підправити).

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

Хороший здогад - і дякую вам за корисний, відсортований вихід kextstat. Однак це все ще не виглядає так, що насправді відбувається: під час попереднього виступу слід пам’яті пам’яті com.apple.nvidia.driver.*не змінився. Я відредагував своє запитання, щоб це відобразити.
Ландак
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.