在c10k问题中,每个客户端通常使用一个线程的最佳原因是什么?
我们可以把5,10,或25每个线程?性能会有任何负面变化吗?
每个客户端有一个线程似乎对系统来说非常费力,如果每个线程有25个线程,那么10000个线程可以有400个,而不是10000个线程。
有两种完全不同的模型用于处理10K+连接:
- 多线程,每个连接一个线程
- 单线程,具有非阻塞操作和异步I/O(每台机器可能有几个独立的进程,以充分利用可用的核心)
这两种型号都可以用于处理超过10万个连接,而且这两种机型在某些领域都有各自的优势。在直接比较中,它们的区别如下:
多线程:
- 堆栈造成的高内存占用
- 需要同步操作以避免数据竞争
单线程:
- 一切都必须是非阻塞的(操作系统的糟糕支持,例如Linux上的文件系统操作)
- 所有的东西都必须是异步的(编程语言的糟糕支持,例如控制结构和错误处理)
将这两种型号结合起来是可能的。在这种情况下,通常使用每个核心一个线程(而不是N个连接一个线程)。这个模型有一些很好的用例。然而,还有一个巨大的问题:它结合了两种模式的缺点。这意味着,您必须努力实现线程安全、非阻塞和异步。通常情况下,工作量是纯模型的两倍。
这就是为什么在大多数应用程序中,纯模型通常优于混合模式的原因。例外情况是边缘组件,它们每秒必须处理数百万个请求,例如负载平衡器和代理。