상위 프로세스가 아닌 분기된 하위 프로세스에만 메모리/CPU 제한을 설정하려면 어떻게 해야 합니까?

상위 프로세스가 아닌 분기된 하위 프로세스에만 메모리/CPU 제한을 설정하려면 어떻게 해야 합니까?

apache2를 전체 프로세스 트리(apache2 및 모든 분기된 하위 프로세스)에서 사용하는 최대 X 메모리 양이 아니라 분기된 각 하위 작업자 프로세스에서 사용하는 최대 X 메모리 양으로 제한하는 방법이 있습니까?

cgroups/systemd를 사용하여 솔루션을 시도했지만 모든 것이 각 하위 프로세스를 개별적으로 제한하는 것이 아니라 기본 프로세스와 모든 하위 프로세스의 조합을 제한합니다.

저는 apache2뿐만 아니라 하위 프로세스를 생성하는 모든 프로세스에서 작동하는 솔루션을 찾고 있습니다.

답변1

호출하려면 애플리케이션(귀하의 경우 오픈 소스인 Apache2)의 소스 코드를 개선하기만 하면 됩니다.제한 설정(2)통화 성공 후포크(2), 하지만 전화하기 전에실행(2).

setrlimit왜냐하면 당신은 정말로 시스템 호출을 완료 하고 싶기 때문입니다.뒤쪽에(설정한 내용은 쉘의 내장 기능을 통해 fork추가 호출이 있을 때까지 유지됩니다 .)setrlimitulimit

Linux 작동 방식을 더 잘 이해하는 데 시간을 투자하세요.시스템 호출(2)일(특히fork& execve& setrlimit) 및 사용 방법과 시기. 나는 좋은 Linux 시스템 프로그래밍 책을 읽는 것이 좋습니다.알칼리성 포스파타제.

따라서 사용 중인 모든 프로그램을 약간만 변경하지 않는 한 달성하려는 목표는 종종 비현실적입니다. 이것유닉스 철학fork이는 이를 금지하는 의 디자인에 영감을 주었습니다 .execvesetrlimit

물론 원칙적으로는 말도 안 되는 일을 할 수도 있습니다.LD_PRELOAD기술오버로드 동작 fork( setrlimit0을 반환한 후 호출) 또는 execve( setrlimit그 전에 syscall 호출)동적 링크 실행 가능 파일(또는 자신의 변형을 패치하는 것과 동일 libc.so) 그러나 이는 불합리합니다. 당신은 또한 볼 수 있습니다파일 1)또는LDD(1)동적으로 링크된 실행 파일을 탐지합니다.

그러나 ulimit쉘 내장 기능을 사용하여 Apache2 및 모든 하위 키를 제한할 수 있습니다. Apache2 문서를 자세히 살펴보면 하위 프로세스에 대한 많은 설정이 있습니다.

관련 정보