Контроль количества дочерних процессов разветвленных на основе доступной свободной памяти
Я пытаюсь использовать COW и разворачивать столько дочерних процессов, сколько позволяет системная память Linux. Я бы запускал родительский процесс до разветвления (в этот момент процесс использует определенный объем памяти), а затем разветвлял одного потомка за раз, пока fork не вернул ошибку ENOMEM. В этом случае я бы подождал, пока кто-нибудь из детей закончит, прежде чем разбудить нового. Дочерние процессы не будут выделять новую память, а просто будут работать. Но это не работает, все мои процессы были убиты системой Linux без ошибок памяти.
Каков наилучший способ сделать это?
1 ответ
Это невозможно по самому определению COW.
Возможно, ваши процессы не выделяют память явно, но они, безусловно, делают это неявно. Когда процесс пытается изменить страницу, помеченную как копируемая при записи, ОС должна приостановить операцию и выделить новую страницу. Это распределение может завершиться ошибкой, и в вашей программе нет места для возврата ошибки. Единственное возможное действие - убить процесс.
Лучшее, что вы можете сделать, - это оценить, сколько памяти понадобится вашей программе на пике, и объединить эту информацию с информацией о свободной памяти (например, из /proc/meminfo).
Радикальное решение вообще отключить COW тоже должно сработать, но у AFAIK Linux такой опции нет.