On Mon, Sep 19, 2011 at 10:18 AM, Tom Lane <[email protected]> wrote:
> Peter Eisentraut <[email protected]> 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 ([email protected])
To make changes to your subscription:
http://www.postgresql.org/mailpref/pgsql-hackers