maxevents: Size (in terms of number of events) of the caller event buffer.
超过 maxevents 的就绪事件会被抛弃吗?
epoll 源码:https://github.com/torvalds/linux/blob/master/fs/eventpoll.c
epoll_wait 的调用栈:
epoll_wait
do_epoll_wait
ep_poll
ep_send_events
ep_scan_ready_list
第 733 行:
/*
* Quickly re-inject items left on "txlist".
*/
// 上一次没有处理完的 epitem, 重新插入到ready list
list_splice(&txlist, &ep->rdllist);
可见,超过 maxevents 的事件下次还会被处理。
必须够了 maxevents 个事件,才会传到用户空间吗?
epoll_wait
do_epoll_wait
ep_poll
第 1843 行:
eavail =ep_events_available(ep);
if (eavail)
goto send_events;
...
send_events:
/*
* Try to transfer events to user space. In case we get 0 events and
* there's still timeout left over, we go trying again in search of
* more luck.
*/
if (!res && eavail &&
!(res =ep_send_events(ep, events, maxevents)) && !timed_out)
goto fetch_events;
第 378 行:
static inline int ep_events_available(struct eventpoll *ep)
{
return !list_empty_careful(&ep->rdllist) ||
READ_ONCE(ep->ovflist) != EP_UNACTIVE_PTR;
}
可见,只要有事件就可以传到用户空间。
改变 maxevents 值
线程数:4
实例数:80
每个实例步骤数:5
每个实例的第一个步骤睡眠: 1s
epoll(1,1) | epoll(1,2) | epoll(1,4) | epoll(1,8) | epoll(1,16) | epoll(1,32) |
---|---|---|---|---|---|
22s | 22s | 22s | 26s | 26s | 48s |
线程数:4
实例数:80
每个实例步骤数:16
每个实例睡眠: 0s
epoll(1,1) | epoll(1,2) | epoll(1,4) | epoll(1,8) | epoll(1,16) | epoll(1,32) |
---|---|---|---|---|---|
1s 681ms | 1s 193ms | 1s 271ms | 1s 641ms | 1s 249ms | 1s 377ms |