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

tcp 连接数上限突破

连接数上限条件

文件句柄的限制

一个tcp连接就需要占用一个文件描述符,一旦文件描述符用完,新的连接就会返回给我们错误是:Can’topen so many files。linux系统出于安全角度的考虑,在多个维度对于可打开的文件描述符进行了限制,通常是系统限制、用户限制、进程限制。

限制维度描述查看默认修改
系统(fs.file-max)限制整个系统的文件句柄个数cat /proc/sys/fs/file-max-编辑 /etc/sysctl.conf 文件,加入:
fs.file-max=1000000
然后执行sysctl -p命令使其生效
进程(fs.nr_open)限制系统单个进程可打开的最大文件件句柄数量cat /proc/sys/fs/nr_open-编辑 /etc/sysctl.conf 文件,加入:
fs.nr_open=1000000
然后执行sysctl -p命令使其生效
用户进程(nofile)限制每个用户的进程可打开的最大文件句柄数量ulimit -n-临时修改:ulimit -n 1000000
永久修改:编辑 /etc/security/limits.conf 文件:
* soft nofile 55000
* hard nofile 55000
上面修改对所有用户生效。
注意!!!:hard nofile 一定要比 fs.nr_open 要小,否则可能导致用户无法登陆。

端口限制

操作系统采用 <客户端IP : 客户端端口> : <服务端IP : 服务端端口> 四元组来标识一条TCP连接。

端口范围

一个IP的端口范围是1024-65535。

查看方法
$ sysctl net.ipv4.ip_local_port_range

$ cat /proc/sys/net/ipv4/ip_local_port_range
修改方法

临时修改:

# 临时修改方法1
$ echo 1024 65535 > /proc/sys/net/ipv4/ip_local_port_range# 临时修改方法2
$ sysctl -w net.ipv4.ip_local_port_range="1024 64000"

永久修改:
编辑 /etc/sysctl.conf 文件,在其中加入:

net.ipv4.ip_local_port_range = 1024 65535

连接突破限制方法

服务端一般不会存在端口限制的问题,服务端开一个listen端口,只要文件句柄没达上限,就可以建立连接。
针对客户端的端口限制,有下面的方法:

  • 服务器端只开启一个进程,然后使用很多个客户端进程绑定不同的客户端 ip 来连接
  • 服务器开启多个进程,这样客户端就可以只使用一个 ip 即可

supervisor控制的程序

CentOS上使用系统自带的supervisor,使用systemd启动supervisord的服务。被supervisor管理、启动的进程,并不会使用 /etc/security/limits.conf 中配置的 nofile 数值,继承的是systemd对应的限制。

在supervisord 的配置文件 /etc/supervisor.conf中调整

检查 supervisord 的配置文件 /etc/supervisor.conf 中,会发现一个 minfds 的参数设置了 nofile 限制,默认为 1024。

[supervisord]minfds=100000                 ; (min. avail startup file descriptors;default 1024)
minprocs=100000                ; (min. avail process descriptors;default 200)

minprocs 参数,minprocs 对应的是 rlimit 中的 nproc, nproc 代表一个进程最多可以创建的线程数。

在启动.service文件里面修改对应的限制

$ vim /usr/lib/systemd/system/supervisord.service
[Unit]
Description=Process Monitoring and Control Daemon
After=network.target[Service]
Type=forking
LimitCORE=infinity
LimitNOFILE=100000 
LimitNPROC=100000
ExecStart=/usr/bin/supervisord -c /etc/supervisord.conf
ExecReload=/usr/bin/supervisorctl reload
ExecStop=/usr/bin/supervisorctl shutdown[Install]
WantedBy=multi-user.target

重新加载

$ systemctl daemon-reload
$ systemctl restart supervisord.service

nginx 连接突破上限

首先参考上面的内容调整文件句柄数量。其次创建子网卡,将请求分配到不同的 ip上,最后调整nginx配置。

创建子网卡

ifconfig eth0:0 192.168.1.11/24 up
ifconfig eth0:1 192.168.1.12/24 up
ifconfig eth0:2 192.168.1.13/24 up
ifconfig eth0:3 192.168.1.14/24 up
ifconfig eth0:4 192.168.1.15/24 up
ifconfig eth0:5 192.168.1.16/24 up
ifconfig eth0:6 192.168.1.17/24 up
ifconfig eth0:7 192.168.1.18/24 up
ifconfig eth0:8 192.168.1.19/24 up
ifconfig eth0:9 192.168.1.10/24 up
ifconfig eth0:10 192.168.1.20/24 up
ifconfig eth0:11 192.168.1.21/24 up
ifconfig eth0:12 192.168.1.22/24 up
ifconfig eth0:13 192.168.1.23/24 up
ifconfig eth0:14 192.168.1.24/24 up

调整nginx配置

  1. 修改Nginx最大打开文件数为 100w
worker_rlimit_nofile 1000000;
  1. 修改Nginx事件处理模型
events {use epoll;worker_connections 1000000;
}

3.配置应用请求
后端 go应用程序监听在 9505 端口,nginx中配置 upstream

upstream go-ws {server 127.0.0.1:9505;keepalive 128;
}location /ws {proxy_redirect off;proxy_bind $split_ip;proxy_pass http://go-ws;proxy_bind $spl_set_header X-Forwarded-For $proxy_add_x_forwarded_for;# WebSocket 支持的核心配置proxy_http_version 1.1;proxy_set_header Upgrade $http_upgrade;proxy_set_header Connection $http_connection;proxy_intercept_errors on;client_max_body_size 20m;}#将请求分配到不同ip上
split_clients "$remote_addr$remote_port" $split_ip {10%  192.168.1.11;10%  192.168.1.12;10%  192.168.1.13;10%  192.168.1.14;10%  192.168.1.15;10%  192.168.1.16;10%  192.168.1.17;10%  192.168.1.18;10%  192.168.1.19;10%  192.168.1.20;10%  192.168.1.21;10%  192.168.1.22;10%  192.168.1.23;10%  192.168.1.24;*    192.168.1.10;
}

如果句柄数并未达到100万就报http: Accept error: accept tcp [::]:9505: accept4: too many open files; retrying in 40ms

尝试调整 supervisorctl句柄数据试试。

netty 连接数设置

netty中跟连接数相关的参数是ChannelOption.SO_BACKLOG,对应的是tcp/ip协议, listen函数 中的 backlog 参数,用来初始化服务端可连接队列。

linux内核中的两个队列

在linux系统内核中维护了两个队列:syns queue和accept queue

服务端处理客户端连接请求是顺序处理的,所以同一时间只能处理一个客户端连接,多个客户端来的时候,服务端将不能处理的客户端连接请求放在队列中等待处理。

  • syns queue:保存一个SYN已经到达,但三次握手还没有完成的连接。

    用于保存半连接状态的请求,其大小通过/proc/sys/net/ipv4/tcp_max_syn_backlog指定,一般默认值是512。不过这个设置有效的前提是系统的syncookies功能被禁用。

    互联网常见的TCP SYN FLOOD恶意DOS攻击方式就是建立大量的半连接状态的请求,然后丢弃,导致syns queue不能保存其它正常的请求。

  • accept queue:保存三次握手已完成,内核正等待进程执行accept的调用的连接。

    用于保存全连接状态的请求,其大小通过/proc/sys/net/core/somaxconn指定。

    在使用listen函数时,内核会根据传入的backlog参数与系统参数somaxconn,取二者的较小值。

注意:

  • 如果未设置或所设置的值小于1,Java将使用默认值50。
  • 如果accpet queue队列满了,server将发送一个ECONNREFUSED错误信息Connection refused到client。

ChannelOption.SO_BACKLOG

服务器TCP内核 内维护了两个队列,称为A(未连接队列)和B(已连接队列)

如果A+B的长度大于Backlog时,新的连接就会被TCP内核拒绝掉。

如果backlog过小,就可能出现Accept的速度跟不上,A,B队列满了,就会导致客户端无法建立连接。

另外 backlog对程序的连接数没影响,但是影响的是还没有被Accept取出的连接。

在netty实现中,backlog默认通过NetUtil.SOMAXCONN指定;在ServerBootstrap中使用option()方法设置SO_BACKLOG参数,该参数表示等待接受的连接队列的最大长度。示例代码如下:

ServerBootstrap serverBootstrap = new ServerBootstrap();
serverBootstrap.group(bossGroup, workerGroup).channel(NioServerSocketChannel.class).option(ChannelOption.SO_BACKLOG, 100) // 设置最大连接数为100.childHandler(new MyChannelInitializer());

TCP的连接状态 (SYN, FIN, ACK, PSH, RST, URG)

SYN 表示建立连接
FIN 表示关闭连接
ACK 表示响应
PSH 表示有 DATA数据传输
RST 表示连接重置。

参考

用Netty实现单机百万TCP长连接
让Netty Linux 突破100万的连接量
netty怎么设置最大连接数
单机器如何实现Nginx百万并发连接
linux - 文件句柄的限制,你知道吗?
实践单机实现百万连接
supervisord 中的 open files 数量限制
superversior 常用操作命令supervisorctl
Netty ChannelOption.SO_BACKLOG配置

相关文章:

tcp 连接数上限突破

连接数上限条件 文件句柄的限制 一个tcp连接就需要占用一个文件描述符&#xff0c;一旦文件描述符用完&#xff0c;新的连接就会返回给我们错误是&#xff1a;Can’topen so many files。linux系统出于安全角度的考虑&#xff0c;在多个维度对于可打开的文件描述符进行了限制…...

解决 mmseg/models/decode_heads/mask2former_head.py 中__init__()关键字参数错误

目录 【1 - 问题描述】 【2 - 报错位置检查】 【3 - 问题解决】 【4 - 解决的过程】 【1 - 问题描述】 在mmsegmentation中运行mask2former模型的分割任务遇到报错缺少关键字的错误&#xff1a; TypeError: class Mask2FormerHead in mmseg/models/decode_heads/mask2form…...

​如何使用 ArcGIS Pro 分析爆炸波及建筑

假设在某栋建筑内发生了爆炸&#xff0c;需要根据爆炸的范围分析出来波及的建筑&#xff0c;对于这一需求&#xff0c;我们可以通过ArcGIS Pro来实现&#xff0c;这里为大家介绍一下分析的方法&#xff0c;希望能对你有所帮助。 数据来源 教程所使用的数据是从水经微图中下载…...

LoadBalancer (本地负载均衡)

1.loadbalancer本地负载均衡客户端 VS Nginx服务端负载均衡区别 Nginx是服务器负载均衡&#xff0c;客户端所有请求都会交给nginx&#xff0c;然后由nginx实现转发请求&#xff0c;即负载均衡是由服务端实现的。 loadbalancer本地负载均衡&#xff0c;在调用微服务接口时候&a…...

每日一题 第一期 洛谷 铺地毯

[NOIP2011 提高组] 铺地毯 https://www.luogu.com.cn/problem/P1003 题目描述 为了准备一个独特的颁奖典礼&#xff0c;组织者在会场的一片矩形区域&#xff08;可看做是平面直角坐标系的第一象限&#xff09;铺上一些矩形地毯。一共有 n n n 张地毯&#xff0c;编号从 1 …...

Linux 多线程开发

第三章 Linux 多线程开发 3.1 线程3.1.2 线程操作3.1.2 线程属性 3.2 线程同步3.2.1 互斥量/锁3.2.2 死锁3.2.3 读写锁 3.3 生产者消费者模型3.3.1 条件变量3.3.2 信号量/灯 网络编程系列文章&#xff1a; 第1章 Linux系统编程入门&#xff08;上&#xff09; 第1章 Linux系统…...

Android 9.0 关于在系统Launcher3中调用截图api总是返回null的解决方案

1.概述 在9.0的系统rom产品定制化开发中,在Launcher3的开发中,在某些时候需要调用截图接口来进行截屏功能实现,而在Launcher3中发现调用系统截屏接口SurfaceControl.screenshot进行截图的时候始终为null, 获取不到系统当前页面的截屏功能,所以需要找到当前截屏失败的原因然…...

openssl3.2 - exp - 用openssl命令行来模拟ECC加解密的全流程

文章目录 openssl3.2 - exp - 用openssl命令行来模拟ECC加解密的全流程概述笔记实验环境实验备注END openssl3.2 - exp - 用openssl命令行来模拟ECC加解密的全流程 概述 工程中要用到ECC加解密, 先去查了资料. 在网上能查到一些大佬们写的ECC加解密实现(基于openssl API), 不…...

【Linux进阶之路】HTTP协议

文章目录 一、基本概念1.HTTP2.域名3.默认端口号4.URL 二、请求与响应1.抓包工具2.基本框架3.简易实现3.1 HttpServer3.2 HttpRequest3.2.1 version13.2.2 version23.2.3 version3 总结尾序 一、基本概念 常见的应用层协议&#xff1a; HTTPS (HyperText Transfer Protocol Sec…...

股市新手福音:河北源达“财源滚滚”让投资变得更简单

在浩渺的股市海洋中&#xff0c;每一位投资者都渴望找到一把能够指引航向的罗盘。尤其是对于股市新手来说&#xff0c;面对复杂的市场环境、纷繁的个股信息以及不断变化的投资策略&#xff0c;如何快速入门、精准选股&#xff0c;无疑是一大挑战。而河北源达信息技术股份有限公…...

2024.02.14 校招 实习 内推 面经

绿*泡*泡VX&#xff1a; neituijunsir 交流*裙 &#xff0c;内推/实习/校招汇总表格 1、校招&社招 | 中国电子信息产业集团有限公司校园招聘 校招&社招 | 中国电子信息产业集团有限公司校园招聘 2、校招&社招 | 中核光电2024年春季校园招聘开启&#xff01; 校…...

5.Java并发编程—JUC线程池架构

JUC线程池架构 在Java开发中&#xff0c;线程的创建和销毁对系统性能有一定的开销&#xff0c;需要JVM和操作系统的配合完成大量的工作。 JVM对线程的创建和销毁&#xff1a; 线程的创建需要JVM分配内存、初始化线程栈和线程上下文等资源&#xff0c;这些操作会带来一定的时间和…...

llama2c(4)之forward、sample、decode

1、forward float* logits forward(transformer, token, pos); 输入transformer的参数&#xff0c;当前token&#xff0c;pos位置&#xff0c;预测出下一个token的预测值&#xff08;用矩阵乘&#xff0c;加减乘除等运算构成Transformer&#xff09; 其中&#xff0c;logits如…...

20240312-2-贪心算法

贪心算法 是每次只考虑当前最优&#xff0c;目标证明每次是考虑当前最优能够达到局部最优&#xff0c;这就是贪心的思想&#xff0c;一般情况下贪心和排序一起出现&#xff0c;都是先根据条件进行排序&#xff0c;之后基于贪心策略得到最优结果。 面试的时候面试官一般不会出贪…...

前端 --- HTML

1. HTML 结构 1.1 HTML 文件基本结构 <html><head><title>第一个html程序</title></head><body>hello world!</body> </html> html 标签是整个 html 文件的根标签(最顶层标签)head 标签中写页面的属性.body 标签中写的是页…...

curl c++ 实现HTTP GET和POST请求

环境配置 curl //DV2020T环境下此步骤可省略 https://curl.se/download/ 笔者安装为7.85.0版本 ./configure --without-ssl make sudo make install sudo rm /usr/local/lib/curl 系统也有curl库&#xff0c;为防止冲突&#xff0c;删去编译好的curl库。 对以json数据的解析使…...

12、设计模式之代理模式(Proxy)

一、什么是代理模式 代理模式属于结构型设计模式。为其他对象提供一种代理以控制对这个对象的访问。 在某些情况下&#xff0c;一个对象不适合或者不能直接引用另一个对象&#xff0c;而代理对象可以在客户端和目标对象之间起到中介的作用。 二、分类 代理模式分为三类&#…...

springboot集成Quartz定时任务组件

文章目录 前言一、Quartz 是什么&#xff1f;下面是对 Java 中 Quartz 的主要概念的简单描述&#xff1a; 二、使用步骤总结 前言 平时开发中相信大家都经常用到定时任务吧&#xff0c;最近简单的就是直接使用Scheduled注解标注到方法上用注解的方式在项目运行时无法去对任务进…...

代码随想录算法训练营第38天—动态规划06 | ● 完全背包 ● *518. 零钱兑换 II ● 377. 组合总和 Ⅳ

完全背包 视频讲解&#xff1a;https://www.bilibili.com/video/BV1uK411o7c9 https://programmercarl.com/%E8%83%8C%E5%8C%85%E9%97%AE%E9%A2%98%E7%90%86%E8%AE%BA%E5%9F%BA%E7%A1%80%E5%AE%8C%E5%85%A8%E8%83%8C%E5%8C%85.html 题目描述&#xff1a;有n件物品和一个最多能…...

C语言每日一题(63)复写零

题目链接 力扣网 1089 复写零 题目描述 给你一个长度固定的整数数组 arr &#xff0c;请你将该数组中出现的每个零都复写一遍&#xff0c;并将其余的元素向右平移。 注意&#xff1a;请不要在超过该数组长度的位置写入元素。请对输入的数组 就地 进行上述修改&#xff0c;不…...

Admin.Net中的消息通信SignalR解释

定义集线器接口 IOnlineUserHub public interface IOnlineUserHub {/// 在线用户列表Task OnlineUserList(OnlineUserList context);/// 强制下线Task ForceOffline(object context);/// 发布站内消息Task PublicNotice(SysNotice context);/// 接收消息Task ReceiveMessage(…...

在HarmonyOS ArkTS ArkUI-X 5.0及以上版本中,手势开发全攻略:

在 HarmonyOS 应用开发中&#xff0c;手势交互是连接用户与设备的核心纽带。ArkTS 框架提供了丰富的手势处理能力&#xff0c;既支持点击、长按、拖拽等基础单一手势的精细控制&#xff0c;也能通过多种绑定策略解决父子组件的手势竞争问题。本文将结合官方开发文档&#xff0c…...

将对透视变换后的图像使用Otsu进行阈值化,来分离黑色和白色像素。这句话中的Otsu是什么意思?

Otsu 是一种自动阈值化方法&#xff0c;用于将图像分割为前景和背景。它通过最小化图像的类内方差或等价地最大化类间方差来选择最佳阈值。这种方法特别适用于图像的二值化处理&#xff0c;能够自动确定一个阈值&#xff0c;将图像中的像素分为黑色和白色两类。 Otsu 方法的原…...

【SQL学习笔记1】增删改查+多表连接全解析(内附SQL免费在线练习工具)

可以使用Sqliteviz这个网站免费编写sql语句&#xff0c;它能够让用户直接在浏览器内练习SQL的语法&#xff0c;不需要安装任何软件。 链接如下&#xff1a; sqliteviz 注意&#xff1a; 在转写SQL语法时&#xff0c;关键字之间有一个特定的顺序&#xff0c;这个顺序会影响到…...

QT: `long long` 类型转换为 `QString` 2025.6.5

在 Qt 中&#xff0c;将 long long 类型转换为 QString 可以通过以下两种常用方法实现&#xff1a; 方法 1&#xff1a;使用 QString::number() 直接调用 QString 的静态方法 number()&#xff0c;将数值转换为字符串&#xff1a; long long value 1234567890123456789LL; …...

Spring数据访问模块设计

前面我们已经完成了IoC和web模块的设计&#xff0c;聪明的码友立马就知道了&#xff0c;该到数据访问模块了&#xff0c;要不就这俩玩个6啊&#xff0c;查库势在必行&#xff0c;至此&#xff0c;它来了。 一、核心设计理念 1、痛点在哪 应用离不开数据&#xff08;数据库、No…...

是否存在路径(FIFOBB算法)

题目描述 一个具有 n 个顶点e条边的无向图&#xff0c;该图顶点的编号依次为0到n-1且不存在顶点与自身相连的边。请使用FIFOBB算法编写程序&#xff0c;确定是否存在从顶点 source到顶点 destination的路径。 输入 第一行两个整数&#xff0c;分别表示n 和 e 的值&#xff08;1…...

有限自动机到正规文法转换器v1.0

1 项目简介 这是一个功能强大的有限自动机&#xff08;Finite Automaton, FA&#xff09;到正规文法&#xff08;Regular Grammar&#xff09;转换器&#xff0c;它配备了一个直观且完整的图形用户界面&#xff0c;使用户能够轻松地进行操作和观察。该程序基于编译原理中的经典…...

蓝桥杯 冶炼金属

原题目链接 &#x1f527; 冶炼金属转换率推测题解 &#x1f4dc; 原题描述 小蓝有一个神奇的炉子用于将普通金属 O O O 冶炼成为一种特殊金属 X X X。这个炉子有一个属性叫转换率 V V V&#xff0c;是一个正整数&#xff0c;表示每 V V V 个普通金属 O O O 可以冶炼出 …...

HarmonyOS运动开发:如何用mpchart绘制运动配速图表

##鸿蒙核心技术##运动开发##Sensor Service Kit&#xff08;传感器服务&#xff09;# 前言 在运动类应用中&#xff0c;运动数据的可视化是提升用户体验的重要环节。通过直观的图表展示运动过程中的关键数据&#xff0c;如配速、距离、卡路里消耗等&#xff0c;用户可以更清晰…...