0

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

我们可以在每个线程中放置 5、10 或 25 个吗?性能会有什么负面变化吗?

每个客户端有一个线程似乎对系统来说非常繁重,如果我们每个线程有 25 个线程,我们可以为 10,000 个线程提供 400 个线程,而不是为 10,000 个线程提供 10,000 个线程。

4

1 回答 1

1

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

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

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

多线程:

  • 堆栈导致的高内存占用
  • 需要同步操作以避免数据竞争

单线程:

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

可以将这两种模型结合起来。在这种情况下,通常使用每个内核一个线程(而不是一个线程用于 N 个连接)。这个模型有一些很好的用例。但是,也存在一个巨大的问题:它结合了两种模型的缺点。这意味着,您必须在所有线程安全非阻塞异步方面付出努力。通常,工作量是纯模型之一的两倍。

这就是为什么对于大多数应用程序而言,模型通常优于混合模型的原因。例外是边缘组件,它们必须每秒处理数百万个请求,例如负载平衡器和代理。

于 2014-04-23T18:02:02.670 回答