chenshuo / muduo

Event-driven network library for multi-threaded Linux server in C++11
https://github.com/chenshuo/muduo
Other
14.7k stars 5.15k forks source link

关于如何实现定时关闭大量TcpConnection。 #527

Closed CHENCHAO0526 closed 2 years ago

CHENCHAO0526 commented 3 years ago

我想问怎么实现定时关闭大量TcpConnection。假设在1s内来了大量的连接,我们对每个连接都设置如果一个10s内没有数据来往的话,就关闭TcpConnection的操作。假设连接是在100万级别,那么相当于要对红黑树实现的timerQueue进行100万个插入操作,相当于对100万个时间进行排序,那么这样带来的排序消耗会太大吗?我不是清楚如果都能实现百万的qps了,那是不是100万个数的排序都是小操作了。 总之,我的问题就是应该怎么实现大量连接的定时关闭。

orchidFang commented 3 years ago

我想问怎么实现定时关闭大量TcpConnection。假设在1s内来了大量的连接,我们对每个连接都设置如果一个10s内没有数据来往的话,就关闭TcpConnection的操作。假设连接是在100万级别,那么相当于要对红黑树实现的timerQueue进行100万个插入操作,相当于对100万个时间进行排序,那么这样带来的排序消耗会太大吗?我不是清楚如果都能实现百万的qps了,那是不是100万个数的排序都是小操作了。 总之,我的问题就是应该怎么实现大量连接的定时关闭。

每个连接建立的时候都记录下时间,每过一秒遍历一次所有的连接,判断此连接的连接时间如果已经过去了10s,关闭该连接就可以了吧。

CHENCHAO0526 commented 3 years ago

原来硕哥是有讲过的,这样确实造成的压力太大了,可以考虑使用timewheel。http://www.cppblog.com/Solstice/archive/2011/05/04/145691.html

chenshuo commented 3 years ago

你可以看一下 muduo/examples/idleconnection/sortedlist.cc 用链表实现的版本,应该比 timewheel 更简单高效。