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:谢谢,这就是我要找的信息-我想知道我怎么会错过它。谢谢,我也很想,但仍然要再等三个小时才能被允许。:-)