mirror of
http://git.haproxy.org/git/haproxy.git/
synced 2025-02-20 12:46:56 +00:00
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:
parent
a700420671
commit
58b73f9fa8
@ -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 */
|
||||
|
@ -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)
|
||||
|
@ -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++) {
|
||||
|
Loading…
Reference in New Issue
Block a user