epoll 的 maxevents 参数

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)
22s22s22s26s26s48s

线程数:4
实例数:80
每个实例步骤数:16
每个实例睡眠: 0s

epoll(1,1)epoll(1,2)epoll(1,4)epoll(1,8)epoll(1,16)epoll(1,32)
1s 681ms1s 193ms1s 271ms1s 641ms1s 249ms1s 377ms
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值