Re: Eager page freeze criteria clarification - Mailing list pgsql-hackers
From | Robert Haas |
---|---|
Subject | Re: Eager page freeze criteria clarification |
Date | |
Msg-id | CA+TgmobfVSPWWdW7ji+efwQf05_8VXUKqakt9UXjMbAkuOCFpw@mail.gmail.com Whole thread Raw |
In response to | Re: Eager page freeze criteria clarification (Andres Freund <andres@anarazel.de>) |
Responses |
Re: Eager page freeze criteria clarification
Re: Eager page freeze criteria clarification |
List | pgsql-hackers |
On Fri, Sep 8, 2023 at 12:07 AM Andres Freund <andres@anarazel.de> wrote: > > Downthread, I proposed using the RedoRecPtr of the latest checkpoint > > rather than the LSN of the previou vacuum. I still like that idea. > > Assuming that "downthread" references > https://postgr.es/m/CA%2BTgmoYb670VcDFbekjn2YQOKF9a7e-kBFoj2WJF1HtH7YPaWQ%40mail.gmail.com > could you sketch out the logic you're imagining a bit more? I'm not exactly sure what the question is here. I mean, it doesn't quite make sense to just ask whether the page LSN is newer than the last checkpoint's REDO record, because I think that's basically just asking whether or not we would need an FPI, and the freeze criteria that Melanie has been considering incorporate that check in some other way already. But maybe some variant on that idea is useful - the distance to the second-most-recent checkpoint, or a multiple or percentage of the distance to the most-recent checkpoint, or whatever. > The reason I was thinking of using the "lsn at the end of the last vacuum", is > that it seems to be more adapative to the frequency of vacuuming. Yes, but I think it's *too* adaptive. The frequency of vacuuming can plausibly be multiple times per minute or not even annually. That's too big a range of variation. The threshold for freezing can vary by how actively the table or the page is updated, but I don't think it should vary by six orders of magnitude. Under what theory does it make sense to say that say "this row in table hasn't been modified in 20 seconds, so let's freeze it, but this row in table B hasn't been modified in 8 months, so let's not freeze it because it might be modified again soon"? If you use the LSN at the end of the last vacuum, you're going to end up making decisions exactly like that, which seems wrong to me. > Perhaps we can mix both approaches. We can use the LSN and time of the last > vacuum to establish an LSN->time mapping that's reasonably accurate for a > relation. For infrequently vacuumed tables we can use the time between > checkpoints to establish a *more aggressive* cutoff for freezing then what a > percent-of-time-since-last-vacuum appach would provide. If e.g. a table gets > vacuumed every 100 hours and checkpoint timeout is 1 hour, no realistic > percent-of-time-since-last-vacuum setting will allow freezing, as all dirty > pages will be too new. To allow freezing a decent proportion of those, we > could allow freezing pages that lived longer than ~20% > time-between-recent-checkpoints. Yeah, I don't know if that's exactly the right idea, but I think it's in the direction that I was thinking about. I'd even be happy with 100% of the time-between-recent checkpoints, maybe even 200% of time-between-recent checkpoints. But I think there probably should be some threshold beyond which we say "look, this doesn't look like it gets touched that much, let's just freeze it so we don't have to come back to it again later." I think part of the calculus here should probably be that when the freeze threshold is long, the potential gains from making it even longer are not that much. If I change the freeze threshold on a table from 1 minute to 1 hour, I can potentially save uselessly freezing that page 59 times per hour, every hour, forever, if the page always gets modified right after I touch it. If I change the freeze threshold on a table from 1 hour to 1 day, I can only save 23 unnecessary freezes per day. Percentage-wise, the overhead of being wrong is the same in both cases: I can have as many extra freeze operations as I have page modifications, if I pick the worst possible times to freeze in every case. But in absolute terms, the savings in the second scenario are a lot less. I think if a user is accessing a table frequently, the overhead of jamming a useless freeze in between every table access is going to be a lot more noticeable then when the table is only accessed every once in a while. And I also think it's a lot less likely that we'll reliably get it wrong. Workloads that touch a page and then touch it again ~N seconds later can exist for all values of N, but I bet they're way more common for small values of N than large ones. Is there also a need for a similar guard in the other direction? Let's say that autovacuum_naptime=15s and on some particular table it triggers every time. I've actually seen this on small queue tables. Do you think that, in such tables, we should freeze pages that haven't been modified in 15s? > Hm, possibly stupid idea: What about using shared_buffers residency as a > factor? If vacuum had to read in a page to vacuum it, a) we would need read IO > to freeze it later, as we'll soon evict the page via the ringbuffer b) > non-residency indicates the page isn't constantly being modified? This doesn't seem completely stupid, but I fear it would behave dramatically differently on a workload a little smaller than s_b vs. one a little larger than s_b, and that doesn't seem good. -- Robert Haas EDB: http://www.enterprisedb.com
pgsql-hackers by date: