다음 명령을 사용하여 Python 프로세스가 CPU를 50%만 사용하도록 제한할 수 있었습니다.
cpulimit -l 50 -e python
하지만 Node로 동일한 작업을 시도하면 프로세스가 전혀 감지되지 않습니다. 아는 사람 있나요? ps aux
볼 수 있으므로 무엇이 node
누락되었는지 잘 모르겠습니다.
cpulimit -l 50 -e node
내가 실행 중인 플랫폼은 Ubuntu 14.04이지만 이 문제는 Linux 버전과 관련이 없는 것 같습니다.
내 현재 직업은
cpulimit -l 50 -p $(pidof node)
그러나 이는 노드 프로세스의 새로운 인스턴스를 감지하지 못한다는 것을 의미합니다.
답변1
cpulimit
우리 모두 알고 있듯이 어떤 상황에서는 제대로 작동하지 않습니다. 때로는 잘 작동하지만(단순한 단일 스레드 응용 프로그램에서는) 다른 경우에는(대부분 다중 스레드 또는 다중 프로세스) 작동하지 않습니다.
기술적으로, CPUlimit가 제한되지 않게 만드는 두 가지 문제가 있습니다. 첫째, 실행하려는 프로그램은 생성된 스레드가 생성된 스레드의 자식이 아닌 방식으로 스레드나 프로세스를 생성합니다. 이렇게 하는 데에는 여러 가지 이유가 있지만 다소 드문 경우입니다.
둘째, SIGSTOP은 "처리"할 수 있는 신호가 아닙니다. 그러나 신호는 비동기적입니다. 따라서 스레드 a는 캔 포크 스레드 b입니다. 스레드 b가 시작되면 스레드 a에 SIGSTOP 신호가 발행될 수 있지만 스레드 b는 신호 없이 시작됩니다.
SIGSTOP은 또한 "가능한 경우" 프로세스를 일시 중지합니다. 때로는 특히 디스크 io의 경우 스레드가 일시 중지되지 않습니다. 제가 생각할 수 있는 가장 일반적인 것은 디스크 IO입니다.
즉, SIGSTOP(cpulimit가 사용하는 것)은 하나의 스레드와 다른 모든 하위 스레드를 중지한다고 가정하지만, 다른 프로세스를 시작할 수 있는 복잡한 다중 스레드 애플리케이션에서 예상한 대로 항상 작동하지는 않습니다. 이러한 경우 기존 일정 제약 조건을 사용하면 더 나은 서비스를 받을 수 있습니다.
답변2
@Mark Plotnick의 의견을 바탕으로 마침내 이유를 알아냈습니다.
ls -l "/proc/$(pidof node)/exe"
반품
lrwxrwxrwx 1 antony antony 0 Aug 27 13:04 /proc/4414/exe -> /usr/bin/nodejs
그래서 node
나는 사용해야한다nodejs
다음 명령은 유효합니다
cpulimit -l 50 -e nodejs
업데이트: 이것은 실제로 완벽한 솔루션이 아닙니다. 예, 프로세스를 cpulimit
감지하는 것이 가능합니다 . 하지만 영구 스크립트를 nodejs
실행하는 경우 경고 없이 스크립트가 조기에 종료될 수 있습니다.nodejs
cpulimit
nodejs
업데이트 2: 콘솔/터미널에는 nodejs 프로세스가 중지된 것으로 표시되지만 실제로는 nodejs가 여전히 백그라운드에서 실행 중입니다.