Re: Setting "nice" values - Mailing list pgsql-performance

From Madison Kelly
Subject Re: Setting "nice" values
Date
Msg-id 454F3434.4030205@alteeve.com
Whole thread Raw
In response to Re: Setting "nice" values  (Tobias Brox <tobias@nordicbet.com>)
Responses Re: Setting "nice" values
List pgsql-performance
Tobias Brox wrote:
> [Madison Kelly - Thu at 10:25:07AM -0500]
>> Will the priority of the script pass down to the pgsql queries it calls?
>> I figured (likely incorrectly) that because the queries were executed by
>> the psql server the queries ran with the server's priority.
>
> I think you are right, and in any case, I don't think the niceness
> value won't help much if the bottleneck is iowait.
>
> In our application, I've made a special function for doing
> low-priority transactions which I believe is quite smart - though maybe
> not always.  Before introducing this logic, we observed we had a tipping
> point, too many queries, and the database wouldn't swallow them fast
> enough, and the database server just jammed up, trying to work at too
> many queries at once, yielding the results far too slow.
>
> In the config file, I now have those two flags set:
>
>  stats_start_collector = on
>  stats_command_string = on
>
> This will unfortunately cause some CPU-load, but the benefit is great
> - one can actually check what the server is working with at any time:
>
>   select * from pg_stat_activity
>
> with those, it is possible to check a special view pg_stat_activity -
> it will contain all the queries the database is working on right now.
> My idea is to peek into this table - if there is no active queries,
> the database is idle, and it's safe to start our low-priority
> transaction.  If this view is full of stuff, one should certainly not
> run any low-priority transactions, rather sleep a bit and try again
> later.
>
>  select count(*) from pg_stat_activity where not current_query like
>  '<IDLE>%' and query_start+?<now()
>
> The algorithm takes four parameters, the time value to put in above,
> the maximum number of queries allowed to run, the sleep time between
> each attempt, and the amount of attempts to try before giving up.
>
>
> So here are the cons and drawbacks:
>
>  con: Given small queries and small transactions, one can tune this in
>       such a way that the low priority queries (almost) never causes
>       significant delay for the higher priority queries.
>
>  con: can be used to block users of an interactive query
>       application to cause disturbances on the production database.
>
>  con: can be used for pausing low-priority batch jobs to execute only
>       when the server is idle.
>
>  drawback: unsuitable for long-running queries and transactions
>
>  drawback: with fixed values in the parameters above, one risks that
>            the queries never gets run if the server is sufficiently stressed.
>
>  drawback: the stats collection requires some CPU
>
>  drawback: the "select * from pg_stats_activity" query requires some CPU
>
>  drawback: the pg_stats_activity-view is constant within the
>            transaction, so one has to roll back if there is activity
>            (this is however not a really bad thing, because one
>            certainly shouldn't live an idle transaction around if the
>            database is stressed).

I can see how this would be very useful (and may make use of it later!).
For the current job at hand though, at full tilt it can take a few hours
to run, which puts it into your "drawback" section. The server in
question is also almost under load of some sort, too.

A great tip and one I am sure to make use of later, thanks!

Madi

pgsql-performance by date:

Previous
From: Jim Nasby
Date:
Subject: Re: Setting "nice" values
Next
From: Madison Kelly
Date:
Subject: Re: Setting "nice" values