Limita o uso de CPU e memória para C, programas Java no nível do sistema

1

Estou construindo um editor de código on-line para C e Java. É provável que os usuários gravem loops infinitos. Existe alguma maneira de limitar a utilização da CPU e da memória desses processos nas configurações no nível do sistema?

Meu backend é um processo nodejs que recebe código do usuário, o compila e executa. Eu gostaria de matar o processo quando excede alguns limites wrt cpu e memória.

    
por j10 25.05.2016 / 17:59

1 resposta

2

Sim - as duas principais abordagens são setrlimit(2) e (no Linux) grupos de controle.

As principais vantagens do setrlimit é que ele é simples e portátil (especificado pelo POSIX). Você fork , em seguida, define limites para RLIMIT_AS e RLIMIT_CPU e, em seguida, exec do código. A desvantagem é que ele é por processo, portanto, o código ainda poderia bifurcar para exceder o limite (cada processo que forks terá o mesmo limite, mas não será compartilhado). Você também pode definir RLIMIT_NPROC para fazer fork falhar (mas é claro, então o código que precisa ser bifurcado não pode ser testado).

A principal vantagem dos grupos de controle (cgroups) é que eles podem tratar o processo e todos os seus filhos juntos - eles recebem um limite combinado. A desvantagem é a não portabilidade (apenas no Linux) e um pouco mais de complexidade. Você também pode ter que falar com o systemd, se estiver gerenciando grupos de controle em seu sistema. A melhor introdução aos cgroups é a Série do Grupo de Controle de Neil Brown no LWN .

Outra abordagem é executar o código em uma VM, que é (pelo menos no caso do KVM) um processo quase comum para o host. Muito mais pesado, mas oferece muito isolamento.

Além disso, como uma nota lateral, você tem um lote mais coisas para se preocupar do que loops infinitos se você estiver executando um código arbitrário não confiável. Você definitivamente não quer que alguém envie um bot de spam, por exemplo. Eu sugiro olhar para implementações existentes, mas o AFAIK não é de código aberto.

    
por 25.05.2016 / 18:20