【问题标题】:Efficiency of asynchronous non-blocking server socket [closed]异步非阻塞服务器套接字的效率[关闭]
【发布时间】:2016-07-09 00:29:45
【问题描述】:

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

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

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

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

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

谢谢。

【问题讨论】:

  • @SergeyA 我没有意识到这是一个如此广泛的话题。但我想我已经得到了我的答案,以及一篇值得阅读的好文章。谢谢。

标签: c multithreading sockets asynchronous epoll


【解决方案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 是一个性能特征完全不同的可插拔引擎等。

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

【讨论】:

  • 感谢您的参考。
【解决方案2】:

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

【讨论】:

    猜你喜欢
    • 2016-01-13
    • 2010-12-30
    • 1970-01-01
    • 1970-01-01
    • 2019-08-02
    • 1970-01-01
    • 1970-01-01
    • 2011-09-16
    • 1970-01-01
    相关资源
    最近更新 更多