질문:
프로세스가 주어지면 해당 프로세스와 해당 하위 프로세스가 사용할 수 있는 리소스를 제한합니다. 즉, CPU 시간과 가상 메모리 할당량을 설정합니다. 프로세스 그룹이 제한 중 하나를 초과하면 이를 종료하고, 그렇지 않으면 사용한 CPU 시간과 가상 메모리의 양을 인쇄합니다.
특정 사용 사례:
기본적으로 파일의 입력이 필요한 여러 바이너리를 실행해야 하지만 실행이 엄격하게 제한되어 있는지 확인해야 합니다. 예를 들어 바이너리는 256MB 이하의 메모리를 할당해야 하며 0.5초 이내에 실행되어야 합니다. 하지만 사용하는 메모리와 CPU의 양에 대한 정보가 필요합니다.
내가 시도한 것:
- 요즘 이것저것 처리하고 있어요이 Perl 스크립트, 지금까지 찾은 최고의 솔루션입니다. 불행히도 메모리 문제가 있어 정확하지 않습니다. 이 스크립트에 대한 공식 작성자 게시물도 있습니다.여기.
- 나는 CPU 시간 할당량을 처리하는 데 확실히 도움이 되지만 가상 메모리 제한 위반으로 인해 프로세스를 종료하지 않는
/usr/bin/timeout
Linux 도구를 사용해 보았습니다 .timeout
- 을 사용해도 보았는데
ulimit
앞서 말했듯이 제한은 물론 리소스 소모에 대한 피드백도 필요합니다.
질문:
이 문제를 어떻게 해결할 수 있습니까? .
답변1
이것제한 설정(2)syscall은 리소스 제한(CPU 시간 - 정수 초이므로 최소 1초 - RLIMIT_CPU
, 파일 크기 RLIMIT_FSIZE
, 주소 공간 RLIMIT_AS
등)과 관련이 있습니다. 설정할 수도 있습니다.디스크 할당량. 이것잠깐만요 4(2)시스템 호출은 특정 리소스의 사용에 대해 알려주고 피드백을 제공합니다. 그리고공정(5)좀 더 말해주고루사흐 얻기(2)SIGSTOP
getrusage
( 호출 또는 쿼리를 사용하여 전체 프로세스 그룹을 주기적으로 중지한 다음 /proc/$PID/
해당 프로세스 그룹에 SIGCONT
"계속" 또는 "종료"를 보내는 일부 모니터를 작성할 수 있습니다 ).SIGTERM
이것월그린드이 도구는 Linux에서 매우 유용하며 메모리 누수를 찾는 데 도움이 될 수 있습니다. 그리고트랙(1)그것도 도움이 될 것입니다.
문제의 소프트웨어를 다시 컴파일할 수 있다면 최신 버전에 대한 -fsanitize=address
다른 옵션을 고려해 보십시오 -fsanitize=undefined
.-fsanitize=
걸프 협력 협의회번역기.
어쩌면 너한테 좀 있을 수도 있겠지일괄 처리. 배치 모니터를 찾거나 C, Python, Ocaml, Perl 등으로 직접 작성하세요(명령을 분기하고 루프에서 모니터링합니다...). 어쩌면 프로세스 회계가 필요할 수도 있습니다(참조계정(5)&사(8)...)
"사용된 메모리 양"(프로그램은 일반적으로 실행 중에 커널에 메모리를 할당하고 해제함 mmap
)과 "CPU 시간"(참조:munmap
시간(7), 멀티스레드 프로그램을 생각해보세요...)는 매우 모호한 개념입니다.
당신은 또한 볼 수 있습니다폴리아크릴아미드아마도 다음을 구성하십시오 /etc/security/
.이노티파이(7)도움이 될 수도 있지만 그렇지 않을 수도 있습니다.
또한 읽어보세요고급 Linux 프로그래밍그리고시스템 호출(2)