cpulimit não detecta o processo Node.JS

2

Consegui limitar o processo python para usar apenas 50% da CPU com o seguinte

cpulimit -l 50 -e python

mas quando tentei fazer o mesmo para o Node, e ele não é capaz de detectar o processo. Alguém sabe? No ps aux , posso ver node , por isso não tenho certeza do que está faltando

cpulimit -l 50 -e node

A plataforma em que estou executando é o Ubuntu 14.04, mas imagino que esse problema deva ser agnóstico quanto ao linux.

Meu trabalho atual é

cpulimit -l 50 -p $(pidof node)

No entanto, isso significa que ele não detecta novas instâncias de processos de nós.

    
por Antony 27.08.2014 / 15:07

2 respostas

1

cpulimit é conhecido por não funcionar bem em alguns casos. Às vezes funciona muito bem (em aplicativos simples de thread único) e outras vezes (na maioria das vezes, mutli-thread ou muti-process) não funciona.

Tecnicamente falando, há dois problemas que podem fazer com que o cpulimit não seja limitado. A primeira é que o programa que você está tentando executar gera um thread ou processo de tal forma que o segmento gerado não seja um filho do segmento de desova. Existem várias razões para fazer isso, mas é um pouco incomum.

Segundo, o fato de o SIGSTOP não ser um sinal que pode ser "manipulado". Mas os sinais são assíncronos. Então Thread a pode gerar thread b. o thread a pode ser SIGSTOP'ed enquanto o thread b está sendo lançado e o thread b é iniciado sem o sinal.

O SIGSTOP também pausa um processo "quando pode". Há momentos, especialmente com o disco io, que um thread não seria pausável. O mais comum daqueles que eu posso pensar é o disco IO.

Em outras palavras, enquanto o SIGSTOP (o que o cpulimit usa) deve parar um encadeamento e todos os outros encadeamentos filhos, ele nem sempre o faz da maneira esperada em aplicativos multi-encadeados complexos que podem iniciar outros processos. Você seria mais bem atendido usando a otimização de agendamento tradicional (legal) nesses casos.

    
por 27.08.2014 / 16:05
1

Com o comentário do @Mark Plotnick, finalmente descobri o motivo

ls -l "/proc/$(pidof node)/exe" retorna

lrwxrwxrwx 1 antony antony 0 Aug 27 13:04 /proc/4414/exe -> /usr/bin/nodejs

Então, em vez de node , eu deveria ter usado nodejs

O seguinte comando funciona

cpulimit -l 50 -e nodejs

Atualização: na verdade, essa não é uma solução à prova de balas. Sim, cpulimit pode detectar o processo nodejs , mas se você estiver executando um script nodejs persistente, cpulimit poderá prematuramente fazer com que o script nodejs seja encerrado sem qualquer aviso

Update2: Apareceria no console / terminal que o processo nodejs parou, mas na realidade, o nodejs ainda está rodando em segundo plano.

    
por 27.08.2014 / 20:34