- c - 在位数组中找到第一个零
- linux - Unix 显示有关匹配两种模式之一的文件的信息
- 正则表达式替换多个文件
- linux - 隐藏来自 xtrace 的命令
HAProxy
在进行负载均衡时如何避免请求时间开销?
我测试了 HAProxy
并为了好玩将它与用 Twisted
(Python
) 编写的简单端口转发器进行了比较。在我的初步测试中,通过 HAProxy
负载均衡器发出 HTTP 请求
与发出 相比,请求时间不会增加
直接到后端服务器。而我自己的 python 脚本在响应时间中增加了 开销[1]
>HTTP 请求~3x 开销
。
现在我的脚本是用 Python
和 HAProxy
用 C
编写的,所以先验地,HAProxy
有一个避免 Python
代码经历的调用开销(从 Python
代码到 syscalls
)的优点。但这是否可以解释性能上的巨大差异,或者 HAProxy
是否利用一些操作系统技巧来进一步提高性能?我尝试分析我的 Python
代码,但它没有显示 Python
代码中的任何热点,所以我猜测它大部分时间都在 系统调用中
未在分析中考虑。
[1]:如 ab 所报告,有 100 个并发连接和 10,000 个总请求。 HAProxy
的平均时间是 37 毫秒,而我的 Python
脚本是 128 毫秒。
设置是一个 TCP
负载均衡器,带有两个后端 nodejs
服务器,只提供静态文本。本来想测试TCP负载均衡,测试协议(protocol)就变成了HTTP
。三台机器都是来自Digital Ocean
的虚拟主机,单线程,512MB Ram,1核。 The Python script can be seen here和我的 haproxy.cfg can be found here
最佳答案
原来 HAProxy
网站已经涵盖了这个领域(我的错误是忽略了它)。答案基本上是很多低级优化。直接从 HAProxy 网站复制:
HAProxy 涉及操作系统架构中常见的几种技术,以实现绝对最大性能:
单进程、事件驱动的模型大大降低了上下文切换的成本和内存使用量。在一毫秒内处理数百个任务是可能的,每个 session 的内存使用量大约为几千字节,而 Apache
类模型中消耗的内存更多为每个进程兆字节。
O(1)
系统上的事件检查器(Linux
和 FreeBSD
)允许瞬时检测任何事件成千上万之间的任何联系。
尽可能在读写之间不进行任何数据复制的单缓冲。这节省了大量的 CPU
周期和有用的内存带宽。通常,瓶颈是 CPU
和网络接口(interface)之间的 I/O
总线。在 10 Gbps
时,内存带宽也会成为瓶颈。
在 Linux
下使用 splice()
系统调用可以实现零拷贝转发,并从 Linux< 开始实现真正的零拷贝
3.5。这允许小型低于 3 瓦的设备(例如 Seagate Dockstar
)以 gigabit/s
的速度转发 HTTP
流量。
MRU
内存分配器使用固定大小的内存池进行即时内存分配,有利于热缓存区域而不是冷缓存区域。这大大减少了创建新 session 所需的时间。
工作因子,例如一次多个accept()
,以及在多线程中运行时限制每次迭代的accept()
数量的能力进程模式,使负载均匀分布在进程之间。
基于树的存储,大量使用我开发多年的 Elastic Binary
树。这用于保持计时器有序、保持运行队列有序、管理循环和最少连接队列,成本仅为 O(log(N))
。
优化的 HTTP
header 分析: header 在运行中被解析和解释,并且解析被优化以避免重新读取任何先前读取的内存区域。当到达缓冲区末尾且 header 不完整时使用检查点,以便在读取更多数据时解析不会从头开始。在 Pentium-M 1.7 GHz
上解析平均 HTTP
请求通常需要 2 微秒。
仔细减少昂贵的系统调用的数量。大多数工作默认在用户空间完成,例如时间读取、缓冲区聚合、文件描述符启用/禁用。
关于python - HAProxy 是如何达到它的速度的?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22648722/
我已经下载了 RStudio,在打开我的代码所在的文件时,我似乎已经达到了容量限制: The file is 2.3MB the maximum file size is 2MB The file i
我有一个按钮,每次单击时,都会将 1 添加到变量中。当此变量超过 5 时,将触发警报。然而,此后触发器仍不断激活。我尝试使用 == 而不是 > 进行检查,但它做同样的事情。有什么想法吗? http:/
我正在将Slick 3.0与HikariCP 2.3.8一起使用(也可以玩2.4) 我做了很多数据库IO,并且不断达到队列限制。 有没有一种方法可以获取当前的队列大小,以及如何增加队列大小? 还是建议
在 Salesforce 中,您可以设置各种工作流程或构建用于发送电子邮件的 API 应用程序。对于大多数标准 Salesforce 组织,每天有 1000 封电子邮件的限制。 (例如,参见 here
我有一个类是这样的: public sealed class Contract { public bool isExpired { get; set; } public DateTim
我有一个带有特殊符号按钮的输入作为附加组件。 HTML
我正在尝试压缩 pdf 文件(有时是图像)。我需要一个 java 压缩器来帮助我压缩文件。我需要尺寸小于原始文档尺寸的一半。我尝试了java api中给出的deflator。但它并不是很成功。请帮我解
我正在使用这条线来创建淡入效果。 $('#div').css({opacity: 0, visibility:"visible"}).animate({opacity: 1}, 500); 可见类达到
我使用 URLCache 来缓存请求响应,最大容量如下: let diskCapacity = 100 * 1024 * 1024 let memoryCapacity = 100
我有一个计数器函数,我从这个 Answer 得到它: function countDown(i) { var int = setInterval(function () {
下面是一段代码,用于检查给定数字是否为 Lychrel 数字。这基本上意味着该程序取一个数及其倒数之和,然后取那个数及其倒数之和,等等,直到找到回文。如果它在一定的迭代次数内没有找到这样的数字(我在这
我即将对这个可怕的旧 Java Web 应用程序做一些工作,这是我的一个 friend 不久前继承的。 在我设置 tomcat、导入项目和所有这些到我的 eclipse 工作区后,我收到此错误,指出
我有一个 NSDictionary 对象,其中包含深层结构,例如包含包含字典的进一步数组的数组... 我想在层次结构中向下获取一个对象。是否有任何直接索引方法可以使用键名或其他方式获取它们? 多次调用
正如标题所说,我的 .border div 的边框跨度比它里面的要宽。它只会在达到 710px 时发生,因此您需要在 this fiddle 中展开结果窗口。 . 我希望边框保持在其内容周围而不超过它
我在 MySQL 中有一个表,通过 Microsoft Access 2013 中的链接表(通过 ODBC) Access 。 此表包含超过 124,000 条记录,我需要一个表单中的 ComboBo
一旦上一个输入达到其最大长度值,我如何才能聚焦下一个输入? a: b: c: 如果用户粘贴的文本大于最大长度,理想情况下它应该溢出到下一个输入。 jsFiddle: http://jsfiddl
我的任务是在客户的 QA 服务器上提供服务器性能报告。理想情况下,客户希望对约 900 个并发用户进行负载测试,因为这是他们在高峰时段通常使用的数量。然而,我一直在做的负载测试正在使他们的 QA 服务
我在 django 应用程序中对我的 celery worker 运行任务,其中每个任务执行大约需要 1-2 秒。通常这些执行都很好,但有时,特别是如果 Django 应用程序已经部署了一段时间,我开
我有一个 one_for_one 主管来处理类似且完全独立的 child 。 当一个 child 出现问题时,反复崩溃并触发: =SUPERVISOR REPORT==== 30-Mar-2011::
根据该网站,他们在免费计划中限制了 100 个并发连接,但是当第 101 个连接尝试连接时,它被拒绝,那么什么时候允许新连接? 例如:用户是否必须等待一定时间或一旦一个连接关闭,另一个连接就有机会连接
我是一名优秀的程序员,十分优秀!