Thread
Commits
-
Avoid hard-wired sleep delays in stats regression test.
- 4e37b3e15c4e 10.0 landed
-
Reducing runtime of stats regression test
Tom Lane <tgl@sss.pgh.pa.us> — 2017-05-04T03:43:43Z
On a reasonably fast development machine, one of the biggest time sinks while running the core regression tests is the long "sleep" calls in the stats.sql regression test. I took a closer look at these, and I think we could basically get rid of them. First up is this bit at the beginning of that test script: -- wait to let any prior tests finish dumping out stats; -- else our messages might get lost due to contention SELECT pg_sleep_for('2 seconds'); The stated concern isn't really all that plausible, since even if we launch a batch of test scripts at once, they don't all finish at once, so there's unlikely to be a big pileup of traffic to the stats collector. But we don't have to take that on faith: in assert-enabled builds, pgstat_send() logs any failure to send a stats message. I have grepped the buildfarm logs for "could not send to statistics collector" log messages during the "make check" stage (a total of 754313 runs dating back ten years). What I find is that members mereswine and gull occasionally report "Network is down", and a few times currawong and thrips have complained "Invalid argument", and there are exactly no other such messages. In particular there are no EAGAIN or EWOULDBLOCK failures that would suggest congestion on the stats collector's input. So this is basically not something that happens at all in the regression tests, let alone during startup of the stats test in particular. Now, another failure mechanism that could conceivably be ameliorated by this initial wait is if one of the immediately preceding runs has performed a scan on tenk2 but doesn't manage to transmit that info before stats.sql creates its initial copy of the stats counts. Then when that count does get sent, it could look like one triggered by stats.sql itself, fooling the test. But that seems rather unlikely, because tenk2 isn't touched by very many test scripts. And even if it did happen that would not cause an observed test failure; at worst it would obscure a failure that we should have detected. I'm doubtful that this is worth losing any sleep over. In short, I think we could just drop the above wait altogether, and be no worse off. The only useful thing it's doing for us is exercising pg_sleep_for(), which is otherwise untested ... but we can transfer that responsibility into wait_for_stats(). The other significant delay in stats.sql is -- force the rate-limiting logic in pgstat_report_stat() to time out -- and send a message SELECT pg_sleep(1.0); Now, we do seem to need a delay there, because the rate-limiting logic is unlikely to have permitted the count from the immediately preceding statement to have gotten sent right then, and the count won't get sent at all while we're inside wait_for_stats (since backends only send stats just before going idle). But there's more than one way to skin this cat. We can just start a new connection with \c, and let wait_for_stats wait for the old one to send its stats before quitting. Even on my oldest and slowest buildfarm machines, starting a new session takes well under one second. In short then, I propose the attached patch, which reduces the runtime of stats.sql by a shade under 3 seconds. Given that the runtime of "make installcheck-parallel" is circa 15-17 seconds on typical current hardware, that's a nice gain. I'm not sure about backpatching. I think developers mostly only care about regression tests on HEAD, and the savings is relatively less exciting on the buildfarm, since it doesn't get any bigger on slower machines. Thoughts? regards, tom lane -
Re: Reducing runtime of stats regression test
Alvaro Herrera <alvherre@2ndquadrant.com> — 2017-05-04T13:54:49Z
Tom Lane wrote: > The other significant delay in stats.sql is > > -- force the rate-limiting logic in pgstat_report_stat() to time out > -- and send a message > SELECT pg_sleep(1.0); > > Now, we do seem to need a delay there, because the rate-limiting logic > is unlikely to have permitted the count from the immediately preceding > statement to have gotten sent right then, and the count won't get > sent at all while we're inside wait_for_stats (since backends only > send stats just before going idle). But there's more than one way > to skin this cat. We can just start a new connection with \c, and > let wait_for_stats wait for the old one to send its stats before quitting. > Even on my oldest and slowest buildfarm machines, starting a new session > takes well under one second. So you changed table prevstats from temp to permanent; perhaps make it unlogged? I wonder if it'd be useful to have a "pg_stat_flush" or something, which sends out whatever is queued in this session. Then you wouldn't need the reconnection. -- Álvaro Herrera https://www.2ndQuadrant.com/ PostgreSQL Development, 24x7 Support, Remote DBA, Training & Services
-
Re: Reducing runtime of stats regression test
Tom Lane <tgl@sss.pgh.pa.us> — 2017-05-04T14:22:01Z
Alvaro Herrera <alvherre@2ndquadrant.com> writes: > Tom Lane wrote: >> We can just start a new connection with \c, and >> let wait_for_stats wait for the old one to send its stats before quitting. >> Even on my oldest and slowest buildfarm machines, starting a new session >> takes well under one second. > So you changed table prevstats from temp to permanent; Right, so it would survive into the new session. > perhaps make it unlogged? Hardly seems worth it; there's not much data in it. And we're not generally in the habit of marking short-lived tables as unlogged elsewhere in the regression tests. (Maybe we should make some effort to have some of them be so marked, but that seems like material for its own patch.) > I wonder if it'd be useful to have a "pg_stat_flush" or something, which > sends out whatever is queued in this session. Then you wouldn't need > the reconnection. Yes, but that would be getting into the realm of new features, not post-feature-freeze test adjustments. It certainly couldn't be a candidate for back-patching. regards, tom lane
-
Re: Reducing runtime of stats regression test
Robert Haas <robertmhaas@gmail.com> — 2017-05-04T17:01:57Z
On Thu, May 4, 2017 at 10:22 AM, Tom Lane <tgl@sss.pgh.pa.us> wrote: > Yes, but that would be getting into the realm of new features, not > post-feature-freeze test adjustments. It certainly couldn't be > a candidate for back-patching. I'm not sure there's some bright line between adding a new SQL-callable function to cut down the test time and any other tinkering we might do to reduce the regression test time. I think there's a pretty good argument that all of the recent changes you made in this area constitute strictly optional tinkering. I'm haven't been objecting because they don't seem likely to destabilize anything, but I don't see that they're really helping us get ready for beta either, which is presumably what we ought to be focusing on at this point. -- Robert Haas EnterpriseDB: http://www.enterprisedb.com The Enterprise PostgreSQL Company
-
Re: Reducing runtime of stats regression test
Tom Lane <tgl@sss.pgh.pa.us> — 2017-05-04T18:25:42Z
Robert Haas <robertmhaas@gmail.com> writes: > On Thu, May 4, 2017 at 10:22 AM, Tom Lane <tgl@sss.pgh.pa.us> wrote: >> Yes, but that would be getting into the realm of new features, not >> post-feature-freeze test adjustments. It certainly couldn't be >> a candidate for back-patching. > I'm not sure there's some bright line between adding a new > SQL-callable function to cut down the test time and any other > tinkering we might do to reduce the regression test time. I think > there's a pretty good argument that all of the recent changes you made > in this area constitute strictly optional tinkering. I'm haven't been > objecting because they don't seem likely to destabilize anything, but > I don't see that they're really helping us get ready for beta either, > which is presumably what we ought to be focusing on at this point. Well, to my mind, making the regression tests faster is something that could be quite helpful during beta, because a lot of people will be running them. (Or so we hope, at least.) If the fact that e.g. the recovery tests take a lot of time discourages people from running them, that can't be a good thing for beta purposes. So I respectfully reject your opinion about what I should be working on. regards, tom lane
-
Re: Reducing runtime of stats regression test
Noah Misch <noah@leadboat.com> — 2017-07-05T02:23:04Z
On Wed, May 03, 2017 at 11:43:43PM -0400, Tom Lane wrote: > On a reasonably fast development machine, one of the biggest time sinks > while running the core regression tests is the long "sleep" calls in the > stats.sql regression test. I took a closer look at these, and I think > we could basically get rid of them. > > First up is this bit at the beginning of that test script: > > -- wait to let any prior tests finish dumping out stats; > -- else our messages might get lost due to contention > SELECT pg_sleep_for('2 seconds'); > > The stated concern isn't really all that plausible, since even if we > launch a batch of test scripts at once, they don't all finish at once, > so there's unlikely to be a big pileup of traffic to the stats collector. > But we don't have to take that on faith: in assert-enabled builds, > pgstat_send() logs any failure to send a stats message. > > I have grepped the buildfarm logs for "could not send to statistics > collector" log messages during the "make check" stage (a total of 754313 > runs dating back ten years). What I find is that members mereswine and > gull occasionally report "Network is down", and a few times currawong and > thrips have complained "Invalid argument", and there are exactly no other > such messages. In particular there are no EAGAIN or EWOULDBLOCK failures > that would suggest congestion on the stats collector's input. So this > is basically not something that happens at all in the regression tests, > let alone during startup of the stats test in particular. Linux and AIX, at least, do not make send() return an error when dropping a UDP message for lack of queue space. Thus, the lack of buildfarm logs reporting send() failure is inconclusive. Nonetheless, the lack of stats.sql failures since you finished modifying this test in mid-May suggests this was a good change. Besides, if a new member were slow enough to experience a stats pileup, I wouldn't have firm hope that 2s would suffice.