当前位置: 首页 > news >正文

HaProxy学习 —300K的TCP Socket并发连接实现(翻译)

HaProxy学习 —300K的TCP Socket并发连接实现(翻译)

  • 1 原文链接
  • 2 原文翻译
    • 2.1 调整Linux系统参数
    • 2.2 调整HAProxy

1 原文链接

Use HAProxy to load balance 300k concurrent tcp socket connections: Port Exhaustion, Keep-alive and others)(用HAProxy的负载均衡实现300K的TCP Socket并发连接:端口耗尽、保持连接等)

2 原文翻译

标题:用HAProxy的负载均衡实现300K的TCP Socket并发连接:端口耗尽、保持连接等。
发表时间: 2015年8月19日

最近我尝试建立一个推送系统。为了增加系统的可扩展性,最佳实践是使每个连接尽可能无状态。因此当瓶颈出现时,可以通过添加更多的机器来轻松扩展整个系统的容量。说到负载平衡和反向代理,Nginx可能是最著名和公认的一个。然而,TCP代理是一个相当新的事情。Nginx从v1.9引入了TCP负载平衡和反向代理,该版本于今年5月下旬发布,有很多缺失的功能。另一方面,HAProxy作为TCP加载平衡的先驱,已经相当成熟和稳定。我选择使用HAProxy来构建系统,最终我达到了300K的TCP Socket并发连接。如果不是我相当过时的客户端PC,我可以实现更高的数量。

2.1 调整Linux系统参数

300K的TCP Socket并发连接对于高性能服务器PC来说也不是一件容易的事情。首先,我们需要调整Linux内核配置,以充分利用我们的服务器。

  1. 文件描述符
    从Linux系统角度来看,Sockets等同于文件,因此默认的文件描述符限制对于我们的300k目标来说相当小。修改系统全局允许分配的最大文件句柄数:
sysctl -w fs.file-max=10000000
sysctl -w fs.nr_open=10000000

这些行将文件描述符总数增加到100万。接着修改 /etc/security/limits.conf ,添加持久化设置允许用户 / 进程打开文件句柄数:

*      soft   nofile      10000000
*      hard   nofile      10000000
root   soft   nofile      10000000
root   hard   nofile      10000000

非root用户,前两行应该可以完成工作。但是,如果是以root用户身份运行HAProxy,则需要明确声明root用户。

  1. TCP Socket 读写 Buffer 设置
    保持如此大量的连接会消耗大量内存。为了减少内存使用,修改 /etc/sysctl.conf 添加以下行。
net.ipv4.tcp_mem = 786432 1697152 1945728
net.ipv4.tcp_rmem = 4096 4096 16777216
net.ipv4.tcp_wmem = 4096 4096 16777216

2.2 调整HAProxy

完成内核Linux调优后,我们需要调整HAProxy以更好地满足我们的需求。

  1. 增加最大连接数
    在HAProxy中,全局和具体后端都有一个“最大连接上限”。为了增加上限,我们需要在全局范围下添加一行配置。
maxconn 2000000

然后将相同的行添加到后端范围内,示例:

backend pushservermode tcpbalance roundrobinmaxconn 2000000
  1. 调整timeout
    调整连接超时时间,默认情况下,这些参数都的以毫秒为单位。
 timeout connect 5000timeout client 50000timeout server 50000
  1. 配置源IP来解决端口耗尽问题(调整可用知名端口范围)
    当同时有30k连接时,会遇到“端口耗尽”的问题,它是由每个反向代理的连接都会占用一个本地IP的可用端口造成的,可用于传出连接的默认IP范围在30k~60k左右,换句话说,我们只有一个IP的30k端口可用,显然不够,可以通过修改 /etc/sysctl.conf 增加下面这一行来增加这个范围。
    sysctl -w net.ipv4.ip_local_port_range='1024 65535'
    
    这不能解决根本问题,当达到60k上限时,我们仍然会用完端口。

这个端口耗尽问题的最终解决方案是增加可用IP的数量。首先,我们将一个新的IP绑定到一个新的虚拟网络接口。

ifconfig eth0:1 192.168.8.1

这个命令绑定一个Intranet地址到一个硬件接口为eth0的虚拟网络接口eth0:1上。该命令可以执行几次,来添加任意数量的虚拟网络接口。只需记住IP应该在真实应用服务器的同一个子网络中。换句话说,你不能用任何类型的NAT服务在HAProxy和应用服务器之间建立连接。因为它不起作用。

接下来,配置HAProxy来使用这些新的IP。有一个源命令可以在后端范围内使用,也可以作为服务器命令的参数。在我们的实验中,后端范围似乎不起作用,所以我们选择了参数一。这是具体配置。

backend mqttmode tcpbalance roundrobinmaxconn 2000000server app1 127.0.0.1:1883 source 192.168.8.1server app2 127.0.0.1:1883 source 192.168.8.2server app3 127.0.0.1:1883 source 192.168.8.3server app4 127.0.0.1:1884 source 192.168.8.4server app5 127.0.0.1:1884 source 192.168.8.5server app6 127.0.0.1:1884 source 192.168.8.6

这里有一个技巧,需要在多个条目中声明它们,并给它们不同的应用程序名称。如果你为所有四个条目设置相同的应用程序名称,HAProxy将无法工作。如果你可以查看HAProxy状态报告的输出,你会发现即使这些条目具有相同的后端地址,HAProxy仍然将它们视为不同的应用程序。

这就是配置!现在你的HAProxy应该能够处理超过300k并发TCP连接,就像我的一样。

相关文章:

HaProxy学习 —300K的TCP Socket并发连接实现(翻译)

HaProxy学习 —300K的TCP Socket并发连接实现(翻译) 1 原文链接2 原文翻译2.1 调整Linux系统参数2.2 调整HAProxy 1 原文链接 Use HAProxy to load balance 300k concurrent tcp socket connections: Port Exhaustion, Keep-alive and others&#xff0…...

92.WEB渗透测试-信息收集-Google语法(6)

免责声明:内容仅供学习参考,请合法利用知识,禁止进行违法犯罪活动! 内容参考于: 易锦网校会员专享课 上一个内容:91.WEB渗透测试-信息收集-Google语法(5) 监控的漏洞也有很多 打…...

[数据集][目标检测]木材缺陷检测数据集VOC+YOLO格式2383张10类别

数据集格式:Pascal VOC格式YOLO格式(不包含分割路径的txt文件,仅仅包含jpg图片以及对应的VOC格式xml文件和yolo格式txt文件) 图片数量(jpg文件个数):2383 标注数量(xml文件个数):2383 标注数量(txt文件个数):2383 标注…...

【启明智显分享】智能音箱AI大模型一站式解决方案重塑人机交互体验,2个月高效落地

2010年左右,智能系统接入音箱市场,智能音箱行业在中国市场兴起。但大潮激荡,阿里、小米、百度三大巨头凭借自身强大的资本、技术、粉丝群强势入局,形成三足鼎立态势。经过几年快速普及,智能音箱整体渗透率极高&#xf…...

逻辑与集合论基础及其在编程中的应用

目录 第一篇文章:逻辑与集合论基础及其在编程中的深度应用 引言 命题逻辑与谓词逻辑在编程中的深入应用 集合论及其在编程中的深度运用 函数的概念及其与集合的结合 总结与应用 第一篇文章:逻辑与集合论基础及其在编程中的深度应用 引言 逻辑与集…...

【无标题】为什么 pg_rewind 在 PostgreSQL 中很重要?

文章目录 pg_rewind 的工作原理使用 pg_rewind 的要求Basic Usage of pg_rewind重要注意事项:为什么 pg_rewind 需要干净关闭?无法进行干净关闭的情况处理不正常关机结论 pg_rewind 是 PostgreSQL 中的一个实用程序,用于将一个数据库集群与另一个数据库集…...

hostapd生成beacon_ie

配置文件 /data/vendor/wifi/hostapd/hostapd_wlan0.conf 配置参数 AP启动过程:1.上层配置一些参数并根据参数生成配置文件 2.init的时候设置默认参数并加载配置文件上的参数(如果重复,以配置文件上的设置优先) 相关函数及结构…...

leetcode349:两个数组的交集

两个数组的交集 给定两个数组 nums1 和 nums2 &#xff0c;返回 它们的 交集 。输出结果中的每个元素一定是 唯一 的。我们可以 不考虑输出结果的顺序 。 public int[] intersection(int[] nums1, int[] nums2) {ArrayList<Integer> list new ArrayList<>();Has…...

Metasploit漏洞利用系列(八):MSF渗透测试 - PHPCGI漏洞利用实战

在本系列的第八篇文章中&#xff0c;我们将深入探索如何利用Metasploit Framework (MSF) 来针对PHPCGI (PHP Common Gateway Interface) 的漏洞进行渗透测试。PHPCGI作为一种将Web服务器与PHP脚本交互的方式&#xff0c;其不恰当的配置或老旧版本中可能存在的漏洞常被攻击者利用…...

基于python的主观题自动阅卷系统设计与实现

博主介绍&#xff1a; 大家好&#xff0c;本人精通Java、Python、C#、C、C编程语言&#xff0c;同时也熟练掌握微信小程序、Php和Android等技术&#xff0c;能够为大家提供全方位的技术支持和交流。 我有丰富的成品Java、Python、C#毕设项目经验&#xff0c;能够为学生提供各类…...

计算机毕业设计仪器设备管理系统-折旧-报废-转移-借出-归还

本文主要阐述如何采用利用网络数据库技术&#xff0c;在信息管理系统中合理的进行管理。在全面解析系统的设计理念以及设计手段&#xff0c;将系统进程中的所需的工具以及技术进行综合的设计&#xff0c;重点解析信息管理情况以及自动化管理进程&#xff0c;主要包括&#xff1…...

DAY37

零钱兑换 II public int change(int amount, int[] coins) {int []dpnew int[amount1];dp[0]1;for(int i0;i<coins.length;i){for(int jcoins[i];j<amount;j){dp[j]dp[j-coins[i]];}}return dp[amount];}组合总和 Ⅳ public int combinationSum4(int[] nums, int target)…...

将iso格式的镜像文件转化成云平台能安装的镜像格式(raw/vhd/QCOW2/VMDK )亲测--图文详解

1.首先,你将你的iso的文件按照正常的流程和需求安装到你的虚拟机中,我这里使用的是vmware,安装完成之后,关机。再次点开你安装好的那台虚拟机的窗口,如下图 选中要导出的镜像,镜像需要关机 2.点击工具栏的文件------选择 导出 整个工程到 ovf 格式—这里你可以选择你要导…...

Numba加速计算(CPU + GPU + prange)

文章目录 加速方法&#xff1a;Numba、CuPy、PyTorch、PyCUDA、Dask、Rapids一、Numba简介二、Numba类型&#xff1a;CPU GPU三、项目实战 —— 数组的每个元素加23.1、使用 python - range 循环计算 —— &#xff08;时耗&#xff1a;137.37 秒&#xff09;3.2、使用 python…...

electron 两个渲染进程之间通信

一、使用主进程作为中介 使用主进程作为中介相对较为灵活&#xff0c;但可能会增加主进程的负担 1. 从一个渲染进程向主进程发送消息 在发送消息的渲染进程中&#xff0c;可以使用 ipcRenderer 模块向主进程发送消息。例如&#xff1a; const { ipcRenderer } require(&qu…...

配置ROS环境

1.检测环境变量 运行printenv | grep ROS命令&#xff0c;有如下返回值则表示环境变量配置正确&#xff1a; ROS_ROOT/opt/ros/kinetic/share/ros ROS_PACKAGE_PATH/opt/ros/kinetic/share ROS_MASTER_URIhttp://localhost:11311 ROSLISP_PACKAGE_DIRECTORIES ROS_DIST…...

力扣 128. 最长连续序列

题目描述 我的思路 我的思路比较暴力&#xff0c;就是首先将数组从小到大进行排序&#xff0c;然后再依次遍历判断序列是否连续并时时更新连续序列的最长长度。比如示例1&#xff1a;nums [100, 4, 200, 1, 3, 2]&#xff0c;第一步先将数组进行排序得到sort_nums [1, 2, 3,…...

Stable Diffusion AI绘画工具的安装与配置(MAC用户)

AI绘画的热潮席卷了整个创意行业&#xff0c;Stable Diffusion作为其中的翘楚&#xff0c;让艺术创作变得前所未有的简单。然而&#xff0c;对于使用Mac电脑用户来说&#xff0c;安装和配置Stable Diffusion可能显得有些棘手。别担心&#xff0c;这份详细的教程将手把手教你如何…...

flowable源码解读——并行多实例节点任务是否是顺序生成

最近在项目开发中需要在多实例开始监听里修改一个全局的计数变量&#xff0c;不太确定并行多实例任务在底层引擎是顺序生成还是并行生成的&#xff0c;如果是顺序生成的则不影响&#xff0c;如果是并行生成 则修改一个全局的计数变量就会出现数据错误问题&#xff0c;查阅了flo…...

【机器学习】AGI的基本概念、技术挑战和应用前景

引言 AGI是指机器能够完成人类能够完成的任何智力任务的能力 文章目录 引言一、什么是AGI1.1 AGI&#xff0c;Artificial General Intelligence&#xff08;通用人工智能&#xff09;1.2 AGI的定义和标准1.3 AGI的发展 二、AGI的技术挑战2.1 理解人类智能2.2 认知复杂性2.3 自主…...

浏览器访问 AWS ECS 上部署的 Docker 容器(监听 80 端口)

✅ 一、ECS 服务配置 Dockerfile 确保监听 80 端口 EXPOSE 80 CMD ["nginx", "-g", "daemon off;"]或 EXPOSE 80 CMD ["python3", "-m", "http.server", "80"]任务定义&#xff08;Task Definition&…...

SpringBoot-17-MyBatis动态SQL标签之常用标签

文章目录 1 代码1.1 实体User.java1.2 接口UserMapper.java1.3 映射UserMapper.xml1.3.1 标签if1.3.2 标签if和where1.3.3 标签choose和when和otherwise1.4 UserController.java2 常用动态SQL标签2.1 标签set2.1.1 UserMapper.java2.1.2 UserMapper.xml2.1.3 UserController.ja…...

2021-03-15 iview一些问题

1.iview 在使用tree组件时&#xff0c;发现没有set类的方法&#xff0c;只有get&#xff0c;那么要改变tree值&#xff0c;只能遍历treeData&#xff0c;递归修改treeData的checked&#xff0c;发现无法更改&#xff0c;原因在于check模式下&#xff0c;子元素的勾选状态跟父节…...

ffmpeg(四):滤镜命令

FFmpeg 的滤镜命令是用于音视频处理中的强大工具&#xff0c;可以完成剪裁、缩放、加水印、调色、合成、旋转、模糊、叠加字幕等复杂的操作。其核心语法格式一般如下&#xff1a; ffmpeg -i input.mp4 -vf "滤镜参数" output.mp4或者带音频滤镜&#xff1a; ffmpeg…...

什么?连接服务器也能可视化显示界面?:基于X11 Forwarding + CentOS + MobaXterm实战指南

文章目录 什么是X11?环境准备实战步骤1️⃣ 服务器端配置(CentOS)2️⃣ 客户端配置(MobaXterm)3️⃣ 验证X11 Forwarding4️⃣ 运行自定义GUI程序(Python示例)5️⃣ 成功效果![在这里插入图片描述](https://i-blog.csdnimg.cn/direct/55aefaea8a9f477e86d065227851fe3d.pn…...

代理篇12|深入理解 Vite中的Proxy接口代理配置

在前端开发中,常常会遇到 跨域请求接口 的情况。为了解决这个问题,Vite 和 Webpack 都提供了 proxy 代理功能,用于将本地开发请求转发到后端服务器。 什么是代理(proxy)? 代理是在开发过程中,前端项目通过开发服务器,将指定的请求“转发”到真实的后端服务器,从而绕…...

算法岗面试经验分享-大模型篇

文章目录 A 基础语言模型A.1 TransformerA.2 Bert B 大语言模型结构B.1 GPTB.2 LLamaB.3 ChatGLMB.4 Qwen C 大语言模型微调C.1 Fine-tuningC.2 Adapter-tuningC.3 Prefix-tuningC.4 P-tuningC.5 LoRA A 基础语言模型 A.1 Transformer &#xff08;1&#xff09;资源 论文&a…...

智能AI电话机器人系统的识别能力现状与发展水平

一、引言 随着人工智能技术的飞速发展&#xff0c;AI电话机器人系统已经从简单的自动应答工具演变为具备复杂交互能力的智能助手。这类系统结合了语音识别、自然语言处理、情感计算和机器学习等多项前沿技术&#xff0c;在客户服务、营销推广、信息查询等领域发挥着越来越重要…...

STM32HAL库USART源代码解析及应用

STM32HAL库USART源代码解析 前言STM32CubeIDE配置串口USART和UART的选择使用模式参数设置GPIO配置DMA配置中断配置硬件流控制使能生成代码解析和使用方法串口初始化__UART_HandleTypeDef结构体浅析HAL库代码实际使用方法使用轮询方式发送使用轮询方式接收使用中断方式发送使用中…...

【LeetCode】3309. 连接二进制表示可形成的最大数值(递归|回溯|位运算)

LeetCode 3309. 连接二进制表示可形成的最大数值&#xff08;中等&#xff09; 题目描述解题思路Java代码 题目描述 题目链接&#xff1a;LeetCode 3309. 连接二进制表示可形成的最大数值&#xff08;中等&#xff09; 给你一个长度为 3 的整数数组 nums。 现以某种顺序 连接…...