Fedora 20 memory.limit_in_bytes가 작동하지 않습니다.

Fedora 20 memory.limit_in_bytes가 작동하지 않습니다.

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에 불과하며 malloc30초 동안 대기한 후 버퍼를 해제하고 종료됩니다.

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를 사용하지 않으면 프로그램이 요청한 메모리를 할당할 수 없을 것으로 예상됩니다.

관련 정보