我一直在构建一个用于多媒体消息的高吞吐服务器应用程序,实现语言为C++。每个服务器可以单独使用,也可以将多个服务器组合在一起创建基于DHT的覆盖网络;这些服务器就像Skype中的超级对等点。
目前正在进行中。目前,该服务器可以处理大约每秒200,000条消息(256字节消息),并且在我的机器上具有大约256 MB/s的最大吞吐量(Intel i3 Mobile 2 GHz,Fedora Core 18(64位),4 GB RAM),用于长度为4096字节的消息。服务器有两个线程,一个线程处理所有IO(基于epoll,边缘触发),另一个线程处理传入的消息。还有另一个线程用于覆盖管理,但在当前讨论中不重要。
讨论中的两个线程使用两个循环缓冲区共享数据。第1个线程使用一个循环缓冲区将新鲜的消息排队给第2个线程,而第2个线程通过另一个循环缓冲区返回已处理的消息。服务器完全无锁。我没有使用任何同步原语,甚至没有使用原子操作。
循环缓冲区永远不会溢出,因为消息是预分配的(在启动时预先分配)。实际上,为了减少内存碎片和增加缓存效率,所有重要/经常使用的数据结构都是预分配的,因此我们知道服务器启动时我们将创建的最大消息数量,因此我们可以预先计算缓冲区的最大大小,然后相应地初始化循环缓冲区。
现在我的问题是:线程#1一次将序列化的消息(实际上是指向消息对象的指针)排队,而线程#2按块(32/64/128个块)从队列中取出消息,并通过第二个循环缓冲区返回已处理的消息。如果没有新消息,线程#2会保持繁忙等待,从而始终保持一个CPU核心繁忙。如何进一步改进设计?繁忙等待策略的替代方案是什么?我想以优雅和高效的方式完成这项工作。我考虑过使用信号量,但我担心这不是最好的解决方案,因为每次在线程#1中排队消息时我必须调用“sem_post”,这可能会显着降低吞吐量,第二个线程必须调用“sem_post”相同次数以防止信号量溢出。此外,我担心信号量实现可能在内部使用互斥。
第二个好选择可能是使用信号,如果我能发现一种算法,只有在第二个线程“清空队列并正在调用sigwait”或“已经在sigwait上等待”的情况下才会引发信号,简而言之,必须最少次数引发信号,尽管如果比所需次数多引发几次信号也不会有害。是的,我确实使用了Google搜索,但我在互联网上找到的解决方案都不令人满意。以下是一些考虑因素:
A.服务器在进行系统调用时必须尽量浪费最少的CPU周期,并且必须最少使用系统调用次数。
目前正在进行中。目前,该服务器可以处理大约每秒200,000条消息(256字节消息),并且在我的机器上具有大约256 MB/s的最大吞吐量(Intel i3 Mobile 2 GHz,Fedora Core 18(64位),4 GB RAM),用于长度为4096字节的消息。服务器有两个线程,一个线程处理所有IO(基于epoll,边缘触发),另一个线程处理传入的消息。还有另一个线程用于覆盖管理,但在当前讨论中不重要。
讨论中的两个线程使用两个循环缓冲区共享数据。第1个线程使用一个循环缓冲区将新鲜的消息排队给第2个线程,而第2个线程通过另一个循环缓冲区返回已处理的消息。服务器完全无锁。我没有使用任何同步原语,甚至没有使用原子操作。
循环缓冲区永远不会溢出,因为消息是预分配的(在启动时预先分配)。实际上,为了减少内存碎片和增加缓存效率,所有重要/经常使用的数据结构都是预分配的,因此我们知道服务器启动时我们将创建的最大消息数量,因此我们可以预先计算缓冲区的最大大小,然后相应地初始化循环缓冲区。
现在我的问题是:线程#1一次将序列化的消息(实际上是指向消息对象的指针)排队,而线程#2按块(32/64/128个块)从队列中取出消息,并通过第二个循环缓冲区返回已处理的消息。如果没有新消息,线程#2会保持繁忙等待,从而始终保持一个CPU核心繁忙。如何进一步改进设计?繁忙等待策略的替代方案是什么?我想以优雅和高效的方式完成这项工作。我考虑过使用信号量,但我担心这不是最好的解决方案,因为每次在线程#1中排队消息时我必须调用“sem_post”,这可能会显着降低吞吐量,第二个线程必须调用“sem_post”相同次数以防止信号量溢出。此外,我担心信号量实现可能在内部使用互斥。
第二个好选择可能是使用信号,如果我能发现一种算法,只有在第二个线程“清空队列并正在调用sigwait”或“已经在sigwait上等待”的情况下才会引发信号,简而言之,必须最少次数引发信号,尽管如果比所需次数多引发几次信号也不会有害。是的,我确实使用了Google搜索,但我在互联网上找到的解决方案都不令人满意。以下是一些考虑因素:
A.服务器在进行系统调用时必须尽量浪费最少的CPU周期,并且必须最少使用系统调用次数。
B. 必须有非常低的开销,并且算法必须高效。
C. 无需任何锁定。
我希望所有选项都被考虑在内。
这是我分享关于我的服务器信息的网站链接,以更好地了解功能和用途:www.wanhive.com