MINOR: pollers: only update the local date during busy polling

This patch modifies epoll, kqueue and evports (the 3 pollers that support
busy polling) to only update the local date in the inner polling loop,
the global one being done when leaving the loop. Testing with epoll on
a 24c/48t machine showed a boost from 53M to 352M loops/s, indicating
that the loop was spending 85% of its time updating the global date or
causing side effects (which was confirmed with perf top showing 67% in
clock_update_global_date() alone).
This commit is contained in:
Willy Tarreau 2022-09-21 08:11:38 +02:00
parent a700420671
commit 58b73f9fa8
3 changed files with 6 additions and 3 deletions

View File

@ -230,7 +230,7 @@ static void _do_poll(struct poller *p, int exp, int wake)
int timeout = (global.tune.options & GTUNE_BUSY_POLLING) ? 0 : wait_time;
status = epoll_wait(epoll_fd[tid], epoll_events, global.tune.maxpollevents, timeout);
clock_update_date(timeout, status);
clock_update_local_date(timeout, status);
if (status) {
activity[tid].poll_io++;
@ -242,6 +242,7 @@ static void _do_poll(struct poller *p, int exp, int wake)
break;
} while (1);
clock_update_global_date();
fd_leaving_poll(wait_time, status);
/* process polled events */

View File

@ -211,7 +211,7 @@ static void _do_poll(struct poller *p, int exp, int wake)
break;
}
}
clock_update_date(timeout, nevlist);
clock_update_local_date(timeout, nevlist);
if (nevlist || interrupted)
break;
@ -221,6 +221,7 @@ static void _do_poll(struct poller *p, int exp, int wake)
break;
} while(1);
clock_update_global_date();
fd_leaving_poll(wait_time, nevlist);
if (nevlist > 0)

View File

@ -183,7 +183,7 @@ static void _do_poll(struct poller *p, int exp, int wake)
kev, // struct kevent *eventlist
fd, // int nevents
&timeout_ts); // const struct timespec *timeout
clock_update_date(timeout, status);
clock_update_local_date(timeout, status);
if (status) {
activity[tid].poll_io++;
@ -195,6 +195,7 @@ static void _do_poll(struct poller *p, int exp, int wake)
break;
} while (1);
clock_update_global_date();
fd_leaving_poll(wait_time, status);
for (count = 0; count < status; count++) {