异步非阻塞服务器套接字的效率

Efficiency of asynchronous non-blocking server socket

我想编写一个服务器程序来接受传入的连接并处理收到的请求。我脑海中出现的第一个想法是使用 epoll()select() 的非阻塞套接字。

例如,当 epoll() returns 时,它会给我一个带有可用 IO 事件的套接字数组。然后我必须遍历套接字数组来发送和接收数据,一旦缓冲区完全接收或发送,就会执行回调函数。这也是网上讨论最多的技术

但是,如果我使用这种技术,我的程序将在处理一个客户端连接时让所有其他套接字处于等待状态。 如果客户端的请求很耗时,这不是一种低效的方式吗?

在我找到的文档中,他们说这样的 thread/process 设计可以轻松地同时处理数百个连接,而多线程设计总是因其复杂性、系统开销等而受到严厉批评。

因此,我的问题是:如果必须处理繁重的工作量,如何设计一个高效的服务器程序?

谢谢。

百万美元的问题与一百万种不同的权衡。对于那些获得 Monty Python...

的人

https://www.youtube.com/watch?v=pWS8Mg-JWSg

回到现实...Apache2可以处理大负载,nginx可以处理大负载,Node,Tomcat,Jetty,JBoss,Netty...其实任何一个都可以今天使用的众所周知的应用程序服务器和相当多的不太知名的应用程序服务器可以处理繁重的工作负载,它们都使用线程、事件和进程的各种组合来完成它。某些语言,例如 Erlang 或 Go 等,可以让您在几百行代码中轻松启动高性能应用程序服务器。

虽然现在已经过时了,但以下页面提供了一些很好的信息,说明为什么这不是一个简单的问题...

http://www.kegel.com/c10k.html

与其担心性能,不如现在让一些东西工作,对其进行基准测试,然后询问如何让它更快......如果你很聪明并确保你有一个模块化设计,换掉它的一部分将相对很简单,即看看 Apache 对 MPM 做了什么,MPM 是一个具有完全不同性能特征的可插拔引擎等。

一旦您的服务器在基准测试中表现优于上述任何一项,您对这个问题的回答可能会被接受。

繁重的工作负载是一个具有误导性的术语,归根结底,它并没有真正规定您应该如何设计系统。这里的主要问题是响应能力及其要求之一。如果处理单个请求需要很长时间,并且您不想饿死其他客户端(您可能不想),那么单线程设计显然行不通。您至少应该有一个线程(或每个客户端一个)以某种方式处理对请求的响应,即使只是通知客户端请求正在处理中。