Os arquivos limits
são utilizados por PAM
. O estoque suexec
fornecido pelo apache ainda não reconhece ou utiliza PAM
. Existem patches. E você pode modificar a fonte diretamente para invocar setrlimit
(parece bem fácil - veja a página setlimit(2)
man.) Mas como está, suexec
não reconhecerá nada que você fizer com limits
.
Você ainda pode configurar ulimits de dentro do apache, mas acho que isso é indesejável, especialmente no modelo de pré-fork, porque então você limita a carga que seu servidor http pode manipular. Além disso, não tenho certeza se os limites serão transferidos para o ambiente suexec
porque não sei como suexec
faz seu trabalho.
O motivo CPUShares
não o ajudará aqui é porque a sua fork é um "resource hog", mas os recursos não estão realmente nos ciclos da CPU. Quando a contabilização da CPU se torna envolvida, é tarde demais: o sistema não tem memória livre ou slots de processo para tentar executar o programa.
Você pode experimentar prlimit
, parte de util-linux
, por isso deve ser padrão em sua instalação. Se você fizer isso:
$ prlimit --nproc=1 bash -c bash -c id
bash: fork: retry: No child processes
Portanto, o pequeno processo de 2-fork falhou.
Infelizmente, não vejo uma boa maneira de se envolver na cadeia de execução. O Apache se autocentrou e a todos nós, fornecendo um módulo suexec
reprovado que não é flexível o suficiente para atender à demanda básica, e é simples o suficiente para que qualquer solução real exija um buraco na segurança.