繁体   English   中英

linux下的TCP / UDP高性能服务器

[英]TCP/UDP high-performance server under linux

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

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

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

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

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

    我对这个问题感到困惑,非常感谢!

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

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

基本上, 每个请求的单线程模型因其简单的实现而是优选的。 但它并不能很好地适应并发请求的数量。 在设计支持超过几千个并发请求所需的系统时,人们更喜欢在线程上使用套接字。

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

  • 加载 (并发请求数)
  • 系统 (CPU,RAM)

由于这是实现Web服务器设计时非常流行的问题,因此您可以通过简单地搜索Apache与Nginx来找到类似这样的分析。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM