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

时间:2016-03-22 08:00:45

标签: c multithreading sockets asynchronous epoll

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

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

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

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

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

感谢。

2 个答案:

答案 0 :(得分:1)

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

一旦您的服务器在基准测试中胜过上述任何一项,您就可以接受这个问题的答案。

答案 1 :(得分:1)

繁重的工作量是一个误导性的术语,最终,它并没有真正决定你应该如何设计你的系统。这里的主要问题是响应性及其要求。如果处理单个请求需要很长时间,并且您不想让其他客户端(您可能没有)饿死,那么单个线程设计显然不会这样做。您应该至少有一个线程(或每个客户端一个)以某种方式处理响应请求,即使只是通知客户端正在处理请求。

相关问题