В 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()
. Кстати, моя цель - не провалиться раньше. Моя цель - добиться успеха.