skywind3000 / kcp

:zap: KCP - A Fast and Reliable ARQ Protocol
MIT License
15.34k stars 2.5k forks source link

你好,请问ikcp_check的返回的结果一直是<=interval的,这个正常吗? #268

Closed dantezhu closed 4 years ago

dantezhu commented 4 years ago

我们是使用epoll+kcp的模式。 由于有很多client连接,所以我们通过ikcp_check来计算出epoll的等待超时时间,但是经过测试发现ikcp_check结果基本都是<=interval的,这样并没有减少调用kcp_update,实际上反而增多了。

是我们使用的方法有问题吗?还是干脆不用ikcp_check,所有client直接每10ms调用kcp_update算了?

dantezhu commented 4 years ago

image 看了下源码,发现有这样一行限制,也就是kcp_check返回的时间差一定小于等于interval,那这样的kcp_update调用频率不是比固定调用频率还要高?还是我的理解有问题,望指教。

skywind3000 commented 4 years ago

当然要小于等于 interval,tcp 也有内部 interval 必须定时刷新的功能。

假设 interval = 10ms,用 ikcp_check 的意义在于能发现比如 3 毫秒以后就需要 update 的情况,你用 10ms 的周期调用你会错过这样的时机,而你用 1ms 的间隔调用,又会太过频繁。

dantezhu commented 4 years ago

@skywind3000 ,谢谢回答,我想再讨论一下的主要是这里:

使用该方法,原来在处理2000个 kcp连接且每 个连接每10ms调用一次update,改为 check机制后,cpu从 60%降低到 15%。

这里是最佳实践里面写的,原本不用kcp_check是每个连接每隔10ms调用一次kcp_update,但是如你上面评论所说,如果使用了kcp_check,调用的间隔只会小于等于10ms,那这时候的cpu是如何下降的呢?调用频率更高了,cpu不是应该升高才对吗?

还请继续指教下,如果有理解不对的地方,还请作者海涵。

skywind3000 commented 4 years ago

用了 kcp_check 你就可以把 interval 设置高,然后不需要那么频繁的 update

dantezhu commented 4 years ago

@skywind3000 明白了多谢! 那如果我把interval设置很大之后,文档里面是说如果触发了kcp_input/kcp_output,需要在下一个interval周期调用一次update,这样会不会有点久?还是此时立即调用update比较好?又或者此时也是用kcp_check获取一下下次调用update的时间来定时调用比较好?

32haojiufangjia commented 1 year ago

吾亦有此问