代码之家  ›  专栏  ›  技术社区  ›  vesontio

异步非阻塞服务器套接字的效率[已关闭]

  •  0
  • vesontio  · 技术社区  · 10 年前

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

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

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

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

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

    谢谢

    2 回复  |  直到 10 年前
        1
  •  1
  •   Harry    10 年前

    百万美元的问题和百万种不同的权衡。对于那些得到巨蟒的人。。。

    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做了什么,这是一个具有完全不同性能特性的可插拔引擎,等等。

    一旦您的服务器在基准测试中超过了以上任何一个,您对这个问题的回答可能会被接受。

        2
  •  1
  •   o_weisman    10 年前

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

    推荐文章