许多阻塞VS单非阻塞工作者


9

假设有一个HTTP服务器接受连接,然后以某种方式等待标头被完全发送出去。我想知道实现它的最常用方法是什么,其余是什么利弊。我只能想到这些:

许多阻塞工人是好的,因为:

  • 它反应更快。
  • 引入新连接更容易(工作人员自己捡起它们,而不是局外人等到可以将其添加到同步列表中)。
  • 随着连接数量的增加和减少,CPU使用率会自动平衡(无需付出任何额外的努力)。
  • 更少的CPU使用率(阻塞的线程从执行循环中删除,不需要任何逻辑即可在客户端之间跳转)。

单一的非阻塞工人是好的,因为:

  • 使用更少的内存。
  • 较不易受懒客户端(连接到服务器并缓慢发送标头或根本不发送标头)的攻击。

如您所见,我认为多个工作线程总体上似乎是更好的解决方案。唯一的问题是,更容易攻击这种服务器。

编辑(更多研究): 我在网络上发现了一些资源(成千上万的线程和阻塞I / O-编写Java服务器的旧方法又是Paul Tyma的(又是更好的方法),这表明阻塞方法通常更好,但我仍然不太了解如何处理虚假连接。

PS不建议为该任务使用某些库或应用程序。我更想知道它是如何工作或可能起作用的,而不是使它起作用。

PSS我将逻辑分为多个部分,这一部分仅处理接受HTTP标头。不处理它们。


瞧,很多年前,我写了一个带有阻塞I / O的线程服务器,因为它很容易编写。一位同事写了另一种,效果很好。它们是我曾经工作过的一家公司提供的两种主要产品形式。对于阻塞情况下的“惰性客户端”,您可能会在数据接收上超时。

Answers:


4

没有银弹

实际上,这取决于...

tl; dr-简单的解决方案,使用nginx ...

封锁:

例如,Apache默认使用阻塞方案,该过程为每个连接派生该进程。这意味着每个连接都需要自己的内存空间,并且随着连接数量的增加,上下文切换的开销也随之增加。但是好处是,一旦关闭连接,就可以处理上下文,并且可以轻松检索任何/所有内存。

多线程方法的相似之处在于上下文切换的开销随连接数的增加而增加,但在共享上下文中可能会提高内存效率。这种方法的问题在于,很难以安全的方式管理共享内存。解决内存同步问题的方法通常包括它们自己的开销,例如,锁定可能会冻结CPU密集型负载上的主线程,并且使用不可变类型会增加很多不必要的数据复制。

AFAIK在阻塞的HTTP服务器上使用多进程方法通常是首选,因为以安全的方式管理/恢复内存更安全/更简单。当恢复内存就像停止一个进程一样简单时,垃圾回收就不会成为问题。对于长时间运行的进程(即守护程序),该特性尤其重要。

尽管上下文切换的开销对于少量的工作人员而言似乎微不足道,但是随着负载扩展到数十万个并发连接,缺点变得更加重要。充其量,上下文切换将O(n)缩放为当前的工作人员数量,但实际上,情况最可能恶化。

在使用阻塞的服务器可能不是IO重负载的理想选择的情况下,它们是CPU密集型工作的理想选择,并且消息传递保持在最低限度。

非阻塞:

非阻塞将类似于Node.js或nginx。这些以在IO密集负载下将每个节点的连接数扩展到更多而特别众所周知。基本上,一旦人们达到了基于线程/进程的服务器可以处理的上限,他们便开始探索其他选择。否则,这称为C10K问题(即处理10,000个并发连接的能力)。

非阻塞异步服务器通常具有带锁多线程的方法,它们具有很多特性,因为您不希望使主线程超载,因此必须小心避免占用大量CPU资源。优点是,基本上消除了上下文切换所引起的开销,并且仅通过一个上下文消息传递就不会产生问题。

尽管HTTPs无状态性质可能不适用于许多网络协议,但它对于非阻塞体系结构尤其有效。通过结合使用反向代理服务器和多个非阻塞HTTP服务器,可以识别并在承受高负载的节点周围进行路由。

即使在只有一个节点的服务器上,通常也要在每个处理器内核中包含一台服务器以最大化吞吐量。

都:

“理想的”用例将是两者的结合。前端的反向代理致力于在顶部路由请求,然后是阻塞服务器和非阻塞服务器的混合。不阻塞IO任务,例如提供静态内容,缓存内容,html内容。阻止执行CPU繁重的任务,例如对图像/视频进行编码,流式传输内容,数字运算,数据库写入等。

在您的情况下:

如果您只是检查标头,但实际上并未处理请求,那么您实质上要描述的是反向代理。在这种情况下,我肯定会采用异步方法。

我建议您查看有关nginx内置反向代理的文档。

在旁边:

我从您提供的链接中阅读了本文,因此对于特定的实现,异步是一个糟糕的选择。这个问题可以用一个陈述来总结。

发现在客户端之间切换时,用于保存和恢复值/状态的代码很困难

他们正在建立一个有状态的平台。在这种情况下,异步方法将意味着您每次上下文切换时(即,事件触发时)都必须不断保存/加载状态。此外,在SMTP方面,他们正在做大量CPU密集型工作。

听起来他们对异步的掌握很差,结果做出了很多错误的假设。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.