On Mon, Sep 19, 2011 at 10:18 AM, Tom Lane <t...@sss.pgh.pa.us> wrote: > Peter Eisentraut <pete...@gmx.net> writes: >> On sön, 2011-09-18 at 12:21 -0400, Tom Lane wrote: >>> But having said that, it wouldn't be very hard to arrange things so that >>> if you did have both symbols defined, the code would only attempt to >>> write oom_adj if it had failed to write oom_score_adj; which is about as >>> close as you're likely to get to a kernel version test for this. > >> Why is this feature not a run-time configuration variable or at least a >> configure option? It's awfully well hidden now. I doubt a lot of >> people are using this even though they might wish to. > > See the thread in which the feature was designed originally: > http://archives.postgresql.org/pgsql-hackers/2010-01/msg00170.php > > The key point is that to get useful behavior, you need cooperation > between both a root-privileged startup script and the PG executable. > That tends to throw the problem into the domain of packagers, more > than end users, and definitely puts a big crimp in the idea that > run-time configuration of just half of the behavior could be helpful. > So far, no Linux packagers have complained that the design is inadequate > (a position that I also hold when wearing my red fedora) so I do not > feel a need to complicate it further.
Startup scripts are not solely in the domain of packagers. End users can also be expected to develop/edit their own startup scripts. Providing it as GUC would have given end users both the peices, but with a compile-time option they have only one half of the solution; except if they go compile their own binaries, which forces them into being packagers. I am not alone in feeling that if Postgres wishes to provide a control over child backend's oom_score_adj, it should be a GUC parameter rather than a compile-time option. Yesterday a customer wanted to leverage this and couldn't because they refuse to maintain their own fork of Postgres code. Please find attached a patch to turn it into a GUC, #ifdef'd by __linux__ macro. Best regards, -- Gurjeet Singh http://gurjeet.singh.im/ EDB www.EnterpriseDB.com
diff --git a/src/backend/postmaster/fork_process.c b/src/backend/postmaster/fork_process.c index f6df2de..7b9bc38 100644 --- a/src/backend/postmaster/fork_process.c +++ b/src/backend/postmaster/fork_process.c @@ -22,6 +22,11 @@ #endif #ifndef WIN32 + +#ifdef __linux__ +int linux_oom_score_adj = 0; +#endif + /* * Wrapper for fork(). Return values are the same as those for fork(): * -1 if the fork failed, 0 in the child process, and the PID of the @@ -78,7 +83,7 @@ fork_process(void) * LINUX_OOM_SCORE_ADJ #defined to 0, or to some other value that you * want child processes to adopt here. */ -#ifdef LINUX_OOM_SCORE_ADJ +#ifdef __linux__ { /* * Use open() not stdio, to ensure we control the open flags. Some @@ -92,13 +97,12 @@ fork_process(void) char buf[16]; int rc; - snprintf(buf, sizeof(buf), "%d\n", LINUX_OOM_SCORE_ADJ); + snprintf(buf, sizeof(buf), "%d\n", linux_oom_score_adj); rc = write(fd, buf, strlen(buf)); (void) rc; close(fd); } } -#endif /* LINUX_OOM_SCORE_ADJ */ /* * Older Linux kernels have oom_adj not oom_score_adj. This works @@ -106,7 +110,6 @@ fork_process(void) * it's necessary to build Postgres to work with either API, you can * define both LINUX_OOM_SCORE_ADJ and LINUX_OOM_ADJ. */ -#ifdef LINUX_OOM_ADJ { /* * Use open() not stdio, to ensure we control the open flags. Some @@ -120,13 +123,13 @@ fork_process(void) char buf[16]; int rc; - snprintf(buf, sizeof(buf), "%d\n", LINUX_OOM_ADJ); + snprintf(buf, sizeof(buf), "%d\n", linux_oom_score_adj); rc = write(fd, buf, strlen(buf)); (void) rc; close(fd); } } -#endif /* LINUX_OOM_ADJ */ +#endif /* __linux__ */ /* * Make sure processes do not share OpenSSL randomness state. diff --git a/src/backend/utils/misc/guc.c b/src/backend/utils/misc/guc.c index 1d094f0..8713abb 100644 --- a/src/backend/utils/misc/guc.c +++ b/src/backend/utils/misc/guc.c @@ -128,6 +128,7 @@ extern bool synchronize_seqscans; extern char *SSLCipherSuites; extern char *SSLECDHCurve; extern bool SSLPreferServerCiphers; +extern int linux_oom_score_adj; #ifdef TRACE_SORT extern bool trace_sort; @@ -2554,6 +2555,18 @@ static struct config_int ConfigureNamesInt[] = NULL, NULL, NULL }, +#ifdef __linux__ + { + {"linux_oom_score_adj", PGC_POSTMASTER, RESOURCES_KERNEL, + gettext_noop("Sets the oom_score_adj parameter of postmaster's child processes."), + NULL, + }, + &linux_oom_score_adj, + 0, -1000, 1000, + NULL, NULL, NULL + }, +#endif /* __linux__ */ + /* End-of-list marker */ { {NULL, 0, 0, NULL, NULL}, NULL, 0, 0, 0, NULL, NULL, NULL
-- Sent via pgsql-hackers mailing list (pgsql-hackers@postgresql.org) To make changes to your subscription: http://www.postgresql.org/mailpref/pgsql-hackers