AskOverflow.Dev

AskOverflow.Dev Logo AskOverflow.Dev Logo

AskOverflow.Dev Navigation

  • 主页
  • 系统&网络
  • Ubuntu
  • Unix
  • DBA
  • Computer
  • Coding
  • LangChain

Mobile menu

Close
  • 主页
  • 系统&网络
    • 最新
    • 热门
    • 标签
  • Ubuntu
    • 最新
    • 热门
    • 标签
  • Unix
    • 最新
    • 标签
  • DBA
    • 最新
    • 标签
  • Computer
    • 最新
    • 标签
  • Coding
    • 最新
    • 标签
主页 / server / 问题 / 105474
In Process
z8000
z8000
Asked: 2010-01-23 11:22:22 +0800 CST2010-01-23 11:22:22 +0800 CST 2010-01-23 11:22:22 +0800 CST

对于给定案例,您对软件负载均衡器或负载共享器有什么建议?

  • 772

我已经配置了一个 8 核的服务器,并计划部署网络服务。为了分散请求负载,我想运行 8 个服务实例。这里没有什么令人震惊的。我无权访问硬件负载平衡器。我应该提一下,我目前已经分配了 5 个公共 IP 地址(但我可以获得更多)。

因此,我想听听您对构建软件负载平衡解决方案的建议。

显而易见的选择是:

  • 使用 HAProxy;或者
  • pre-fork 我的应用程序(就像 Facebook Tornado 和 Unicorn 一样);
  • 在此处插入您的想法。

我的目标是:

  • 在服务实例之间分散请求负载;和
  • 允许滚动重启我的服务(代码升级)。

我应该提一下,这不是一个基于 HTTP 的服务,所以 NGiNX 之类的东西都出来了。

我不喜欢 HAProxy,因为它需要内存;每个客户端连接似乎都需要一个读写缓冲区。因此,我将在内核级别、HAProxy 和我的应用程序中拥有缓冲区。这越来越傻了!也许我在这方面遗漏了一些东西?

谢谢!

networking load-balancing process architecture haproxy
  • 2 2 个回答
  • 708 Views

2 个回答

  • Voted
  1. Willy Tarreau
    2010-01-23T12:46:55+08:002010-01-23T12:46:55+08:00

    无论采用何种解决方案,如果您安装一个进程来转发流数据,它将需要每个连接缓冲区。这是因为您不能总是发送收到的所有内容,因此您必须将多余的内容保存在缓冲区中。也就是说,内存使用量将取决于并发连接的数量。一个大型站点正在愉快地运行 haproxy,默认设置为 150000 个并发连接(4 GB RAM)。如果您需要更多,版本 1.4 允许您调整缓冲区大小而无需重新编译。但是,请记住,每个套接字的内核缓冲区永远不会低于每个方向和每个套接字的 4kB,因此每个连接至少 16kB。这意味着让 haproxy 在每个缓冲区小于 8 kB 的情况下运行是没有意义的,因为它已经比内核消耗更少。

    此外,如果您的服务是纯 TCP 并且代理没有附加值,请查看基于网络的解决方案,例如 LVS。它便宜很多,因为它处理数据包并且不需要维护缓冲区,因此套接字缓冲区会在数据包满时丢弃数据包,并且可以与服务安装在同一台机器上。

    编辑:哈维尔,依赖操作系统进行负载平衡的预分叉进程根本不能很好地扩展。操作系统在获得连接时唤醒每个进程,只有其中一个获得连接,所有其他进程再次进入睡眠状态。多进程模式下的 Haproxy 在 4 个进程附近表现出最佳性能。在 8 个进程中,性能已经开始下降。Apache 使用了一个很好的技巧来解决这个问题,它在 accept() 周围进行了锁定,因此只有一个进程在等待接受。但是这会杀死操作系统的负载平衡功能并停止在 1000 到 2000 个进程之间扩展。它应该使用一些锁的数组,以便唤醒一些进程,但它不这样做。

    • 3
  2. Javier
    2010-01-23T13:08:38+08:002010-01-23T13:08:38+08:00

    没有关于您的服务的任何细节,很难说;但总的来说,我倾向于预分叉。这是一个久经考验的真实服务器策略(而不是一些人在阅读龙卷风/独角兽粉丝网站后认为的新奇技巧)。

    除此之外,还有一些提示:

    • 每个预分叉进程都可以使用现代非select策略(主要是 libevent)来处理大量客户端。

    • 核心和进程之间的 1:1 关系很少能提供最佳性能;对负载进行一些动态适应性通常要好得多。

    • 1

相关问题

  • 10 Gb 网络:在光纤和双绞线之间做出决定

  • 如何在 Windows Server PPTP VPN 中自动为客户端分配路由?

  • 为什么我的电脑休眠时 VPN 连接会中断?[关闭]

  • 有什么软件可以模拟局域网?

  • 带宽利用工具?[关闭]

Sidebar

Stats

  • 问题 205573
  • 回答 270741
  • 最佳答案 135370
  • 用户 68524
  • 热门
  • 回答
  • Marko Smith

    新安装后 postgres 的默认超级用户用户名/密码是什么?

    • 5 个回答
  • Marko Smith

    SFTP 使用什么端口?

    • 6 个回答
  • Marko Smith

    从 IP 地址解析主机名

    • 8 个回答
  • Marko Smith

    如何按大小对 du -h 输出进行排序

    • 30 个回答
  • Marko Smith

    命令行列出 Windows Active Directory 组中的用户?

    • 9 个回答
  • Marko Smith

    什么是 Pem 文件,它与其他 OpenSSL 生成的密钥文件格式有何不同?

    • 3 个回答
  • Marko Smith

    如何确定bash变量是否为空?

    • 15 个回答
  • Martin Hope
    MikeN 在 Nginx 中,如何在维护子域的同时将所有 http 请求重写为 https? 2009-09-22 06:04:43 +0800 CST
  • Martin Hope
    Tom Feiner 如何按大小对 du -h 输出进行排序 2009-02-26 05:42:42 +0800 CST
  • Martin Hope
    0x89 bash中的双方括号和单方括号有什么区别? 2009-08-10 13:11:51 +0800 CST
  • Martin Hope
    Kyle Brandt IPv4 子网如何工作? 2009-08-05 06:05:31 +0800 CST
  • Martin Hope
    Noah Goodrich 什么是 Pem 文件,它与其他 OpenSSL 生成的密钥文件格式有何不同? 2009-05-19 18:24:42 +0800 CST
  • Martin Hope
    Brent 如何确定bash变量是否为空? 2009-05-13 09:54:48 +0800 CST
  • Martin Hope
    cletus 您如何找到在 Windows 中打开文件的进程? 2009-05-01 16:47:16 +0800 CST

热门标签

linux nginx windows networking ubuntu domain-name-system amazon-web-services active-directory apache-2.4 ssh

Explore

  • 主页
  • 问题
    • 最新
    • 热门
  • 标签
  • 帮助

Footer

AskOverflow.Dev

关于我们

  • 关于我们
  • 联系我们

Legal Stuff

  • Privacy Policy

Language

  • Pt
  • Server
  • Unix

© 2023 AskOverflow.DEV All Rights Reserve