У 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 Гб кожен, і процес все ще був знищений ядром.
malloc
більше, ніж у вас, - це те, що фіксований_ліміт дуже високий (можливо, нескінченний). Тому ОС виділяє пам'ять, якої у неї немає (це робить ставку на те, що процес не використовуватиме її, os зазвичай виграє цю ставку). Ви можете скоригувати ліміт фіксації, щоб він був межею пам'яті, таким чином процес вийде з ладу рано.
malloc()
це робиться. Я відхиляв можливі коментарі до того, хто думає, що я не перевіряю значення повернення malloc()
. До речі, моя мета - не провалитися раніше. Моя мета - досягти успіху.