垃圾回收

为了将不再被使用的连接单元回收,我们在连接上设置一个定时器,当连接超时,将该连接回收。因为系统中有可能存在几百万个并发连接,若使用内核中的定时器,几百万个连接单元系统的定时器的列表中,系统每隔1/100秒进行单元的迁移和回收已超时的连接单元,这会占用很多系统的开销。

因为连接的回收并不需要很精确,我们可以让系统的定时器每隔1秒启动连接回收程序来回收那些超时的连接。为此,我们设计了一个慢定时器,连接的定时都是以1秒钟为单位。用三个时间大转盘,第一个转盘有1024个刻度,定时在1024秒钟之内的连接都挂接在第一个转盘的各个刻度上;第二个转盘有256个刻度,定时在[210, 218)区间的落在第二个转盘上;第三个转盘有256个刻度,定时在[218, 226)区间的落在第三个转盘上。

慢定时器处理程序每隔1秒由系统定时器启动运行一次,将第一个转盘当前指针上的连接进行回收,再将指针顺时针转一格。若指针正好转了一圈,则对第二个转盘当前指针上的连接进行操作,根据他们的定时迁移到第一个转盘上,再将指针顺时针转一格。若第二个转盘的指针正好转了一圈,则对第三个转盘当前指针上的连接进行操作,根据他们的定时迁移到第二个转盘上。

使用这种慢定时器极大地提高了过期连接的回收问题。在最初的版本中,我们是直接使用系统的定时器进行超时连接的回收,但是当并发连接数增加到500,000时,系统的CPU使用率已接近饱和,所以我们重新设计了这种高效的垃圾回收机制。