我正在尝试使用 cgroups 来限制用户进程在具有大量内存(128 GB 或更多)的服务器上的内存使用。我们想要实现的是为 OS 和 root 进程保留大约 6GB 的 ram,其余的留给用户。我们希望确保我们始终有可用内存,并且我们不希望服务器积极交换。
如果限制设置得足够低( < 16GB ),这可以正常工作。用户进程被 cgred 正确分配到正确的 cgroup,一旦达到限制,oom 将终止内存饥渴的进程。
当我们将限制设置得更高时,问题就会出现。然后,如果进程使用超过 16G 的 ram,服务器将开始交换,即使内存使用量仍远低于限制并且有足够的 ram 可用。
是否有任何设置或某种最大值会限制我们可以在 cgroups 下授予访问权限的内存量?
这是更多信息:
我使用以下代码来模拟用户进程占用内存。代码在链表中跟踪分配的内存,以便在程序内部使用和访问内存,而不是仅使用 malloc 保留(并每次覆盖指针)。
/* gragram.c 的内容 */
#include <stdlib.h>
#include <stdio.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>
#include <unistd.h>
#include <string.h>
struct testlink {
void *ram;
struct testlink *next;
};
int main (int argc, char *argv[]) {
int block=8192;
char buf[block];
void *ram=NULL;
FILE *frandom;
int nbproc,i;
pid_t pID;
struct …Run Code Online (Sandbox Code Playgroud)