Nice catch. Patch applied.
Thanks for your work with that one. Cheers, Simon. On 11/02/2019 16:04, Florent Fourcot wrote: > We detected a performance issue on a dnsmasq running many dhcp sessions > (more than 10 000). At the end of the day, the server was only releasing > old DHCP leases but was consuming a lot of CPU. > > It looks like curent dhcp pruning: > 1) it's pruning old sessions (iterate on all current leases). It's > important to note that it's only pruning session expired since more > than one second > 2) it's looking for next lease to expire (iterate on all current leases > again) > 3) it launchs an alarm to catch next expiration found in step 2). This > value can be zero for leases just expired (but not pruned). > > So, for a second, dnsmasq could fall in a "prune loop" by doing: > * Not pruning anything, since difftime() is not > 0 > * Run alarm again with zero as argument > > On a server with very large number of leases and releasing often > sessions, that can waste a very big CPU time. > > Signed-off-by: Florent Fourcot <florent.four...@wifirst.fr> > --- > src/lease.c | 2 +- > 1 file changed, 1 insertion(+), 1 deletion(-) > > diff --git a/src/lease.c b/src/lease.c > index 97bee21..7299227 100644 > --- a/src/lease.c > +++ b/src/lease.c > @@ -563,7 +563,7 @@ void lease_prune(struct dhcp_lease *target, time_t now) > for (lease = leases, up = &leases; lease; lease = tmp) > { > tmp = lease->next; > - if ((lease->expires != 0 && difftime(now, lease->expires) > 0) || > lease == target) > + if ((lease->expires != 0 && difftime(now, lease->expires) >= 0) || > lease == target) > { > file_dirty = 1; > if (lease->hostname) > _______________________________________________ Dnsmasq-discuss mailing list Dnsmasq-discuss@lists.thekelleys.org.uk http://lists.thekelleys.org.uk/mailman/listinfo/dnsmasq-discuss