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

标签 c multithreading sockets asynchronous epoll

<分区>

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

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

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

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

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

谢谢。

最佳答案

百万美元的问题与一百万种不同的权衡。对于那些获得 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 是一个具有完全不同性能特征的可插拔引擎等。

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

关于c - 异步非阻塞服务器套接字的效率,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36148976/

相关文章:

c - 前缀和的并行化 (Openmp)

c - gcc 的缓冲区溢出示例

c++ - QObject::setParent: 无法设置父对象,新的父对象在不同的​​线程中

java - 单例使用 "Initialization-on-demand holder idiom"

java - 在 android-j2se 上使用 SSL 与服务器客户端套接字通信

c - 如何使用 gcc 编译带有源代码文件的库存档?

c - 关于 c 中递归的快速问题

c# - 如何在主应用程序线程中自动捕获 Task 对象的操作引发的异常?

C++ 客户端需要找出套接字被扭曲的服务器关闭

java - 从不同路由器上的客户端连接到服务器