- android - RelativeLayout 背景可绘制重叠内容
- android - 如何链接 cpufeatures lib 以获取 native android 库?
- java - OnItemClickListener 不起作用,但 OnLongItemClickListener 在自定义 ListView 中起作用
- java - Android 文件转字符串
所以根据haproxy作者的说法,谁知道关于http的一两件事:
Keep-alive was invented to reduce CPU usage on servers when CPUs were 100 times slower. But what is not said is that persistent connections consume a lot of memory while not being usable by anybody except the client who openned them. Today in 2009, CPUs are very cheap and memory is still limited to a few gigabytes by the architecture or the price. If a site needs keep-alive, there is a real problem. Highly loaded sites often disable keep-alive to support the maximum number of simultaneous clients. The real downside of not having keep-alive is a slightly increased latency to fetch objects. Browsers double the number of concurrent connections on non-keepalive sites to compensate for this.
最佳答案
嘿,因为我是这个引文的作者,我会回复:-)
大型站点有两个大问题:并发连接和延迟。并发连接是由于慢速客户端下载内容需要很长时间以及空闲连接状态引起的。这些空闲连接状态是由连接重用以获取多个对象引起的,称为保持事件,延迟会进一步增加。当客户端非常靠近服务器时,它可以密集使用连接并确保它几乎从不空闲。然而,当序列结束时,没有人关心快速关闭 channel ,并且连接保持打开且长时间未使用。这就是为什么许多人建议使用非常低的保持事件超时的原因。在某些服务器(如 Apache)上,您可以设置的最低超时时间为 1 秒,并且通常无法承受高负载:如果您面前有 20000 个客户端并且它们平均每秒获取一个对象,您将永久建立那 20000 个连接。像 Apache 这样的通用服务器上的 20000 个并发连接是巨大的,需要 32 到 64 GB 的 RAM,具体取决于加载的模块,即使添加 RAM,您也可能不希望更高。实际上,对于 20000 个客户端,您甚至可能会在服务器上看到 40000 到 60000 个并发连接,因为如果浏览器有很多对象要获取,它们会尝试建立 2 到 3 个连接。
如果在每个对象之后关闭连接,并发连接数将急剧下降。事实上,它会下降一个与对象之间的时间下载对象的平均时间相对应的因子。如果您需要 50 毫秒来下载一个对象(一张微型照片、一个按钮等...),并且您平均每秒下载 1 个对象,那么每个客户端只有 0.05 个连接,也就是 1000 个20000 个客户端的并发连接。
现在是时候建立新的连接了。远程客户端会遇到令人不快的延迟。过去,浏览器在禁用 keep-alive 时会使用大量并发连接。我记得 MSIE 上的数字是 4,Netscape 上的数字是 8。这真的会将每个对象的平均延迟除以那么多。现在,keep-alive 无处不在,我们再也看不到这么高的数字了,因为这样做进一步增加了远程服务器的负载,而浏览器负责保护 Internet 的基础设施。
这意味着使用当今的浏览器,要使非保持事件的服务与保持事件的服务一样具有响应性变得更加困难。此外,一些浏览器(例如:Opera)使用启发式方法来尝试使用流水线。流水线是使用 keep-alive 的一种有效方式,因为它通过发送多个请求而不等待响应几乎消除了延迟。我在一个有 100 张小照片的页面上尝试过,第一次访问的速度大约是没有 keep-alive 的速度的两倍,但是下次访问的速度大约是 8 倍,因为响应非常小,只计算延迟(仅“304”响应)。
我会说,理想情况下,我们应该在浏览器中设置一些可调参数,使它们保持获取的对象之间的连接处于事件状态,并在页面完成时立即删除它。但不幸的是,我们并没有看到这一点。
为此,一些需要在前端安装通用服务器(例如Apache)并且必须支持大量客户端的站点通常必须禁用keep-alive。并且为了强制浏览器增加连接数,它们使用多个域名以便可以并行下载。这在大量使用 SSL 的站点上尤其成问题,因为连接设置甚至更高,因为还有一次额外的往返。
现在更常见的是,此类站点更喜欢安装 haproxy 或 nginx 等轻量级前端,它们在处理数万到数十万个并发连接时没有问题,它们在客户端启用 keep-alive,并在客户端禁用它。 Apache 方面。在这一方面,建立连接的成本在 CPU 上几乎为零,在时间上根本不明显。这样,这提供了两全其美的优点:由于保持事件状态,客户端的超时时间非常短,以及服务器端的连接数少,因此延迟低。每个人都很开心:-)
一些商业产品通过重用前端负载平衡器和服务器之间的连接并通过它们多路复用所有客户端连接来进一步改进这一点。当服务器靠近 LB 时,增益并不比以前的方案高多少,但通常需要对应用程序进行调整,以确保不存在由于多个用户之间意外共享连接而导致用户之间 session 交叉的风险.从理论上讲,这永远不应该发生。现实大不相同:-)
关于现代的http keep-alive,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4139379/
据我了解,HTTP POST 请求的正文大小没有限制。因此,客户端可能会在一个 HTTP 请求中发送 千兆字节 的数据。现在我想知道 HTTP 服务器应该如何处理此类请求。 Tomcat 和 Jett
在了解Web Deploy我遇到了一些讨论 http://+:80 和 http://*:80 的 netsh.exe 命令。这些是什么意思? 最佳答案 引自URLPrefix Strings (Wi
假设我有一个负载均衡器,然后是 2 个 Web 服务器,然后是一个负载均衡器,然后是 4 个应用程序服务器。 HTTP 响应是否遵循与 HTTP 请求服务相同的路径? 最佳答案 按路径,我假设您是网络
我有一个带有 uri /api/books/122 的资源,如果在客户端为此资源发送 HTTP Delete 时该资源不存在,那么相应的响应代码是什么这个 Action ?是不是404 Not Fou
是否有特定的(或约定的)HTTP 响应消息(或除断开连接之外的其他操作)来阐明服务器不接受 pipelined HTTP requests ? 我正在寻找能让客户端停止流水线化它的请求并分别发送每个请
在了解Web Deploy我遇到了一些讨论 http://+:80 和 http://*:80 的 netsh.exe 命令。这些是什么意思? 最佳答案 引自URLPrefix Strings (Wi
我有一个带有 uri /api/books/122 的资源,如果在客户端为此资源发送 HTTP Delete 时该资源不存在,那么相应的响应代码是什么这个 Action ?是不是404 Not Fou
关闭。这个问题需要更多focused .它目前不接受答案。 想改进这个问题吗? 更新问题,使其只关注一个问题 editing this post . 关闭 8 年前。 Improve this qu
我使用 Mule 作为 REST API AMQP。我必须发送自定义请求方法:“PRINT”,但我收到: Status Code: 400 Bad Request The request could
我需要针对具有不同 HTTP 响应代码的 URL 测试我的脚本。我如何获取响应代码 300、303 或 307 等的示例/示例现有 URL? 谢谢! 最佳答案 您可以使用 httpbin为此目的。 例
我正在尝试编写一个程序来匹配 HTTP 请求及其相应的响应。似乎在大多数情况下一切都运行良好(当传输完全有序时,即使不是,通过使用 TCP 序列号)。 我发现的唯一问题是当我有流水线请求时。在那之后,
RESTful Web Services鼓励使用 HTTP 303将客户端重定向到资源的规范表示。它仅在 HTTP GET 的上下文中讨论主题。 这是否也适用于其他 HTTP 方法?如果客户端尝试对非
当使用chunked HTTP传输编码时,为什么服务器需要同时写出chunk的字节大小并且后续的chunk数据以CRLF结尾? 这不会使发送二进制数据“CRLF-unclean”和方法有点多余吗? 如
这个问题在这里已经有了答案: Is it acceptable for a server to send a HTTP response before the entire request has
如果我向同一台服务器发出多个 HTTP Get 请求并收到每个请求的 HTTP 200 OK 响应,我如何使用 Wireshark 判断哪个请求映射到哪个响应? 目前看起来像是发出了一个 http 请
func main() { http.HandleFunc("/", handler) } func handler(w http.ResponseWriter, r http.Request
我找不到有值(value)的 NodeJS with Typescript 教程,所以我在无指导下潜入水中,果然我有一个问题。 我不明白这两行之间的区别: import * as http from
问一个关于Are HTTP headers case-sensitive?的问题,如果 HTTP 方法区分大小写,大多数服务器如何处理“get”或“post”与“GET”或“POST”? 例如,看起来
我正在使用ASP.NET,在其中我通过动词GET接收查询,该应用程序专用于该URL。 该代码有效,但是如果用户发送的密码使http 200无效,请回答我,并在消息的正文中显示“Fail user or
Closed. This question needs details or clarity。它当前不接受答案。 想改善这个问题吗?添加详细信息,并通过editing this post阐明问题。 9
我是一名优秀的程序员,十分优秀!