나는 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로 거의 모든 메모리를 할당하고 사용할 수 있지만 이는 올바른 방법이 아닙니다.
어떤 제안이 있으십니까?