【问题标题】:TCP/UDP high-performance server under linuxlinux下TCP/UDP高性能服务器
【发布时间】:2013-08-16 17:55:15
【问题描述】:

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

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

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

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

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

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

【问题讨论】:

  • 越高越好

标签: linux multithreading


【解决方案1】:

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

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

基本上,one-thread-per-request 模型因其实现简单而受到青睐。但它不能很好地随着并发请求的数量而扩展。在设计需要支持超过 1000 个并发请求的系统时,人们更喜欢使用套接字而不是线程。

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

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

由于这是实施 Web 服务器设计时非常常见的问题,您可以通过简单地搜索 Apache vs. Nginx 找到多个分析,例如 this one

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2011-08-26
    • 2013-02-07
    • 2011-01-19
    • 2012-01-04
    • 1970-01-01
    • 1970-01-01
    • 2020-04-08
    • 2015-11-24
    相关资源
    最近更新 更多