Thread: get/set priority of PostgreSQL backends

get/set priority of PostgreSQL backends

From
Josh Kupershmidt
Date:
Hi all,

I noticed a note on the 'Priorities' wiki page[1], which talked about
the need for having "a C-language function 'nice_backend(prio)' that
renices the calling backend to "prio".', and suggests posting a link
to this list. Well, here you go:
  http://pgxn.org/dist/prioritize/

The API is a tiny bit different than what was suggested on the wiki;
the wiki suggested "nice_backend()" and "nice_backend_super()",
whereas I just consolidated those into set_backend_priority(), with
permissions checks similar to pg_cancel_backend(). There is also
get_backend_priority(), which should play nicely with the former
function, and perhaps enable scripted queries to automatically bump
priorities based on pg_stat_activity. See the doc[3] for more details.

The wiki says nice_backend_super() might be able to "renice any
backend pid and set any priority, but is usable only by the [database]
superuser", hinting that it would be feasible to lower a backend's
priority value (i.e. increase the scheduling priority). Unfortunately
this is not possible on at least OS X and Linux, where one must be
root to lower priority values. I haven't checked whether this module
works on Windows, would appreciate if someone could give it a shot
there.

I can update the 'Priorities' wiki page in a bit.

Josh

[1] http://wiki.postgresql.org/wiki/Priorities
[3] https://github.com/schmiddy/pg_prioritize/blob/master/doc/prioritize.md

Re: get/set priority of PostgreSQL backends

From
Scott Marlowe
Date:
On Sat, Apr 7, 2012 at 11:06 AM, Josh Kupershmidt <schmiddy@gmail.com> wrote:
> The wiki says nice_backend_super() might be able to "renice any
> backend pid and set any priority, but is usable only by the [database]
> superuser", hinting that it would be feasible to lower a backend's
> priority value (i.e. increase the scheduling priority). Unfortunately
> this is not possible on at least OS X and Linux, where one must be
> root to lower priority values. I haven't checked whether this module
> works on Windows, would appreciate if someone could give it a shot
> there.

I thought you were limited to only settings above 0 and your own
processes in linux.

Re: get/set priority of PostgreSQL backends

From
Josh Kupershmidt
Date:
On Sat, Apr 7, 2012 at 11:05 AM, Scott Marlowe <scott.marlowe@gmail.com> wrote:
> On Sat, Apr 7, 2012 at 11:06 AM, Josh Kupershmidt <schmiddy@gmail.com> wrote:
>> The wiki says nice_backend_super() might be able to "renice any
>> backend pid and set any priority, but is usable only by the [database]
>> superuser", hinting that it would be feasible to lower a backend's
>> priority value (i.e. increase the scheduling priority). Unfortunately
>> this is not possible on at least OS X and Linux, where one must be
>> root to lower priority values. I haven't checked whether this module
>> works on Windows, would appreciate if someone could give it a shot
>> there.
>
> I thought you were limited to only settings above 0 and your own
> processes in linux.

For non-root users, you may always only *increase* the priority values
of your processes, and the default priority value is 0. So yes as
non-root, you're effectively limited to positive and increasing values
for setpriority(), and of course you may only alter process priorities
running under the same user. I think that's what I was saying above,
though maybe I wasn't so clear.

For example, if you try to lower your own backend's priority with this
function, you'll get a warning like this:

test=# SELECT set_backend_priority(pg_backend_pid(), -1);
WARNING:  Not possible to lower a process's priority (currently 0)
 set_backend_priority
----------------------
 f
(1 row)


Josh