В 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 ГБ, и ядро все еще останавливало процесс.
источник
malloc
больше, чем у вас, заключается в том, что commit_limit очень высок (вероятно, бесконечен). Поэтому ОС будет выделять память, которой у нее нет (это ставка на то, что процесс не будет ее использовать, ОС обычно выигрывает эту ставку). Возможно, вы захотите отрегулировать лимит фиксации, чтобы он был ограничен памятью, поэтому процесс рано завершится неудачно.malloc()
это так. Я отклонял возможные комментарии о ком-то, думая, что я не проверяю возвращаемое значениеmalloc()
. Кстати, моя цель - не провалиться раньше. Моя цель - добиться успеха.Ответы:
Не тот ответ, который вы просили, но если вы создадите свой собственный файл соответствующего размера, отобразите его в своем процессе, а затем запустите вычисления в этом адресном пространстве, он должен иметь тот же эффект, что и файл подкачки, и вы гарантированно есть место, а не конкурировать с другими процессами за доступную оперативную память / подкачку.
Это также может быть медленнее, в зависимости от того, как часто вы перезаписываете данные, но должно быть гораздо более переносимым.
источник
mmap()
.msync()
чтобы заставить это сделать?Моя информация о Mac довольно устарела, возможно, ядро больше не сможет это сделать. Поэтому я предлагаю использовать Linux для этой программы, где вы можете очень просто смонтировать папку или раздел как swap.
Устранить неопределенность использования папки динамического обмена. Создайте физический раздел подкачки (просто пустой неформатированный раздел с кодом типа таблицы дисков для раздела подкачки, в Linux это шестнадцатеричный код
0x82
.) Затем:mount -vat swap
pdisk /dev/disk? -dump
/dev/disk?s?? none swap sw 0 0
источник