Python HAProxy是如何实现其速度的?
在进行负载平衡时,Python HAProxy是如何实现其速度的?,python,twisted,haproxy,Python,Twisted,Haproxy,在进行负载平衡时,HAProxy如何避免请求时间开销 我测试了HAProxy,为了好玩,将它与用Twisted(Python)编写的简单端口转发器进行了比较。在我的初步测试中,与直接向后端服务器发出HTTP请求相比,通过HAProxy负载平衡器发出HTTP请求不会在请求时间内增加开销[1]。而我自己的python脚本在响应时间上增加了3倍的开销 现在我的脚本是用Python编写的,而HAProxy是用C编写的,因此从本质上讲,HAProxy具有避免调用开销的优势(从Python代码到syscal
HAProxy
如何避免请求时间开销
我测试了HAProxy
,为了好玩,将它与用Twisted
(Python
)编写的简单端口转发器进行了比较。在我的初步测试中,与直接向后端服务器发出HTTP请求相比,通过HAProxy
负载平衡器发出HTTP请求
不会在请求时间内增加开销[1]
。而我自己的python脚本在响应时间上增加了3倍的开销
现在我的脚本是用Python
编写的,而HAProxy
是用C
编写的,因此从本质上讲,HAProxy
具有避免调用开销的优势(从Python
代码到syscalls
)。但是,这能解释性能上的巨大差异吗?还是说,HAProxy
利用了一些操作系统技巧来进一步提高性能?我尝试分析我的Python
代码,但它没有揭示Python
代码中的任何热点,因此我猜测它大部分时间都花在分析中未考虑的syscalls
上
[1] :根据ab的报告,有100个并发连接和10000个总请求。HAProxy
的平均时间是37毫秒,而我的Python
脚本的平均时间是128毫秒
安装程序
该设置是一个带有两个后端nodejs
服务器的TCP
负载平衡器,只提供静态文本。出于目的,我想测试TCP负载平衡,然后测试协议变成了HTTP
。这三台机器都是来自Digital Ocean
的虚拟主机,单线程,512MB Ram,1核。
而我的发现网站已经覆盖了这一领域(我的错误是忽略了它)。答案基本上是大量的低级优化。直接从HAProxy网站复制:
HAProxy涉及操作系统体系结构中常见的几种技术,以实现绝对的最大性能:
- 单个进程、事件驱动模型大大降低了上下文切换的成本和内存使用。可以在毫秒内处理数百个任务,每个会话的内存使用量约为几千字节,而类似Apache的型号中的内存消耗量更大,每个进程的内存使用量约为兆字节
O(1)
系统上的事件检查器允许(Linux
和FreeBSD
)即时检测成千上万个连接上的任何事件
- 尽可能在读写之间进行单缓冲,无任何数据拷贝。这节省了大量的
CPU
周期和有用的内存带宽。通常,瓶颈将是CPU
和网络接口之间的I/O
总线。在10 Gbps时,内存带宽也可能成为瓶颈
- 可以使用
Linux
下的splice()
系统调用进行零拷贝转发,并从Linux
3.5开始产生真正的零拷贝。这允许小型3瓦以下的设备,如Seagate Dockstar
以一个gigabit/s
转发HTTP
流量
MRU
内存分配器使用固定大小的内存池进行即时内存分配,热缓存区域优于冷缓存区域。这大大减少了创建新会话所需的时间accept()
,以及在多进程模式下运行时限制每次迭代的accept()
数量的能力,以便负载在进程之间均匀分布弹性二进制
树。这用于保持计时器有序,保持运行队列有序,管理循环队列和最少连接队列,只需O(log(N))
成本HTTP
头分析:头被动态解析和解释,解析被优化以避免任何先前读取的内存区域被重新读取。当到达缓冲区末尾时使用不完整的头时,将使用检查点,以便在读取更多数据时不再从头开始解析。在Pentium-M 1.7GHz
上解析一个平均HTTP
请求通常需要2微秒我决不是twisted或HAProxy方面的专家,但我首先想到的是,开箱即用python中没有充分利用所有核心。如果我是你,我的下一个
ab
将和jython在一起。说得好。我的设置是由Digital Ocean托管的,所有的盒子都是单核的,所以不可能是这样。我已经更新了问题的更多细节。我怀疑Twisted是否实现了所有这些微优化。加上“Python运行缓慢”可能是最大的开销。也许您反复运行基准测试并获得了稳定的结果——HAProxy引入的延迟比Twisted少(我作为一名核心Twisted开发人员这么说:),对此我并不感到特别惊讶,但您应该考虑到,ab
不是一个可靠的工具(它经常报告完全不正确的结果)而共享硬件上的虚拟主机是一个糟糕、糟糕、糟糕的基准测试环境。@freakish:谢谢,这就是我要找的信息-我想知道我怎么会错过它。谢谢,我也很想,但仍然要再等三个小时才能被允许。:-)