저는 C와 Java용 온라인 코드 편집기를 만들고 있습니다. 사용자는 무한 루프를 작성할 가능성이 높습니다. 시스템 수준 설정에서 이러한 프로세스의 CPU 및 메모리 사용률을 제한할 수 있는 방법이 있습니까?
내 백엔드는 사용자로부터 코드를 받아 컴파일하고 실행하는 nodejs 프로세스입니다. 특정 CPU 및 메모리 제한을 초과하면 프로세스를 종료하고 싶습니다.
답변1
예, 두 가지 주요 방법은 setrlimit(2)
및 (Linux의 경우) 제어 그룹입니다.
주요 장점 setrlimit
은 단순성과 이식성(POSIX에서 지정한 대로)입니다. fork
그런 다음 제한을 설정한 RLIMIT_AS
다음 RLIMIT_CPU
코드 exec
를 설정 합니다 . 단점은 프로세스별이므로 코드가 여전히 한계를 넘어갈 수 있다는 것입니다(포크하는 모든 프로세스는 동일한 한계를 가지지만 공유되지는 않습니다). 실패 RLIMIT_NPROC
하도록 설정할 수도 있습니다 fork
(물론 분기가 필요한 코드는 테스트할 수 없습니다).
제어 그룹(cgroup)의 주요 장점은 프로세스와 모든 하위 프로세스를 함께 처리할 수 있다는 것입니다. 즉, 조합상의 한계가 있습니다. 단점은 이식성이 없고(Linux에만 해당) 복잡성이 높다는 것입니다. 시스템에서 제어 그룹을 관리하는 경우 systemd와 대화해야 할 수도 있습니다. cgroup에 대한 가장 좋은 소개는 다음과 같습니다.LWN에 대한 Neil Brown의 Control Group 시리즈.
또 다른 접근 방식은 (적어도 KVM의 경우) 호스트에 대한 사소한 프로세스가 되도록 VM에서 코드를 실행하는 것입니다. 더 무겁지만 많은 격리 기능을 제공합니다.
또한 참고 사항으로많은신뢰할 수 없는 임의의 코드를 실행하면 무한 루프보다 걱정할 것이 더 많습니다. 예를 들어 누군가가 스팸 봇을 업로드하는 것을 원하지 않을 것입니다. 기존 구현을 살펴보는 것이 좋습니다. 하지만 제가 아는 한 해당 구현은 오픈 소스가 아닙니다.