투명한 hugepage가 있는 버퍼에 할당된 메모리를 사용할 수 없습니다(프로세스 종료).

투명한 hugepage가 있는 버퍼에 할당된 메모리를 사용할 수 없습니다(프로세스 종료).

나는 1TB의 RAM을 가지고 있으며 그 중 900GB를 프로세스 내에서 할당하고 사용해야 합니다(나는 하드웨어에 대한 모든 권한을 가지고 있으며 베어메탈에서 작업하고 있습니다). (개인, 익명)을 사용하여 900GB의 메모리를 할당한 mmap()다음 이를 사용하여 madvise()Fedora 37에서 투명한 hugepage를 설정했습니다. 그러면 이 900GB는 데이터로 선형적으로 채워집니다.

이것은 실제 프로그램은 아니지만 메모리 액세스 유형에 대한 아이디어를 제공합니다.

#include <stdlib.h>
#include <stdio.h>
#include <stdint.h>
#include <sys/mman.h>

int main() {
    const uint64_t n = 900000000000ULL;
    char *p = (char *)mmap(NULL, PROT_READ | PROT_WRITE, MAP_PRIVATE | MAP_ANONYMOUS, -1, 0);
    madvise(p, n, MADV_HUGEPAGE);
    for(uint64_t i = 0; i < n; i++) p[i] = i; // Which data is immaterial
}

더 많은 메모리에 액세스할수록 시스템이 투명한 hugepage를 할당하는 것을 볼 수 있습니다. 그러나 현재 사용되는 버프/캐시 메모리(예: 300GB)를 할당하자마자 프로세스는 쉘도 종료되지 않고 강제로 종료되며 아무런 신호도 보고되지 않습니다. /var/log/messages또는 메시지가 없습니다 dmesg(예: OOM 킬러는 문제가 없는 것 같습니다).

그것은 남용 문제가 아닙니다. 그것은 그것과 관련이 있습니다 vm.overcommit_memory = 1. 나는 vm.vfs_cache_pressure = 1000심지어 Linux가 버퍼/캐시 페이지를 비우도록 시도했습니다. 결과가 없다.

게다가 mmap()호출을 표준으로 바꾸면 malloc()모든 것이 원활하게 작동합니다. 프로세스가 점점 더 많은 메모리를 사용함에 따라 버퍼/캐시 메모리가 점차 해제됩니다. 이는 특히 투명한 hugepages(커널 버그?) 관련 문제입니다.

현재 프로그램을 시작하기 전에 이 작업을 수행하고 echo 3 > /proc/sys/vm/drop_caches있으며 이 방법을 사용하면 투명한 hugepages로 거의 모든 메모리를 할당하고 사용할 수 있지만 이는 올바른 방법이 아닙니다.

어떤 제안이 있으십니까?

관련 정보