最大化 HAProxy 负载均衡器上的 TCP 连接

ima*_*ive 4 linux scaling load-balancing haproxy

我目前正在使用 HAProxy 来平衡从客户端到我的 Erlang 应用服务器的 tcp 连接。连接是持久的,这意味着我在优化的服务器上仅限于大约 64K 个客户端(我目前在 m1.large EC2 实例上运行 HAProxy)。我的应用程序服务器旨在根据 TCP 连接数进行水平扩展。但让我担心的是,我需要与应用程序服务器数量相同的 HAProxy 服务器,因为它是 1:1 连接。目前有没有办法“代理”到应用服务器的 tcp 连接,这样一旦 HAProxy 将客户端发送到我的 Erlang 服务器,它就可以释放连接,准备为另一个客户端提供服务?有没有我可以阅读的论文和现有解决方案,以便我只需担心应用服务器上的 64K 限制,

ase*_*seq 8

是什么让您认为您仅限于 64K 客户端?您应该能够提供更多服务。限制因素不是端口数,而是限制您在任何给定时间可以打开的连接数量的内存和 CPU 能力。检查:http : //www.kegel.com/c10k.html 已过时,只需将其视为 c100k 或 c1M 问题即可。:-)

顺便说一下,haproxy 站点有一篇关于负载平衡和 haproxy 架构主题的优秀文章:http ://haproxy.1wt.eu/download/1.2/doc/architecture.txt

关于连接限制,这是一个理论上的限制,通常您不会达到,因为在此之前您会耗尽资源。

引用http://www.quora.com/TCP/What-is-the-maximum-number-of-simultaneous-TCP-connections-achieved-to-one-IP-address-and-port

“TCP 标准将唯一的连接标识符设置为本地 IP 地址、本地 TCP 端口号、远程 IP 地址和远程 TCP 端口号的元组。在您的示例中,本地编号都是固定的,大约有 2^32 个远程IP(第 4 版)地址和 2^16 个 TCP 端口号,或大约 281,474,976,710,656 个潜在的同时 TCP 连接总数(2^48,或 2.81 * 10^14,或 281 万亿)。”


use*_*461 6

介绍

64k 并发IDLE连接对于 HAProxy 和 Erlang 来说是小菜一碟。

首先要做的是启用 HAProxy 上的统计页面。它是监控和性能调优的必备工具。

然后让我们进入极限。

操作系统连接限制

每个元组只能有 1 个连接client_IP:client_PORT:server_IP:server_PORT。它来自于在内核中存储和检索连接的方式(即哈希表)。在 Linux 和 Windows 上相同。

关于这一点,我将不得不不同意 aseq。这根本不是理论上的限制。这是任何进行中等负载测试的人都可能达到的非常实用的限制。

假设您当前的设置中有 3 台计算机:

        [Test Computer]     [HAProxy Computer]     [Erlang Computer]
                                                 
(front)   test_IP:????<------>haproxy_IP:80                      
(back)                        haproxy_IP:????<------>erlang_IP:80
Run Code Online (Sandbox Code Playgroud)

所有IP都是固定的,网络服务器端口是固定的。这仅留下一个端口作为可变参数,因此最大连接数受任何一台计算机上可用端口数的限制。这里的空间很小(请参阅临时端口范围)。您必须获得更多实例,包括 Erlang 实例和负载测试实例。

注意:请注意,用户自然来自大量 IP,而负载测试器(curl、Apache ab、JMeter)通常在具有单个 IP 的单个机器上运行(JMeter 和类似工具可以使用分布式从站进行扩展)。

注意:HAProxy 连接总是成对的(一个到客户端 + 一个到内部服务器)。请记住这一点,因为大多数系统限制必须是 2*N 才能允许 N 个用户。

临时端口范围

只有少数端口用于创建新连接。他们被称为ephemeral ports。Linux 默认为 32768 到 61000。

扩大范围。首先检查是否有任何正在运行的服务在您的服务器上使用它们。

sysctl net.ipv4.ip_local_port_range
net.ipv4.ip_local_port_range = 20000    65000
Run Code Online (Sandbox Code Playgroud)

这种调整只能提供 60% 以上的端口。使用单个服务器进行网络规模是不够的。

短命的港口

请注意,端口在关闭后的一分钟内不能重新使用(请参阅 TCP 状态),这会使端口池变得非常小(例如,任何人都有 10k 端口/秒?)。有内核设置可以更改关闭持续时间并允许重用关闭端口。

只要它们的寿命足够长(至少在更新前几分钟),您就不需要对持久连接进行这些调整。尽管如此,重要的是要意识到潜在的问题。

HAProxy 最大康

maxconn在 HAProxy 中配置设置。它是任何时候允许的最大打开连接数。

它可以在global、 perfrontend或 per 中配置backend。统计页面显示每个和所有内容的活动设置。

Linux ulimit

ulimit 是单个进程打开的最大文件数(套接字是 linux 上的文件)。Linux 默认值介于 1k 和 10k 之间。

HAProxy 会根据maxconn参数自动配置其进程 ulimit 。

您可能需要为 Erlang 进程手动调整 ulimit。