diff --git a/src/backend/port/sysv_shmem.c b/src/backend/port/sysv_shmem.c index 9de96ed..6bd9b54 100644 --- a/src/backend/port/sysv_shmem.c +++ b/src/backend/port/sysv_shmem.c @@ -591,9 +591,19 @@ CreateAnonymousSegment(Size *size) ptr = mmap(NULL, allocsize, PROT_READ | PROT_WRITE, PG_MMAP_FLAGS | mmap_flags, -1, 0); mmap_errno = errno; - if (huge_pages == HUGE_PAGES_TRY && ptr == MAP_FAILED) - elog(DEBUG1, "mmap(%zu) with MAP_HUGETLB failed, huge pages disabled: %m", - allocsize); + if (ptr != MAP_FAILED) + using_huge_pages = true; + else if (huge_pages == HUGE_PAGES_TRY) + ereport(LOG, + (errmsg("could not map anonymous shared memory: %m"), + (mmap_errno == ENOMEM) ? + errhint("This error usually means that PostgreSQL's request " + "for a shared memory segment exceeded available memory, " + "swap space, or huge pages. To reduce the request size " + "(currently %zu bytes), reduce PostgreSQL's shared " + "memory usage, perhaps by reducing shared_buffers or " + "max_connections.", + allocsize) : 0)); } #endif diff --git a/src/backend/port/win32_shmem.c b/src/backend/port/win32_shmem.c index d7a7199..fad1f38 100644 --- a/src/backend/port/win32_shmem.c +++ b/src/backend/port/win32_shmem.c @@ -293,9 +293,10 @@ retry: huge_pages == HUGE_PAGES_TRY && (flProtect & SEC_LARGE_PAGES) != 0) { - elog(DEBUG1, "CreateFileMapping(%zu) with SEC_LARGE_PAGES failed, " - "huge pages disabled", - size); + ereport(LOG, + (errmsg("could not create shared memory segment: error code %lu", GetLastError()), + errdetail("Failed system call was CreateFileMapping(size=%zu, name=%s).", + size, szShareMem))); /* * Use the original size, not the rounded-up value, when @@ -324,6 +325,8 @@ retry: Sleep(1000); continue; } + if ((flProtect & SEC_LARGE_PAGES) != 0) + using_huge_pages = true; break; } diff --git a/src/backend/utils/misc/guc.c b/src/backend/utils/misc/guc.c index 467b0fd..10148c3 100644 --- a/src/backend/utils/misc/guc.c +++ b/src/backend/utils/misc/guc.c @@ -639,6 +639,7 @@ int ssl_renegotiation_limit; */ int huge_pages; int huge_page_size; +bool using_huge_pages; /* * These variables are all dummies that don't do anything, except in some @@ -2116,6 +2117,16 @@ static struct config_bool ConfigureNamesBool[] = NULL, NULL, NULL }, + { + {"using_huge_pages", PGC_INTERNAL, RESOURCES_MEM, + gettext_noop("Whether the instance is using HugePages."), + NULL + }, + &using_huge_pages, + false, + NULL, NULL, NULL + }, + /* End-of-list marker */ { {NULL, 0, 0, NULL, NULL}, NULL, false, NULL, NULL, NULL diff --git a/src/include/storage/pg_shmem.h b/src/include/storage/pg_shmem.h index 059df1b..48efba6 100644 --- a/src/include/storage/pg_shmem.h +++ b/src/include/storage/pg_shmem.h @@ -45,6 +45,7 @@ typedef struct PGShmemHeader /* standard header for all Postgres shmem */ extern int shared_memory_type; extern int huge_pages; extern int huge_page_size; +extern bool using_huge_pages; /* Possible values for huge_pages */ typedef enum