在c10k中每个线程有多个客户端

时间:2014-04-23 09:40:05

标签: multithreading sockets tcp pthreads c10k

在c10k问题中,每个客户端通常使用一个线程是否有任何理由?

我们可以为每个线程添加5,10或25个?性能会有任何负面变化吗?

每个客户端有一个线程似乎对系统非常负担,如果我们每个线程有25个线程,我们可以拥有400个线程,10,000个而不是10,000个10,000个。

1 个答案:

答案 0 :(得分:1)

处理10K +连接有两种完全不同的模型:

  • 多线程,每个连接一个线程
  • 单线程,具有非阻塞操作和asynchronous I/O(每台计算机可能有多个独立进程以充分利用可用内核)

两种型号都可以用于超过100K的连接,两种型号在某些领域都有其优势。在直接比较中,它们的区别如下:

<强>多线程:

  • 由堆栈引起的高内存占用
  • 需要同步操作以避免数据争用

<强>单线程:

  • 一切都必须是非阻塞的(操作系统的不良支持,例如Linux上的文件系统操作)
  • 一切都必须是异步的(编程语言的不良支持,例如控制结构和错误处理)

可以将这两种模型结合起来。在这种情况下,通常使用每个核心一个线程(而不是N个连接的一个线程)。这个模型有一些很好的用例。然而,还存在一个巨大的问题:它结合了两种模型的缺点。这意味着,您必须花费精力来完成所有线程安全非阻塞异步。通常,这种努力是其中一种纯模型的两倍。

这就是为什么模型通常比大多数应用程序的混合模型更受欢迎的原因。例外是边缘组件,它必须每秒处理数百万个请求,例如负载均衡器和代理。