그래프에서 일부 알고리즘을 실행하기 위해 networkx 패키지를 사용하는 Python 스크립트를 실행하고 있습니다.
스크립트는
import networkx as nx
from networkx.algorithms.approximation import clique
G = nx.read_adjlist("newman_one_mode.adj")
print "the number of nodes in the graph is: " + str(G.number_of_nodes())
max_clique_nodes = clique.max_clique(G)
print "the clique nodes are: " + str(max_clique_nodes)
시간이 오래 걸리고 CPU 사용량(99%)이 높기 때문에 CPU 사용량을 제한하고 싶습니다.
이 프로세스에서 cpulimit를 사용하여 CPU 사용량을 60%로 제한합니다.
cpulimit -p 29780 -l 60
그런데 사용을 하면 아래와 같이 프로세스가 중지됩니다.
[lily@geland academic]$ python run.py
the number of nodes in the graph is: 16264
[1]+ Stopped python run.py
무엇이 잘못되었으며 이 상황을 어떻게 처리해야 합니까? 감사해요!
부가 정보: cpulimit를 실행하지 않으면 프로세스가 오랫동안 실행된 다음 종료됩니다. 이유는 모르겠습니다. 아마도 리소스가 고갈되었기 때문일 것입니다.
[lily@geland academic]$ python run.py
the number of nodes in the graph is: 16264
[1]+ Terminated python run.py
Killed
답변1
이는 예상된 동작입니다.
cpulimit는 CPU 리소스를 너무 많이 소모하는 경우 프로세스를 일시 중지하고 일정 시간이 지나면 프로세스를 다시 시작합니다.
또한 스크립트가 입력을 기다리고 있는지 확인하세요. 그렇다면 스크립트도 중지된 상태가 됩니다.
stdin을 리디렉션하고 cpulimit를 다시 실행해 보세요. 예:python run.py < /dev/null &
답변2
너는 더 나을지도 몰라좋아요이 접근 방식은 cpulimit
약간 해킹적이며 셸 작업 제어 및 기타 메커니즘에서는 제대로 작동하지 않을 수 있기 때문입니다.
nice
이는 스케줄링 우선순위를 변경하는 운영 체제의 기능 이므로 cpulimit
프로세스가 특정 비율을 초과할 때까지 원하는 속도로 실행한 다음 SIGSTOP 신호를 수신하고 절전 모드로 전환하는 것보다 훨씬 더 원활합니다. , 신호 제어.
간단한 예로, "아무데도 0을 복사하지 않는" 쉘 스크립트를 고려해보세요.
$ cat waster
#!/bin/sh
dd if=/dev/zero of=/dev/null count=${1}000000
$ time ./waster 5 # takes about 3.7 seconds on my machine
$ time ./waster 10 # takes about 7.4 seconds, no surprise
이제 동시에 실행하십시오.
$ time ./waster 5 & time ./waster 10 &
CPU를 놓고 경쟁하기 때문에 7.1초, 11.1초가 걸립니다. 하지만 내가 덧붙이면nice
$ time ./waster 5 & time nice -n 19 ./waster 10 &
그런 다음 첫 번째는 약 4.0초가 걸리고 "nice"는 12.9초가 걸립니다. "nice"가 가능한 가장 낮은 우선순위를 가져서 첫 번째가 가능한 한 많은 CPU 리소스를 차지할 수 있기 때문입니다. 그리고 프로세스가 중지되지 않습니다.
답변3
맨페이지에서:
cpulimit는 항상 SIGSTOP 및 SIGCONT 신호를 프로세스에 보내 프로세스를 제어하고 소비하는 평균 CPU 양을 제한할 수 있는지 확인합니다. 이로 인해 작업이 중지되었음을 나타내는 잘못된(성가신) 작업 제어 메시지가 나타날 수 있습니다(실제로는 중지되었지만 즉시 다시 시작됨). 이로 인해 SIGSTOP/SIGCONT에 의존하는 감지 또는 대화형 셸에 문제가 발생할 수도 있습니다. 예를 들어, 작업을 포그라운드에 두었는데 해당 작업이 즉시 중지되었다가 백그라운드에서 다시 시작되는 것을 발견할 수 있습니다.
원천:http://manpages.ubuntu.com/manpages/xenial/man1/cpulimit.1.html
→ 이는 쉘에 문제가 있음을 의미합니다. 프로세스는 백그라운드에서 계속 실행되지만 쉘은 연결되지 않습니다.
달성하려는 목표에 따라 출력을 파일로 리디렉션하거나 대화형 세션이 필요한 경우 셸을 다시 연결할 수 있습니다.