libco icon indicating copy to clipboard operation
libco copied to clipboard

co_epoll_wait 的 timeout 设置优化。

Open wenfh2020 opened this issue 4 years ago • 3 comments

co_epoll_wait 的 timeout 这里默认为 1 有点暴力了,建议先捞一个快到期的事件,当前时间与到期的时间差进行等待。详细可以参考 redis 的事件处理: numevents = aeApiPoll(eventLoop, tvp);

void co_eventloop(stCoEpoll_t *ctx, pfn_co_eventloop_t pfn, void *arg) {
    ...
    for (;;) {
        int ret = co_epoll_wait(ctx->iEpollFd, result, stCoEpoll_t::_EPOLL_SIZE, 1);
        ...
   }
   ...
}

wenfh2020 avatar Dec 30 '20 03:12 wenfh2020

我就做了这个优化,把计时器中最近的一个计时器距离现在的时间作为epoll超时时间,但是其实系统如果进入epoll,说明没有活跃协程了,设置1多轮询几次也没啥毛病

hsbyhub avatar Feb 18 '22 07:02 hsbyhub

我就做了这个优化,把计时器中最近的一个计时器距离现在的时间作为epoll超时时间,但是其实系统如果进入epoll,说明没有活跃协程了,设置1多轮询几次也没啥毛病

请问你说的活跃协程是用来做什么工作的?具体场景是啥?举个栗子。

wenfh2020 avatar Feb 18 '22 10:02 wenfh2020

我就做了这个优化,把计时器中最近的一个计时器距离现在的时间作为epoll超时时间,但是其实系统如果进入epoll,说明没有活跃协程了,设置1多轮询几次也没啥毛病

请问你说的活跃协程是用来做什么工作的?具体场景是啥?举个栗子。

我没有细看libco调度器的模型,我在我自己写的协程库中,调度器主循环负责唤起协程列表(协程在这里说明协程需要时间片)中所有协程,当这个列表没有协程了,说明当前存在空闲时间片了,此时主循环才进入epoll并把超时时间设置为最近的计时器的触发时间,你可以到我的仓库看一看 https://github.com/hsbyhub/libxco

hsbyhub avatar Feb 18 '22 10:02 hsbyhub