【问题标题】:Load Balancing in Amazon EC2?Amazon EC2 中的负载平衡?
【发布时间】:2026-02-16 10:30:01
【问题描述】:

我们已经在 Amazon EC2 中与 HAProxy 战斗了几天;到目前为止,体验非常好,但我们一直坚持从软件负载平衡器中挤出更多性能。我们并不完全是 Linux 网络专家(通常我们是一家 .NET 商店),但到目前为止,我们一直坚持自己的想法,尝试设置适当的 ulimit,检查内核消息和 tcpdump 是否存在任何违规行为。 到目前为止,我们已经达到了大约 1,700 个请求/秒的稳定期,此时客户端超时比比皆是(为此我们一直在使用和调整 httperf)。我和一位同事正在收听最新的 Stack Overflow 播客,其中 Reddit 的创始人注意到他们的整个网站都运行在一个 HAProxy 节点上,并且到目前为止还没有成为瓶颈。确认!要么以某种方式看不到那么多并发请求,要么我们做错了什么,要么 EC2 的共享特性限制了 Ec2 实例的网络堆栈(我们使用的是大型实例类型)。考虑到 Joel 和 Reddit 的创始人都同意网络可能是限制因素这一事实,这可能是我们看到的限制吗?

非常感谢任何想法!

编辑 看起来实际问题实际上与负载平衡器节点无关!在这种情况下,罪魁祸首实际上是运行 httperf 的节点。当 httperf 为每个请求构建和拆除一个套接字时,它会在内核中花费大量的 CPU 时间。当我们提高请求率时,TCP FIN TTL(默认为 60 秒)使套接字保持的时间过长,而 ip_local_port_range 的默认值对于这种使用场景来说太低了。基本上,在客户端(httperf)节点不断创建和销毁新套接字的几分钟后,未使用的端口数用完,随后的“请求”在此阶段出错,产生低请求/秒数和大量的错误。

我们也研究了 nginx,但我们一直在使用 RighScale,他们有用于 HAProxy 的插入式脚本。哦,我们的最后期限 [当然] 太紧了,除非证明绝对必要,否则无法更换组件。幸运的是,在 AWS 上,我们可以并行使用 nginx 测试另一个设置(如果有必要),并在稍后通宵进行切换。

This page 很好地描述了每个 sysctl 变量(在这种情况下调整了 ip_local_port_range 和 tcp_fin_timeout)。

【问题讨论】:

  • Marc,你应该写下你配置这些东西的经验,然后把它们贴在某个地方(你的公司有博客吗?)。听起来它可能对很多人有用。赞成您的问题。
  • 您的链接已损坏。
  • @Ztyx 谢谢!刚刚更新了。我四处寻找更新、更新的资源,看起来原来的网站仍然有相当高的 PageRank,而且内容仍然不错,所以我只是更正它以反映新的 URL。跨度>

标签: amazon-ec2 load-balancing scaling haproxy


【解决方案1】:

并不是您的问题的真正答案,但 nginx 和 pound 作为负载平衡器都享有盛誉。 Wordpress 只需 switched to nginx 效果很好。

但更具体地说,是为了调试您的问题。如果您没有看到 100% 的 cpu 使用率(包括 I/O 等待),那么您是网络绑定的,是的。 EC2 内部使用千兆网络,尝试使用 XL 实例,这样您就拥有自己的底层硬件,并且不必共享该千兆网络端口。

【讨论】:

    【解决方案2】:

    我会考虑切换到场外负载均衡器,而不是在云中,并在其上运行类似 IPVS 的东西。 [它离开亚马逊云的原因是因为内核的东西]如果亚马逊不限制来自亚马逊云的数据包的源 IP,你可以使用单向负载平衡机制。我们做了这样的事情,它让我们同时收到了大约 800,000 个请求[尽管我们不处理延迟问题]。我也会说使用“ab2”(apache bench),因为它对用户更友好,而且在我看来更容易使用。

    【讨论】:

    • 你知道你用粗体写了你的整个消息吗?很难阅读。
    【解决方案3】:

    不直接回答问题,但 EC2 现在支持通过 Elastic Load Balancing 进行负载平衡,而不是在 EC2 实例中运行您自己的负载平衡器。

    编辑: Amazon 的 Route 53 DNS 服务现在提供了一种将*域指向具有“别名”记录的 ELB 的方法。由于 Amazon 知道 ELB 的当前 IP 地址,因此它可以为该当前 IP 返回一条 A 记录,而不必使用 CNAME 记录,同时仍然可以不时更改 IP。

    【讨论】:

    • 感谢您的提醒,我目前正在评估这个。很酷的东西比比皆是(尽管命令行工具有些不足)!
    • 不幸的是,AWS 负载均衡 (ELB) 解决方案存在一个重大缺陷。它旨在使用 CNAMES,以防止用户将*域直接指向负载均衡器。换句话说,您可以将 www.mydomain.com 指向 ELB,但不能指向 mydomain.com。对许多人来说,这是一个炫耀。
    • 您不能将所有呼叫重定向到您的网站,以便 www.会被输入吗?
    • 是的,您可以将 mydomain.com 指向一个服务器,该服务器仅向 www.mydomain.com 发出重定向,然后负载平衡。不过,这与将 mydomain.com 直接指向负载均衡器并不完全相同。
    【解决方案4】:

    是的,您可以使用异地负载均衡器。在裸机 LVS 上是一个不错的选择,但您的延迟会很糟糕!有传言称亚马逊将解决 CNAME 问题。然而,他们不太可能添加 https、深度或自定义健康检查、反馈代理、url 匹配、cookie 插入(一些具有良好架构的人也会说得很对。)但这就是为什么 Scalr、RightScale 和其他人通常使用 HAProxy 的两个他们在循环 DNS 条目后面。在 Loadbalancer.org,我们即将推出我们自己的 EC2 负载均衡设备: http://blog.loadbalancer.org/ec2-load-balancer-appliance-rocks-and-its-free-for-now-anyway/ 我们正计划使用 SSH 脚本以与 rightscale 相同的方式与自动缩放集成,任何 cmet 在博客上都表示赞赏。 谢谢

    【讨论】:

      【解决方案5】:

      即使您的问题解决了。 KEMP Technologies 现在拥有一个成熟的 AWS 负载均衡器。可能会为您省去一些麻烦。

      【讨论】: