Як збільшити максимальний обмінний простір у Mac OS X?


14

У Mac OS X Yosemite 10.10.5, коли я намагаюся запустити обчислення, на яке потрібно виділити та використовувати 128 ГБ пам'яті (це програма командного рядка, написана на С), ядро ​​вбиває мій процес із надзвичайними упередженнями. Цей запис журналу консолі є прикладом одного примірника:

9/25/15 7: 08: 40.000 PM ядро ​​[0]: низький своп: убивство Pid 6202 (huffgrp)

Розрахунок працює чудово і за розумну кількість часу, коли він виділяє і використовує 64 ГБ пам'яті. У мого Mac є 32 ГБ оперативної пам’яті та просто місце на жорсткому диску. Я також спробував це на іншому Mac з 8 ГБ оперативної пам’яті, на якому обчислення на 64 ГБ працює також добре, звичайно, забираючи довше, але обчислення на 128 ГБ вбивається ядром так само.

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

Отож, можливо, існує таємний ліміт місця для заміни десь між 64 та 128 ГБ.

Моє запитання: як я переконфігурую ядро, щоб дозволити більше місця для обміну? Я знайшов багатообіцяючий файл, /System/Library/LaunchDaemons/com.apple.dynamic_pager.plistале секретного номера там не бачу. На сторінці "man" dynamic_pagerйдеться про те, що все, що вона робить, - це встановити ім'я та розташування файлів своп. Існує старіша версія тієї самої сторінки, що містить документ, -Sщоб встановити розмір створених свопфілів. Я спробував це, попросивши 160 Гб свопфілів, але це не мало ефекту. Заміни файлів все ще були 1 Гб кожен, і процес все ще був знищений ядром.


Я також розмістив це запитання на apple.stackexchange.com, але відповіді там не було.
Марк Адлер

1
Причина того, що ви можете mallocбільше, ніж у вас, - це те, що фіксований_ліміт дуже високий (можливо, нескінченний). Тому ОС виділяє пам'ять, якої у неї немає (це робить ставку на те, що процес не використовуватиме її, os зазвичай виграє цю ставку). Ви можете скоригувати ліміт фіксації, щоб він був межею пам'яті, таким чином процес вийде з ладу рано.
ctrl-alt-delor

Я не бачу, чому ви розумієте, що пункт 5 є істинним, він не випливає з пункту 4 (хоча ви починаєте це з "так"). Ви також спробували додати багато свопів? (питання щодо цього не ясно, хоча я підозрюю, що відповідь - так).
ctrl-alt-delor

@richard Так, я знаю, чому malloc()це робиться. Я відхиляв можливі коментарі до того, хто думає, що я не перевіряю значення повернення malloc(). До речі, моя мета - не провалитися раніше. Моя мета - досягти успіху.
Марк Адлер

@richard Оскільки в повідомленні ядра написано "низький своп". Щодо "додавання багато свопів", ні, я цього не робив, бо не знаю як. Саме це питання. Як додати простір підкачки? Звичайно, ядро ​​додає місця для заміни автоматично, але лише до обмеження. Звідси корінь питання: Як я можу збільшити обмеження місця для заміни ядра?
Марк Адлер

Відповіді:


4

Не відповідь, яку ви просили, але якщо ви створите власний файл відповідного розміру, вставте його у свій процес, а потім запустіть свій розрахунок у цьому адресному просторі, він повинен мати такий же ефект, як і файл swap. мати простір, на відміну від конкуренції з іншими процесами за доступну оперативну пам’ять / своп.

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


2
Чудова ідея! Я покладав великі надії. На жаль, вони кинулися на суворий берег реальності. Процес все ще був убитий ядром за велику кількість обмінів, як і раніше (повідомлення консолі "низького заміну"), навіть незважаючи на те, що він використовував файл, який я створив для використання у якості віртуальної пам'яті mmap().
Марк Адлер

На жаль, більша частина мого досвіду стосується Linux. Але, можливо, проблема полягає в тому, що ядро ​​не повертається назад до файлу і тримає його в оперативній пам'яті. Що робити, якщо періодично закликати msync()примушувати це робити?
даних

0

Моя інформація про Mac досить датована, можливо, більше не буде магії ядра для цього. Як такий, я пропоную використовувати для цієї програми Linux, де ви зможете змонтувати папку або розділ як swap дуже просто.

Усуньте невизначеності використання динамічної папки своп. Створіть фізичний розділ swap (просто порожній неформатований розділ, з кодом типу дискової таблиці для swap, в Linux це шістнадцятковий код 0x82.) Потім:

  1. Відредагуйте файл / etc / rc, знайдіть коментар до розділу "swap". додайте рядокmount -vat swap
    • означає монтувати всі swap-розділи в / etc / fstab
  2. бігати pdisk /dev/disk? -dump
    • "?" номер диска вашого hd-запису, номер поруч із розділом swap
  3. Редагуйте або створіть / etc / fstab (він, мабуть, не існує), додайте рядок типу /dev/disk?s?? none swap sw 0 0
    • ? це ваш диск.
    • ?? - номер розділу swap.
  4. перезавантажити.
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.