epoll_wait空转问题耗费CPU
void co_eventloop( stCoEpoll_t *ctx,pfn_co_eventloop_t pfn,void *arg ) 在这个函数中调用epoll_wait定时1ms查询,进程请求量小时,会出现空转浪费CPU,可能达到1%到2%。 如果进程数量过多的话,这个CPU浪费也较明显。 建议这里考虑用户根据请求量来动态设置epoll_wait定时参数。
比如,可以根据void co_eventloop( stCoEpoll_t *ctx,pfn_co_eventloop_t pfn,void *arg )中的 pfn_co_eventloop_t pfn回调函数的返回值动态设置epoll_wait超时时间。
看设计是1ms 是为了检查 timeout用的。 其实可以这样:在 loop 前计算一下所有请求中的最小超时时间min_timeout ,epoll_wait 超时指定为 min_timeout 就能解决问题
一般这个timeout值都是固定的,可以根据自身情况设置。 如果在loop前计算所有请求的最小超时时间,则需要查询Epoll_t->pTimeout里最小的timeout时间,这个时间复杂度是o(n) n=60*1000,这个还是不太划算的。
比较折中的方案是检查Xms内有没有到期的定时器,有的话wait到最近到期的定时器;没有的话直接wait Xms