Fedora 29(커널 3.15.10-201.fc20.x86_64) 이는 F19에서 작동합니다.
오작동하기 쉬운 특정 애플리케이션의 메모리 사용량을 제한하기 위해 cgroup을 사용하려고 하는데 문제가 발생했습니다. 테스트를 위해 작은 단일 목적 프로그램을 사용하고 있습니다.
내 파일에 다음이 있습니다 /etc/cgconfig.conf
.
group memtest {
memory {
memory.limit_in_bytes = "209715200";
memory.soft_limit_in_bytes = "104857600";
}
}
이 위치는 다음과 같습니다 /etc/cgrules.conf
.
*:memtest memory memtest/
파일 memtest.c
크기는 1GiB에 불과하며 malloc
30초 동안 대기한 후 버퍼를 해제하고 종료됩니다.
memtest
프로그램이 실행 되면 해당 PID가 올바르게 나열되어 /sys/fs/cgroup/memory/memtest/tasks
올바르게 분류되었음을 나타냅니다. 그러나 메모리 사용량은아니요제한된.
사용법이 ulimit
예상대로 작동합니다.
$ (ulimit -S -v 200000 ; ./memtest )
malloc failed: Cannot allocate memory
출처는 다음과 같습니다 memtest.c
.
#include <errno.h>
#include <stdlib.h>
#include <stdio.h>
#include <unistd.h>
main() {
char *buf;
size_t bytes = (1 * 1<<30);
errno = 0;
buf = malloc(bytes);
if (errno != 0) {
int errno_copy = errno;
perror("malloc failed");
return errno_copy;
}
printf("%d bytes allocated (requested %d)\n",
malloc_usable_size(buf),
bytes);
sleep(30);
printf("Freeing..\n");
free(buf);
return 0;
}
작업이 올바르게 분류되었지만 메모리 사용량이 제한되지 않는 이유는 무엇입니까? F19와 F20 사이에 어떤 변화가 있었나요? (지난주에 F20으로 업그레이드했습니다.)
감사해요!
답변1
언뜻 보면, 내가 생각할 수 있는 유일한 것은 (시스템에 의한) cgconfig.conf 처리가 더 엄격해졌다는 것입니다. 제한을 따옴표로 묶은 문자열로 정의하는 대신 따옴표를 제거하면 다음과 같은 일이 발생합니다. 그래서 이렇게 :
group memtest {
memory {
memory.limit_in_bytes = 209715200;
memory.soft_limit_in_bytes = 104857600;
}
}
많은 생각 끝에 memory.limit_in_bytes는 물리적 사용자 메모리만 제한하지만 스와핑을 허용한다고 생각합니다. 당신이 해야 할 일은 다음 memory.memsw.limit_in_bytes
과 같은 값으로 설정하는 것뿐입니다.memory.limit_in_bytes
group memtest {
memory {
memory.limit_in_bytes = 209715200;
memory.memsw.limit_in_bytes = 209715200;
memory.soft_limit_in_bytes = 104857600;
}
}
memory.memsw.limit_in_bytes에는 사용자 메모리와 스왑 공간이 포함됩니다. 따라서 0 스왑 공간을 원하면 memory.memsw.limit_in_bytes
다음과 같이 설정해야 합니다.memory.limit_in_bytes
이렇게 하면 ulimit -S -v 200000
가상 메모리(스왑, 공유 데이터 및 실제 메모리)를 특정 양으로 제한하므로 애플리케이션에 충분한 공간이 없게 됩니다. 그러나 일반적인 시스템 설정은 스왑 공간을 제한하지 않으므로 최대 사용자 메모리 + 사용되지 않은 스왑 공간을 사용하기에 충분한 공간이 있을 수 있습니다.
테스트하기 전에 스왑을 끄고 ulimit를 사용하지 않으면 프로그램이 요청한 메모리를 할당할 수 없을 것으로 예상됩니다.