Temos um computador cuja CPU possui 32 núcleos e será usada para executar programas por alguns usuários diferentes. Existe alguma maneira de restringir o número de núcleos que cada usuário pode usar a qualquer momento para que um usuário não monopolize toda a energia da CPU?
17
Respostas:
Embora isso seja possível , é complicado e quase certamente uma má ideia. Se apenas um usuário estiver usando a máquina no momento, restringi-los a N núcleos é um desperdício de recursos. Uma abordagem muito melhor seria executar tudo com
nice
:Essa é uma ótima ferramenta que define a prioridade de um processo. Portanto, se apenas um usuário estiver executando alguma coisa, eles terão o tempo de CPU necessário, mas se outra pessoa iniciar seu próprio trabalho (também é necessário), eles serão agradáveis e compartilharão um com o outro. Dessa forma, se todos os seus usuários iniciarem comandos
nice 10 command
, ninguém estará consumindo recursos (e ninguém trará o servidor de joelhos).Observe que um valor alto e agradável significa baixa prioridade. Essa é uma medida de quão legais devemos ser e quanto mais agradáveis somos, mais compartilhamos.
Observe também que isso não ajudará a gerenciar a alocação de memória, mas afeta apenas o agendamento da CPU. Portanto, se vários usuários iniciarem vários processos com muita memória, você ainda terá um problema. Se isso é um problema, você deve procurar sistemas de filas adequados, como torque .
fonte
nice
, pelo que você descreve, é exatamente o que você precisa.TL; DR : a partir de uma breve pesquisa, parece que é possível restringir os comandos a um número específico de núcleos; no entanto, em todos os casos, é necessário usar um comando que realmente imponha a restrição.
cgroups
O Linux possui o
cgroups
que é freqüentemente usado exatamente com a finalidade de restringir os recursos disponíveis para os processos. De uma pesquisa muito breve, você pode encontrar um exemplo no Arch Wiki com a configuração do Matlab (um software científico) definida em/etc/cgconfig.conf
:Para que essa configuração entre em vigor, você deve executar o processo via
cgexec
comando, por exemplo, na mesma página da wiki:conjunto de tarefas
Uma pergunta relacionada ao Ask Ubuntu e Como limitar um processo a um núcleo de CPU no Linux? [duplicado] no site Unix e Linux mostra um exemplo de uso
taskset
para limitar as CPUs do processo. Na primeira pergunta, isso é alcançado através da análise de todos os processos para um usuário específicoNa outra questão, um processo é iniciado via
taskset
ele mesmo:Conclusão
Embora seja certamente possível limitar processos, parece que não é tão simples conseguir isso para usuários específicos. O exemplo na postagem Ask Ubuntu vinculada exigiria uma verificação consistente dos processos pertencentes a cada usuário e usados
taskset
em cada novo. Uma abordagem muito mais razoável seria executar seletivamente aplicativos intensivos da CPU, viacgexec
outaskset
; também não faz sentido restringir todos os processos a um número específico de CPUS, especialmente para aqueles que realmente usam paralelismo e simultaneidade para executar suas tarefas mais rapidamente - limitá-los a um número específico de CPUs pode ter o efeito de retardar o processamento. Além disso, como a resposta de Terdon mencionou, é um desperdício de recursosA execução de aplicativos selecionados via
taskset
oucgexec
requer a comunicação com seus usuários para que eles saibam quais aplicativos eles podem executar ou a criação de scripts de wrapper que iniciarão aplicativos selecionados viatasksel
oucgexec
.Além disso, considere definir o número de processos que um usuário ou grupo pode gerar em vez de definir o limite do número de CPUs. Isso pode ser conseguido via
/etc/security/limits.conf
arquivo .Veja também
fonte
sched_setaffinity(2)
diz a máscara de afinidade é preservada em todoexecve(2)
, e que uma criança herda onfork(2)
. Portanto, se você definir o shell para um usuário (ou o shell gráfico para uma sessão X), tudo o que iniciar nesse shell usará, por padrão, a mesma máscara de afinidade.