매우 오랜 시간 동안 실행되는 매우 무거운(메모리/CPU 집약적) 프로세스를 시작하면 잠시 후 OS가 임의로 해당 프로세스를 종료합니까?
즉, 운영 체제가 백그라운드 프로세스 실행을 중지하는 한도가 있습니까?
이러한 제한을 구성할 수 있습니까? 그것들은 어디에 정의되어 있나요?
답변1
예, 실제로 그러한 제한이 있습니다. 그들이 전화한다리소스 제한(r 한계). 다양한 제한사항이 있습니다. CPU 시간, 메모리, 열린 파일 수 등
커널은 프로세스가 다른 한도를 초과하면 프로세스에 다른 신호를 보냅니다. 프로세스가 올바르게 반응하지 않으면 종료됩니다.
각 rlimit에는 두 가지 값이 있습니다. 첫 번째는 전류 제한입니다. 두 번째는 최대 한도입니다(설정할 수 있는 최대 한도입니다). 루트(보다 정확하게는 CAP_SYS_RESOURCE
유능한 사용자)만이 최대 제한을 늘리거나 현재 제한을 최대 제한보다 크게 설정할 수 있습니다.
한계를 조작하는 getrlimit()
시스템 호출이 있습니다 .setrlimit()
기본적으로 대부분의 리소스 제한에는 큰 값이 포함되어 있으므로 제한이 없습니다. 물론 커널 설계 제한, 사용 가능한 RAM, 디스크의 사용 가능한 공간 등으로 인해 실질적인 제한이 있습니다.
답변2
이러한 정책을 구현하는 방법은 여러 가지가 있지만 기본적으로 존재하지 않는 이유는 매우 분명합니다. 시스템이 최대 잠재력을 발휘하도록 설계되었기 때문입니다. 비유: 시속 200km로 달리는 자동차를 구입하고 연료 탱크가 100리터인 경우 속도를 100km/h로 제한하고 탱크가 멈출 때 멈추는 소프트웨어로 제어되는 것을 원하지 않을 것입니다. 2/3가 비어 있습니다. "장시간" 운전한 경우에도 차량을 정지하십시오.
"장기 실행"에 대한 보편적인 정의는 없습니다. 40분이 긴 시간인가요? 8시간은 어때요? 24 시간? 3 일? 일주일, 한 달 또는 1년? 이 중 그다지 특이한 것은 없습니다.
rasen이 언급한 리소스 제한과 관련하여 이는 "해당 정책을 시행"하는 주요 수단입니다. 실제로 이 작업을 수행하는 방법을 묻지 않았으므로 이에 대해 설명하는 데 시간을 낭비하지는 않겠습니다. 그러나 제한 사항에 대해서는 질문하셨습니다. CPU와 메모리는 없습니다. 이것은 getrlimit
/ setrlimit
systemcalls 매뉴얼 페이지에서 가져온 것입니다:
getrlimit() 및 setrlimit() 시스템 호출은 각각 자원 제한을 가져오고 설정합니다. 각 리소스에는 rlimit 구조로 정의된 관련 소프트 제한과 하드 제한이 있습니다 [...]RLIM_INFINITY 값은 리소스에 제한이 없음을 나타냅니다.(getrlimit()에 의해 반환된 구조 및 setrlimit()에 전달된 구조에서).
따라서 이를 프로그래밍 방식으로 확인하는 것은 상대적으로 쉽습니다.
#include <stdio.h>
#include <sys/resource.h>
#include <errno.h>
#include <string.h>
#include <stdint.h>
int main (void) {
struct rlimit rl;
int resources[] = {
RLIMIT_CPU,
RLIMIT_DATA,
RLIMIT_AS,
RLIMIT_RSS
};
char labels[][16] = { "CPU", "Data", "Virtual", "Resident" };
int rlen = sizeof(resources) / sizeof(int);
printf("RLIM_INFINITY is %lu\n", (uint64_t)RLIM_INFINITY);
for (int i = 0; i < rlen; i++) {
if (getrlimit(resources[i], &rl) != 0) {
fprintf(stderr,"!!%s\n", strerror(errno));
return -1;
}
printf("%8s soft: %lu hard: %lu\n",
labels[i],
(uint64_t)rl.rlim_cur,
(uint64_t)rl.rlim_max
);
}
return 0;
}
직접 컴파일해서 gcc -std=gnu99
사용해 볼 수 있습니다. 이는 커널에 직접 쿼리하기 때문에 가장 명시적인 정보 소스입니다. 누군가 의도적으로 시스템에 제한을 구성하지 않는 한 다음과 같은 결과가 나타납니다.
RLIM_INFINITY is 18446744073709551615
CPU soft: 18446744073709551615 hard: 18446744073709551615
Data soft: 18446744073709551615 hard: 18446744073709551615
Virtual soft: 18446744073709551615 hard: 18446744073709551615
Resident soft: 18446744073709551615 hard: 18446744073709551615
프로그래머가 아닌 분들을 위해 명확히 설명하자면, "RLIM_INFINITY" 값은 "무한대" 또는 제한 없음을 나타내기 위한 값입니다(컴퓨터는 무한대를 숫자로 표현할 수 없기 때문입니다). RLIMIT 필드는 매뉴얼 페이지에 요약되어 설명되어 있습니다.
RLIMIT_CPU: CPU 시간 제한(초)입니다.
RLIMIT_DATA: 프로세스 데이터 세그먼트(초기화된 데이터, 초기화되지 않은 데이터 및 힙)의 최대 크기입니다.
RLIMIT_AS: 프로세스 가상 메모리(주소 공간)의 최대 크기(바이트)입니다.
RLIMIT_RSS: 프로세스의 상주 세트(RAM에 상주하는 가상 페이지 수)의 제한(페이지 단위)을 지정합니다.
top
(CPU, DATA, VIRT, RSS)에서 볼 수 있는 실제 사용량 값 에 해당합니다 .
다시 말하지만 일반 Linux 시스템에서는프로세스당 CPU 또는 메모리에 제한이 없습니다., 하지만 이렇게 설정할 수 있습니다.