2013-08-16 20 views
1

我想了解一些使用多线程的高性能服务器程序的问题。Linux下的TCP/UDP高性能服务器

  1. epoll的可以处理TCP套接字监听和插座连接,我可以在主线程中使用epoll_wait,如果有任何套接字连接正在添加,程序可以接受的工作线程的连接和recv数据。工作线程之间没有冲突。我对吗?

    udp是一个无连接的协议,我们可以同时在所有工作线程中使用recvfrom函数吗?主线程只是使用epoll通知工作线程接收数据。 (假设我可以单独处理每个UDP数据包)。

  2. 这是一个UDP服务器。 我将它设置为无阻塞套接字。我在主线程中接收数据并处理它,然后将它发送到任务队列,如果任务队列有数据,则程序唤醒工作线程并锁定任务队列,然后从任务队列获取数据,解锁任务使其他工作线程可以从任务队列中获取任务,然后进行处理。

    这是一个很好的多线程UDP服务器吗?我不确定。 有UDP服务器的另一设计与高性能。

    我在这个问题困扰,非常感谢你!

+0

越高越好 –

回答

3

你的基本做法是正确的。首先研究臭名昭着的C10K问题以及如何克服它。一旦你了解了各种实现中的主要瓶颈,你需要考虑以下内容作为你设计过程的一部分:

  • 最小化线程创建/删除周期。
  • 始终在阻塞模型上选择“基于事件”模型。

基本上一个线程每个请求模型优选用于其实施的简单性。但它并不能很好地满足并发请求的数量。在设计支持超过1000个并发请求所需的系统时,人们更喜欢使用线程上的套接字。

“工人线程” 实例化的最佳数量取决于:

  • 负载(数目的并发请求的)
  • 系统(CPU,RAM)

由于这是实施网络服务器设计时非常流行的问题,因此您可以找到几个分析,如this one,通过简单搜索Apache vs. Nginx