Как увеличить максимальное пространство подкачки в Mac OS X?

14

В Mac OS X Yosemite 10.10.5, когда я пытаюсь выполнить вычисление, которое должно выделить и использовать 128 ГБ памяти (это программа командной строки, написанная на C), ядро ​​убивает мой процесс с предубеждением. Эта запись журнала консоли является примером одного экземпляра:

25.09.15 7: 08: 40.000 PM ядро ​​[0]: низкий своп: пид убийства 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больше, чем у вас, заключается в том, что commit_limit очень высок (вероятно, бесконечен). Поэтому ОС будет выделять память, которой у нее нет (это ставка на то, что процесс не будет ее использовать, ОС обычно выигрывает эту ставку). Возможно, вы захотите отрегулировать лимит фиксации, чтобы он был ограничен памятью, поэтому процесс рано завершится неудачно.
Ctrl-Alt-Delor
Я не могу понять, почему вы считаете, что пункт 5 является истинным, он не следует из пункта 4 (хотя вы начинаете его с «так»). Также вы пытались добавить много свопа? (вопрос не ясен по этому вопросу, хотя я подозреваю, что ответ - да).
Ctrl-Alt-Delor
@ Richard Да, я знаю, почему malloc()это так. Я отклонял возможные комментарии о ком-то, думая, что я не проверяю возвращаемое значение malloc(). Кстати, моя цель - не провалиться раньше. Моя цель - добиться успеха.
Марк Адлер
@ Richard Потому что в сообщении ядра написано «низкий своп». Что касается «добавления большого количества свопа», нет, я этого не делал, потому что не знаю как. Именно этот вопрос. Как добавить пространство подкачки? Конечно, ядро ​​добавляет пространство подкачки автоматически, но только до предела. Отсюда корень вопроса: как мне увеличить предел пространства подкачки ядра?
Марк Адлер

Ответы:

4

Не тот ответ, который вы просили, но если вы создадите свой собственный файл соответствующего размера, отобразите его в своем процессе, а затем запустите вычисления в этом адресном пространстве, он должен иметь тот же эффект, что и файл подкачки, и вы гарантированно есть место, а не конкурировать с другими процессами за доступную оперативную память / подкачку.

Это также может быть медленнее, в зависимости от того, как часто вы перезаписываете данные, но должно быть гораздо более переносимым.

без данных
источник
2
Отличная идея! У меня были большие надежды. Увы, они были разбиты о суровый берег реальности. Процесс все еще был убит ядром из-за большого количества операций подкачки, как и раньше (консольное сообщение «low swap»), даже несмотря на то, что он использовал файл, который я создал для использования в качестве виртуальной памяти mmap().
Марк Адлер
Извините, большая часть моего опыта связана с Linux. Но, возможно, проблема в том, что ядро ​​не сбрасывает обратно в файл и вместо этого удерживает его в оперативной памяти. Что делать, если вы периодически звоните, msync()чтобы заставить это сделать?
без данных
0

Моя информация о Mac довольно устарела, возможно, ядро ​​больше не сможет это сделать. Поэтому я предлагаю использовать Linux для этой программы, где вы можете очень просто смонтировать папку или раздел как swap.

Устранить неопределенность использования папки динамического обмена. Создайте физический раздел подкачки (просто пустой неформатированный раздел с кодом типа таблицы дисков для раздела подкачки, в Linux это шестнадцатеричный код 0x82.) Затем:

  1. Отредактируйте файл / etc / rc и найдите закомментированный раздел подкачки. добавить строкуmount -vat swap
    • означает монтировать все разделы подкачки в / etc / fstab
  2. бегать pdisk /dev/disk? -dump
    • "?" это номер диска вашей записи HD номер рядом с разделом подкачки
  3. Отредактируйте или создайте / etc / fstab (он, вероятно, не существует), добавьте строку вроде /dev/disk?s?? none swap sw 0 0
    • ? это твой диск.
    • ?? номер раздела подкачки.
  4. перезагрузка.
Максимальная мощь
источник