disable mmap prefetch/readahead for NUMA systems

This commit is contained in:
zrm 2023-05-21 16:33:10 -04:00
parent 6fc5f17e21
commit 0d23f8ce8d

View file

@ -163,6 +163,9 @@ static std::string llama_format_win_err(DWORD err) {
} }
#endif #endif
extern "C" {
bool ggml_is_numa();
}
struct llama_mmap { struct llama_mmap {
void * addr; void * addr;
size_t size; size_t size;
@ -176,8 +179,10 @@ struct llama_mmap {
size = file->size; size = file->size;
int fd = fileno(file->fp); int fd = fileno(file->fp);
int flags = MAP_SHARED; int flags = MAP_SHARED;
// prefetch/readahead impairs performance on NUMA systems
if (ggml_is_numa()) prefetch = 0;
#ifdef __linux__ #ifdef __linux__
flags |= MAP_POPULATE; if (prefetch) flags |= MAP_POPULATE;
#endif #endif
addr = mmap(NULL, file->size, PROT_READ, flags, fd, 0); addr = mmap(NULL, file->size, PROT_READ, flags, fd, 0);
if (addr == MAP_FAILED) { if (addr == MAP_FAILED) {
@ -191,6 +196,14 @@ struct llama_mmap {
strerror(errno)); strerror(errno));
} }
} }
if (ggml_is_numa()) {
// advise the kernel not to use readahead
// (because the next page might not belong on the same node)
if (madvise(addr, file->size, MADV_RANDOM)) {
fprintf(stderr, "warning: madvise(.., MADV_RANDOM) failed: %s\n",
strerror(errno));
}
}
} }
~llama_mmap() { ~llama_mmap() {