Changeset: d5d9e5fa34b8 for MonetDB URL: http://dev.monetdb.org/hg/MonetDB?cmd=changeset;node=d5d9e5fa34b8 Modified Files: gdk/gdk_bbp.c gdk/gdk_heap.c gdk/gdk_posix.c gdk/gdk_private.h gdk/gdk_utils.c tools/mserver/mserver5.c Branch: default Log Message:
Use different sizes before switching to MMAP for persistent and transient heaps. The sizes can be changed using --set: gdk_mmap_minsize_persistent (default 1<<18) and gdk_mmap_minsize_transient (default 1<<32). diffs (149 lines): diff --git a/gdk/gdk_bbp.c b/gdk/gdk_bbp.c --- a/gdk/gdk_bbp.c +++ b/gdk/gdk_bbp.c @@ -1309,8 +1309,10 @@ BBPinit(void) ATOMIC_INIT(BBPsizeLock); #endif - if (BBPfarms[0].dirname == NULL) - BBPaddfarm(".", (1 << PERSISTENT) | (1 << TRANSIENT)); + if (BBPfarms[0].dirname == NULL) { + BBPaddfarm(".", 1 << PERSISTENT); + BBPaddfarm(".", 1 << TRANSIENT); + } GDKremovedir(0, DELDIR); diff --git a/gdk/gdk_heap.c b/gdk/gdk_heap.c --- a/gdk/gdk_heap.c +++ b/gdk/gdk_heap.c @@ -99,7 +99,7 @@ HEAPalloc(Heap *h, size_t nitems, size_t GDKerror("HEAPalloc: allocating more than heap can accomodate\n"); return GDK_FAIL; } - if (h->filename == NULL || h->size < GDK_mmap_minsize) { + if (h->filename == NULL || h->size < (h->farmid == 0 ? GDK_mmap_minsize_persistent : GDK_mmap_minsize_transient)) { h->storage = STORE_MEM; h->base = (char *) GDKmallocmax(h->size, &h->size, 0); HEAPDEBUG fprintf(stderr, "#HEAPalloc " SZFMT " " PTRFMT "\n", h->size, PTRFMTCAST h->base); @@ -206,7 +206,7 @@ HEAPextend(Heap *h, size_t size, int may Heap bak = *h; size_t cur = GDKmem_cursize(), tot = GDK_mem_maxsize; int exceeds_swap = size > (tot + tot - MIN(tot + tot, cur)); - int must_mmap = h->filename != NULL && (exceeds_swap || h->newstorage != STORE_MEM || size >= GDK_mmap_minsize); + int must_mmap = h->filename != NULL && (exceeds_swap || h->newstorage != STORE_MEM || size >= (h->farmid == 0 ? GDK_mmap_minsize_persistent : GDK_mmap_minsize_transient)); h->size = size; @@ -621,7 +621,7 @@ HEAPload_intern(Heap *h, const char *nme char *srcpath, *dstpath; int t0; - h->storage = h->newstorage = h->size < GDK_mmap_minsize ? STORE_MEM : STORE_MMAP; + h->storage = h->newstorage = h->size < (h->farmid == 0 ? GDK_mmap_minsize_persistent : GDK_mmap_minsize_transient) ? STORE_MEM : STORE_MMAP; if (h->filename == NULL) h->filename = (char *) GDKmalloc(strlen(nme) + strlen(ext) + 2); if (h->filename == NULL) diff --git a/gdk/gdk_posix.c b/gdk/gdk_posix.c --- a/gdk/gdk_posix.c +++ b/gdk/gdk_posix.c @@ -557,7 +557,7 @@ MT_mremap(const char *path, int mode, vo #else p = MAP_FAILED; if (path == NULL || - *new_size <= GDK_mmap_minsize) { + *new_size <= GDK_mmap_minsize_persistent) { /* size not too big yet or * anonymous, try to make new * anonymous mmap and copy diff --git a/gdk/gdk_private.h b/gdk/gdk_private.h --- a/gdk/gdk_private.h +++ b/gdk/gdk_private.h @@ -246,7 +246,8 @@ extern struct BBPfarm_t { extern int BBP_dirty; /* BBP table dirty? */ extern batlock_t GDKbatLock[BBP_BATMASK + 1]; extern bbplock_t GDKbbpLock[BBP_THREADMASK + 1]; -extern size_t GDK_mmap_minsize; /* size after which we use memory mapped files */ +extern size_t GDK_mmap_minsize_persistent; /* size after which we use memory mapped files for persistent heaps */ +extern size_t GDK_mmap_minsize_transient; /* size after which we use memory mapped files for transient heaps */ extern size_t GDK_mmap_pagesize; /* mmap granularity */ extern MT_Lock GDKnameLock; extern MT_Lock GDKthreadLock; diff --git a/gdk/gdk_utils.c b/gdk/gdk_utils.c --- a/gdk/gdk_utils.c +++ b/gdk/gdk_utils.c @@ -273,8 +273,12 @@ BATSIGinit(void) /* memory thresholds; these values some "sane" constants only, really * set in GDKinit() */ -size_t GDK_mmap_minsize = (size_t) 1 << 18; -size_t GDK_mmap_pagesize = (size_t) 1 << 16; /* mmap granularity */ +#define MMAP_MINSIZE_PERSISTENT ((size_t) 1 << 18) +#define MMAP_MINSIZE_TRANSIENT ((size_t) 1 << 32) +#define MMAP_PAGESIZE ((size_t) 1 << 16) +size_t GDK_mmap_minsize_persistent = MMAP_MINSIZE_PERSISTENT; +size_t GDK_mmap_minsize_transient = MMAP_MINSIZE_TRANSIENT; +size_t GDK_mmap_pagesize = MMAP_PAGESIZE; /* mmap granularity */ size_t GDK_mem_maxsize = GDK_VM_MAXSIZE; size_t GDK_vm_maxsize = GDK_VM_MAXSIZE; @@ -539,8 +543,10 @@ GDKinit(opt *set, int setlen) } else if (strcmp("gdk_vm_maxsize", n[i].name) == 0) { GDK_vm_maxsize = (size_t) strtoll(n[i].value, NULL, 10); GDK_vm_maxsize = MAX(1 << 30, GDK_vm_maxsize); - } else if (strcmp("gdk_mmap_minsize", n[i].name) == 0) { - GDK_mmap_minsize = (size_t) strtoll(n[i].value, NULL, 10); + } else if (strcmp("gdk_mmap_minsize_persistent", n[i].name) == 0) { + GDK_mmap_minsize_persistent = (size_t) strtoll(n[i].value, NULL, 10); + } else if (strcmp("gdk_mmap_minsize_transient", n[i].name) == 0) { + GDK_mmap_minsize_transient = (size_t) strtoll(n[i].value, NULL, 10); } else if (strcmp("gdk_mmap_pagesize", n[i].name) == 0) { GDK_mmap_pagesize = (size_t) strtoll(n[i].value, NULL, 10); if (GDK_mmap_pagesize < 1 << 12 || @@ -588,9 +594,13 @@ GDKinit(opt *set, int setlen) snprintf(buf, sizeof(buf), SZFMT, GDK_mem_maxsize); GDKsetenv("gdk_mem_maxsize", buf); } - if (GDKgetenv("gdk_mmap_minsize") == NULL) { - snprintf(buf, sizeof(buf), SZFMT, GDK_mmap_minsize); - GDKsetenv("gdk_mmap_minsize", buf); + if (GDKgetenv("gdk_mmap_minsize_persistent") == NULL) { + snprintf(buf, sizeof(buf), SZFMT, GDK_mmap_minsize_persistent); + GDKsetenv("gdk_mmap_minsize_persistent", buf); + } + if (GDKgetenv("gdk_mmap_minsize_transient") == NULL) { + snprintf(buf, sizeof(buf), SZFMT, GDK_mmap_minsize_transient); + GDKsetenv("gdk_mmap_minsize_transient", buf); } if (GDKgetenv("gdk_mmap_pagesize") == NULL) { snprintf(buf, sizeof(buf), SZFMT, GDK_mmap_pagesize); @@ -723,8 +733,9 @@ GDKreset(int status) #endif GDKdebug = 0; strcpy(GDKdbpathStr,"dbpath"); - GDK_mmap_minsize = (size_t) 1 << 18; - GDK_mmap_pagesize = (size_t) 1 << 16; + GDK_mmap_minsize_persistent = MMAP_MINSIZE_PERSISTENT; + GDK_mmap_minsize_transient = MMAP_MINSIZE_TRANSIENT; + GDK_mmap_pagesize = MMAP_PAGESIZE; GDK_mem_maxsize = GDK_VM_MAXSIZE; GDK_vm_maxsize = GDK_VM_MAXSIZE; diff --git a/tools/mserver/mserver5.c b/tools/mserver/mserver5.c --- a/tools/mserver/mserver5.c +++ b/tools/mserver/mserver5.c @@ -502,12 +502,8 @@ main(int argc, char **av) fprintf(stderr, "!ERROR: cannot create directory for %s\n", dbpath); exit(1); } - if (dbextra) { - BBPaddfarm(dbpath, 1 << PERSISTENT); - BBPaddfarm(dbextra, 1 << TRANSIENT); - } else { - BBPaddfarm(dbpath, (1 << PERSISTENT) | (1 << TRANSIENT)); - } + BBPaddfarm(dbpath, 1 << PERSISTENT); + BBPaddfarm(dbextra ? dbextra : dbpath, 1 << TRANSIENT); GDKfree(dbpath); if (monet_init(set, setlen) == 0) { mo_free_options(set, setlen); _______________________________________________ checkin-list mailing list checkin-list@monetdb.org https://www.monetdb.org/mailman/listinfo/checkin-list