Hi Thomas,
Here is the patch we are using now on AIX for enabling SysV shm for AIX, which improves greatly the performance on AIX. It is compile time. It seems to me that you'd like this to become a shared_memory_type GUC. Correct? However, I do not know how to do. Even as-is, this patch would greatly improve the performance of PostgreSQL v11.1 in the field on AIX machines. So, we'd like this change to be available for AIX asap. What are the next steps to get this patch accepted? or What are your suggestions for improving it? Thanks/Regards Cordialement, Tony Reix tony.r...@atos.net ATOS / Bull SAS ATOS Expert IBM Coop Architect & Technical Leader Office : +33 (0) 4 76 29 72 67 1 rue de Provence - 38432 Échirolles - France www.atos.net<https://mail.ad.bull.net/owa/redir.aspx?C=PvphmPvCZkGrAgHVnWGsdMcDKgzl_dEIsM6rX0g4u4v8V81YffzBGkWrtQeAXNovd3ttkJL8JIc.&URL=http%3a%2f%2fwww.atos.net%2f> ________________________________ De : REIX, Tony Envoyé : lundi 26 novembre 2018 18:00:15 À : Thomas Munro Cc : Andres Freund; Robert Haas; Pg Hackers; EMPEREUR-MOT, SYLVIE; BERGAMINI, DAMIEN Objet : RE: Shared Memory: How to use SYSV rather than MMAP ? Hi Thomas, You said: I think we should respect the huge_pages GUC, as we do on Linux and Windows (since there are downsides to using large pages, maybe not everyone would want that). It could even be useful to allow different page sizes to be requested by GUC (I see that DB2 has an option to use 16GB pages -- yikes). It also seems like a good idea to have a shared_memory_type GUC as Andres proposed (see his link), instead of using a compile time option. I guess it was made a compile time option because nobody could imagine wanting to go back to SysV shm! (I'm still kinda surprised that MAP_ANONYMOUS memory can't be coaxed into large pages by environment variables or loader controls, since apparently other things like data segments etc apparently can, though I can't find any text that says that's the case and I have no AIX system). I guess that you are talking about CPP & C variables: #ifndef MAP_HUGETLB HUGE_PAGES_ON HUGE_PAGES_TRY) in addition to : huge_pages = .... in postgresql.conf file. For now, these variables for Huge Pages are used only for MMAP. About SysV shared memory, as far as I know, shmget() options for AIX and Linux are different. Moreover, AIX also provides Large Pages (16MB). About Andres proposal, I've read his link. However, the patch he proposed: 0001-Add-shared_memory_type-GUC.patch<https://www.postgresql.org/message-id/attachment/33090/0001-Add-shared_memory_type-GUC.patch> is no more available (Attachment not found). I confirm that I got the SysV Shared Memory by means of a "compile time option". About "still kinda surprised that MAP_ANONYMOUS memory can't be coaxed into large pages by environment variables or loader controls" I confirm that, on AIX, only 4K pages are available for mmap(). I do agree that options in the postgresql.conf file would be the best solution, since the code for SysV shared memory and MMAP shared memory seems always present. Regards, Tony
--- ./src/backend/port/sysv_shmem.c.ORIGIN 2018-11-23 11:05:31 +0100 +++ ./src/backend/port/sysv_shmem.c 2018-11-23 11:16:04 +0100 @@ -63,9 +63,14 @@ * developer use, this shouldn't be a big problem. Because of this, we do * not worry about supporting anonymous shmem in the EXEC_BACKEND cases below. */ +#if !defined(_AIX) #ifndef EXEC_BACKEND #define USE_ANONYMOUS_SHMEM #endif +// On AIX, 64K pages can be used only with SysV shared memory. +// Not defining USE_ANONYMOUS_SHMEM on AIX leads to SysV shared memory. +#endif + typedef key_t IpcMemoryKey; /* shared memory key passed to shmget(2) */ @@ -125,7 +130,13 @@ } #endif - shmid = shmget(memKey, size, IPC_CREAT | IPC_EXCL | IPCProtection); + shmid = shmget(memKey, size, IPC_CREAT | IPC_EXCL | IPCProtection +#if !defined(_AIX) + ); +#else + // On AIX, SHM_LGPAGE & SHM_PIN are required in order to be able to use Large Pages + | SHM_LGPAGE | SHM_PIN | S_IRUSR | S_IWUSR); +#endif if (shmid < 0) { @@ -155,7 +166,13 @@ */ if (shmget_errno == EINVAL) { - shmid = shmget(memKey, 0, IPC_CREAT | IPC_EXCL | IPCProtection); + shmid = shmget(memKey, 0, IPC_CREAT | IPC_EXCL | IPCProtection +#if !defined(_AIX) + ); +#else + // On AIX, SHM_LGPAGE & SHM_PIN are required in order to be able to use Large Pages + | SHM_LGPAGE | SHM_PIN | S_IRUSR | S_IWUSR); +#endif if (shmid < 0) { --- ./src/include/storage/dsm_impl.h.ORIGIN 2018-11-23 11:33:45 +0100 +++ ./src/include/storage/dsm_impl.h 2018-11-23 11:34:40 +0100 @@ -30,7 +30,12 @@ #else #ifdef HAVE_SHM_OPEN #define USE_DSM_POSIX +#if !defined(_AIX) #define DEFAULT_DYNAMIC_SHARED_MEMORY_TYPE DSM_IMPL_POSIX +#else +// On AIX, 64K pages can be used only with SysV shared memory +#define DEFAULT_DYNAMIC_SHARED_MEMORY_TYPE DSM_IMPL_SYSV +#endif // AIX #endif #define USE_DSM_SYSV #ifndef DEFAULT_DYNAMIC_SHARED_MEMORY_TYPE