我正在重新设计现有的L2TP(第2层隧道协议)代码。
对于L2TP,我们支持的隧道数是96K。L2TP协议有一个保持活动的机制,它需要发送HELLO-msges。
假设我们有96000个隧道,L2TPd在配置超时值后需要发送HELLO msg,那么实现它的最佳方法是什么?
现在,我们有一个计时器线程,每1秒,我们迭代并发送HELLO msges。这是一个旧的设计,现在不可扩展。
请给我推荐一种能处理大量计时器的设计。
最佳答案
有两种方法可以实现计时器:
1)选择:此系统调用允许您等待文件描述符,然后唤醒。您可以等待一个文件描述符,该描述符不作为超时
2)Posix条件变量:与select类似,它们内置了超时机制。
3)如果您使用的是UNIX,可以设置一个UNIX信号来唤醒。
这些是基本的想法。您可以看到它们扩展到多个计时器的效果;我猜对于一些线程,您必须有多个condvar/选择。
根据你想要的行为,你可能需要每100个定时器一个线程,然后使用上面的一个机制来唤醒
一个计时器。你会有一根线在一个圈里,保持
跟踪100个超时,然后醒来。
一旦超过100个计时器,您只需创建一个新线程,让它管理接下来的100个计时器,以此类推。
我不知道100是不是正确的粒度,但这是你要玩的东西。
希望这就是你想要的。