저는 Ubuntu 16.04에서 fork
일부 설정과 exec
다른 프로그램을 수행하는 프로그램을 작성 중입니다. 다음을 수행해야 합니다.
- 프로그램이 사용할 수 있는 최대 VSS를 제한합니다.
- 프로그램이 사용할 수 있는 최대 RSS 제한
- 프로그램 실행 중에 사용된 최대 VSS를 측정합니다.
- 실행 중에 프로그램이 사용하는 최대 RSS를 측정합니다.
지금까지 다음 1.과 4를 수행할 수 있습니다.
pid_t chpid = fork();
if (!chpid) {
// I do lots of setup here
struct rlimit rlim;
rlim.rlim_cur = rlim.rlim_max = limit_VSS;
setrlimit(RLIMIT_AS, &rlim); // 1.
execv(path, args);
}
struct rusage stats;
wait3(NULL, 0, &stats);
long max_RSS = stats.ru_maxrss; // 4.
2.와 3.을 어떻게 구현할 수 있나요?
RLIMIT_RSS
의 옵션이 setrlimit
작동하지 않는 것 같고, 프로세스가 종료된 후(또는 이전)에 들어가는 방법을 모르겠습니다 VmPeak
./proc/pid/status
효율적인 방법, 즉 exec
프로그램에 큰 영향을 미치지 않는 방법이 필요합니다. ( ptrace
예를 들어 이를 위한 몇 가지 도구가 있지만 valgrind
실행 속도가 크게 느려집니다.)
답변1
RSS 사용에서 VSS를 분리하는 방법을 모르지만 메모리 풀을 사용하거나 malloc 대안을 사용하여 시스템의 최대 할당을 모니터링 및/또는 강제 적용하는 것을 고려할 수 있습니다.
taskstats 프로세스 통계 패키지를 살펴보세요. 최종 메모리 사용량은 기록하지 않지만 RSS 사용량과 VM 사용량의 최고 수위 표시는 기록합니다. 이것이 바로 원하는 것일 수 있습니까? Ubuntu 16.04 커널에 표준으로 제공되는지 잘 모르겠습니다. 이를 얻으려면 커널 모듈을 빌드해야 할 수도 있습니다.