Чому OS X використовує своп, коли багато “неактивної пам’яті”?


22

Я використовую OS X з декількох місяців (Lion та зараз Mountain Lion). У мене в міні є 8 Гб, і майже щодня це наближається до цього. На машині Windows 7 з 8 Гб у мене ніколи не було такої проблеми. У будь-якому випадку я прочитав по мережі, що неактивна пам'ять - це кеш програм, які нещодавно закриті і можуть бути використані для швидшого повторного відкриття. Його не звільняють. Натомість OS X починає мінятися. Отже, моє запитання: чому OS X використовує своп, коли багато "неактивної пам'яті"? Ось екран, який показує, що я маю на увазі:

введіть тут опис зображення

Я дуже сподіваюся, що існує можливість змусити OS X використовувати ці 2,69 Гб, перш ніж почати міняти. Я дійсно так.


Так це дивно. Це одне додаток, яке займає всю оперативну пам’ять? Можливо, OSX обмежує програми не використовувати одразу більше 80% оперативної пам’яті. Неактивний не означає його безкоштовного, хоча. Це зарезервовано для чогось.
Пьотр Кула

Ні - багато додатків, браузерів, Eclipse і т. Д. З того, що я читав, це безкоштовно, оскільки це нещодавно закритий кеш програм. Тут повинен бути спосіб зробити так, щоб OS X не
мінявся місцями,

Я можу відтворити його в будь-який час і можу зробити екран монітора активності, якщо знадобиться
Балчев

2
Неактивна пам'ять - це не вільна пам'ять.
kinokijuf

2
@kinokijuf, однак, він повинен діяти як вільна пам'ять, коли не залишається вільної пам'яті. Якщо неактивна пам'ять завжди все-таки поміняється на диск, немає реального сенсу робити активне - неактивне розмежування.
Пітер

Відповіді:


18

Заміна, очевидно, сталася тоді, коли неактивні сторінки ОЗУ були дійсно активними.

( Оновлення: як було уточнено в коментарі, це не ваш випадок. Тож люди з тією ж проблемою можуть перейти до горизонтального правила .)

Тобто у вас було запущено багато програм і ядро ​​замінило кілька сторінок. Потім ви вийшли з деяких програм. Ядро позначає свої сторінки ОЗУ як неактивні. Але вони не повертаються до оперативної пам’яті, поки ці сторінки не знадобляться. Це призводить до появи неактивних сторінок та сторінок, що їх заміняють.

Чому б не попередньо поміняти сторінки? Тому що це було б на ставку проти шансів: у довгостроковій перспективі ви програєте. Давайте розглянемо спрощений приклад: дві програми A і B, які не вміщуються в ОЗП одночасно. Програма A все ще працює, і всі замінені сторінки належать А. Програма B закрилася, а всі неактивні сторінки належать B.

Якщо ядро ​​попередньо заміняє сторінки A і негайно після:

  • Програма A потребує доступу до її сторінок -> Ви виграєте - сторінки вже є в ОЗУ.
  • ви знову запускаєте B -> Ви втрачаєте - ви "оплачували" витрати на приведення сторінок в оперативну пам'ять, і тепер вам доведеться їх відправити назад.
  • ви запускаєте іншу програму C -> Ви програєте, якщо A і C одночасно не вміщуються в ОЗУ. Якщо вони підходять, ви рівні.

Також врахуйте, що заміна (запис на диск) дорожча за обмін (читання з диска). Що робить цю "ставку" ще непривабливішою.

Якщо коротко: довіряйте своєму ядру і не намагайтеся його перехитрити.


Оновлення: виявляється, що неактивна пам'ять не працює, оскільки користувач Монітор активності для читання статті системної пам'яті змусив багатьох людей повірити, що це працює. Визначення в статті для неактивної пам'яті є правильним:

Ця інформація є в оперативній пам’яті, але вона активно не використовується, її нещодавно використовували.

Але наступний приклад є абсолютно оманливим і надто спрощеним (як, наприклад, відвертий мій приклад):

Наприклад, якщо ви використовували пошту, а потім закрили її, оперативна пам’ять, яку використовувала пошта, позначається як неактивна пам'ять. Неактивна пам'ять доступна для використання іншим додатком, як і вільна пам'ять. Однак якщо ви відкриєте Mail перед тим, як її неактивну пам'ять використовує інший додаток, програма Mail відкриється швидше, оскільки її неактивна пам'ять перетворюється на активну пам'ять, а не завантажує її з повільніше диска.

Я шукав більше інтернет-ресурсів і потрапив до цієї теми в списку розсилки ядра darwin, який є досить інформативним. Цитуючи Джима Мегі (від команди Дарвіна - я думаю):

Коротше кажучи, система VM ядра при роботі з тиском пам’яті сканує на сторінках, що використовуються, і намагається підтримувати їх в балансі між активними та неактивними маркуваннями. Неактивні сторінки скануються для повторного використання, а позначаються як неактивні. Якщо вони були повторно використані, вони позначаються як активні, і якась інша сторінка повинна перейти з активного в неактивний стан, щоб виявити, чи вона активно використовується. Отже, неактивний - це неправильне значення. Це скорочення для "можливо неактивного, давайте спробуємо це перевірити".

Як ви виявили, внутрішній баланс, до якого ми прагнемо (наразі), становить приблизно 2/3 активних проти 1/3 неактивних ...

Це пояснює поведінку, яку ви спостерігаєте. Тобто неактивні сторінки, які ви бачите, належать до запущених програм, які нещодавно не використовувалися. Отже, коли ви запускаєте нову програму, неактивні сторінки витісняються. У той же час сторінки інших програм позначаються як неактивні для підтримки співвідношення 2/1 між активними та неактивними.

Нитка також містить деякі пропозиції , щоб дізнатися більше про внутрішній Дарвін. Також є кілька пропозицій на випадок, якщо ви почали досліджувати використання пам'яті через проблеми з пляжним балом (які зазвичай мало стосуються цього).

Висновок залишається тим самим: довіряйте своєму ядру і не намагайтеся його перехитрити. :-)


1
Привіт, не впевнений, що ти мене розумієш - я говорю на той момент, коли у тебе як 100-200 МБ вільної пам’яті, 2,6 ГБ «неактивний» і запускається інша програма, скажімо затемнення, xcode та ін. Що трапляється, що вони не використовують ці 2,6 ГБ і замість цього поміняйте місцями з активної пам’яті. Не впевнений, чи отримаєте ви, що я маю на увазі. Щойно, дякую за вашу відповідь
Бальчев

Це вже зрозуміло. Можливо, ви повинні додати приклад у цьому коментарі до свого питання. Я додав додаткову інформацію, яка, на мою думку, дає належне пояснення тому, що ви спостерігаєте.
m000

Не впевнений, чи редагуватиму оригінальну відповідь. Це пояснює інший випадок (оскільки я не отримав ваше запитання безпосередньо перед вашим коментарем) і може заплутати людей.
m000

Так, як каже у коментарі Радуо - "OS X - голодний звір". Я не очікував, що ОС X буде такою голодною пам’яттю (і Лев, і тепер Гірський Лев), і саме тому я подумав, що тут є щось риб'яче. Дякую за оновлену відповідь.
Балчев

6

Ви можете безпечно відключити пейджинг, якщо у вас достатньо оперативної пам’яті.

Спробуйте ці команди.

sudo launchctl unload -w /System/Library/LaunchDaemons/com.apple.dynamic_pager.plist
sudo rm /private/var/vm/swapfile*

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

Переконайтеся, що в ньому не було створено свопфілів /private/var/vm/.

Щоб знову ввімкнути спробуйте наступні команди:

sudo launchctl load -wF /System/Library/LaunchDaemons/com.apple.dynamic_pager.plist

Ви також можете відключити прожектор, щоб звільнити більше оперативної пам’яті та зменшити активність диска. Наступні команди використовуються для відключення та включення Spotlight.

sudo launchctl unload -w /System/Library/LaunchDaemons/com.apple.metadata.mds.plist
sudo launchctl load -wF /System/Library/LaunchDaemons/com.apple.metadata.mds.plist

Я читав по мережі, що відключення swap на OSX може призвести до несподіваної поведінки системи та збоїв. Це правда?
Балчев

Коли вашої пам'яті буде мало, вона буде. Але якщо у вас достатньо пам'яті, наприклад 8 Гбіт, це не спричинить жодних проблем.
arundevma

2
“Достатньо пам’яті, як 8 Gb” - вибачте, це так мило… :)
Bombe

0

Зробити не так вже й багато. Чому це робиться? Тому що так працює OS X. Цікава частина полягає в тому, як зайнята пам’ять з кожним сном збільшується з кожним сном.

Що ти можеш зробити:

  1. Оновлення оперативної пам’яті.
  2. Запустіть святу команду " очищення ", щоб очистити більшу частину неактивної пам'яті, коли це необхідно.
  3. Вимкнути своп http://osxdaily.com/2010/10/08/mac-virtual-memory-swap/

Привіт, я використовував команду очищення, але більшу частину часу вона звільняла менше половини "неактивної" пам'яті. Я читав, що відключення swap на OSX може призвести до несподіваної поведінки системи та збоїв. Тому я пішов з 1) Зараз це нормально з 16 гб :) Просто цей об'єм пам'яті використовується для серверів, а не настільних комп'ютерів :) Дякуємо за Ваша відповідь
Балчев

У мене на Macbook Pro 16GB, це не сервер. :) Добре відомо, що OS X є голодним звіром, коли мова йде про пам'ять, особливо коли одночасно використовується кілька середніх та великих додатків. Мені вдалося заповнити всі ці 16 Гб, не відкриваючи жодного програмного забезпечення для редагування зображень / відео, лише деяких ігор та невеликих додатків. Неактивна пам'ять становила близько 4 Гб ...

Ви також повинні врахувати, що багато програм X X вже мають 64 біт. 64-бітні програми виділяють більше пам’яті, ніж 32-бітні програми, завдяки збільшенню простору адреси.

0

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


1
це погано розроблено тоді. він надто агресивний у розподілі та використанні місця для заміни.
мендота

Чому це важливо? Якщо безкоштовного свопу багато, виділення місця для заміни нешкідливо. Це особливо актуально, коли своп не містить необхідних даних, оскільки видалення асигнувань не коштує. Це хороший дизайн - виконувати важку роботу, коли це майже дорого, а не відкладати її на потім, коли система знаходиться під тиском.
Девід Шварц

2
це поганий дизайн, коли він занадто агресивний і викликає заїкання або зависання в програмах, він помилково позначає як неактивний і починає переходити в своп. тим часом в оперативній пам'яті є ще вісім концертів: /
mendota

Я згоден з мендотою. Як тільки я повністю відключив своп, моя система працює безперебійно, без заїкання.
Антон Кузьмін

@AntonKuzmin Це насправді не має нічого спільного з тим, про що йдеться у цьому питанні. Якщо ви читаєте це запитання, воно взагалі нічого не говорить про заїкання або будь-яких проблем.
Девід Шварц
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.