백그라운드 작업에서 파일을 처리하는 애플리케이션을 개발 중입니다. 이러한 작업은 각 작업에 대한 명령을 생성하는 작업자 프로세스에 의해 선택됩니다. 작업 관리자 프로세스는 시스템 단위에서 실행됩니다.
특정 파일은 실행된 명령이 너무 많은 메모리를 소비하게 하여 시스템의 나머지 부분을 고갈시킬 수 있습니다. 따라서 생성된 각 프로세스가 소비할 수 있는 메모리 양을 제한하고 싶습니다. 단일 처리 작업을 종료하는 것은 허용됩니다.
처음에는 를 사용해 보았지만 ulimit
잘 작동하지 않는 것 같습니다. 제가 이해한 바에 따르면 "현대적인" 방법은 cgroup을 사용하는 것입니다(예:여기). 사실 내가 달리면
systemd-run --user --scope -p MemoryHigh=200M -p MemoryMax=250M MemorySwapMax=0M /path/to/program
입력 파일로 인해 프로그램이 더 많은 메모리를 할당하게 되면 프로그램 속도가 느려지고 결국 종료됩니다. 엄청난!
이러한 메모리 제한을 감독자 프로세스의 시스템 단위 파일에 추가할 수 있지만 한 작업이 RAM을 너무 많이 소비하면 모든 작업과 감독자가 종료됩니다.
systemd-run
그런 다음 위의 "래퍼"를 사용하여 새 프로세스를 생성하도록 애플리케이션 코드를 변경했습니다 . 그러나 이는 실패한다
버스에 연결할 수 없습니다. 미디어를 찾을 수 없습니다.
systemd-run --user
활성 사용자 세션이 필요한 것 같기 때문에 시스템 서비스 내에서 권한이 없는 시스템 사용자로 실행되는 서비스 컨텍스트에서는 사용할 수 없는 것 같습니다 . systemd-run --system
반면에 그것은 사용에 실패합니다
임시 범위 단위를 시작할 수 없습니다. 대화형 인증이 필요합니다.
차라리 루트로 서비스를 실행하는 것을 피하고 싶습니다.
그렇다면 내 서비스에서 생성된 각 하위 프로세스의 메모리 소비를 어떻게 제한할 수 있습니까? 현재 저는 Arch에서 systemd 251을 실행하고 있지만 Ubuntu 20.04 또는 22.04에서도 작동한다면 좋을 것입니다.