1、netty百万连接设计及优化

news/2024/4/26 21:26:19/文章来源:https://blog.csdn.net/god8816/article/details/129144695

一、系统架构设计

1、操作系统文件描述符限制

1、操作系统file-max修改:理论上系统内存有多少就可以打开多少的文件描述符,但是在实际中内核是会做相应的处理,一般最大打开文件数会是系统内存的10%(以KB来计算),称之为系统级限制。这个数字可以通过 cat /proc/sys/fs/file-max 或者 sysctl -a | grep fs.file-max 命令查看。

2、用户文件描述符file-nr修改:用户打开文件描述符默认是1024,文件描述符范围1-65535,这个数字可以通过 ulimit -n查看,可以在65535范围内调整。

3、单进程文件描述符nr_open修改:单进程文件描述符必须小于等于file-max,对于netty单进程要支持100万长连接,需要将这个值设置为100万,可以通过cat /proc/sys/fs/nr_open查看。

1、操作系统最大句柄数查询(机器内存越大,默认值越大)
$ cat /proc/sys/fs/file-max2、查询当前打开文件句柄数
$ cat /proc/sys/fs/file-nr
704(已经打开的句柄数)	0	100000(file-max数)3、手工修改file-max
$ vi /etc/sysctl.conf
fs.file-max = 1100000 #环境变量值修改大点
sudo sysctl -p  #使环境变量生效

2、用户文件描述符限制

1、用户打开句柄限制(最大值65535)
$ ulimit -n
10242、用户句柄修改(user用户句柄软限制修改未30000,硬限制修改为65535,系统可以提前告警)
$ sudo vi /etc/security/limits.conf
user soft nofile 30000
user hard nofile 65535

3、单进程文件描述符限制 

1、查看单进程打开文件句柄数
$ cat /proc/sys/fs/nr_open2、修改单进程打开文件句柄数
$ vim /etc/sysctl.conf
fs.nr_open = 1000000

4、端口监听范围

单个IP+端口最多只能打开65535个文件描述符,要实现100万长连接必须要监听多个端口。具体设置要求:file-max数量>=nr_open数量>=ulimit -n(65535)*端口数量。按照单用户打开文件描述符为5万算,100万连接需要开20个端口。

二、方案设计

1、netty百万链接核心代码

netty代码比较简单,核心就是开多端口逻辑。确立端口段前要检查这个端口是否有其他应用占用。具体程序可以设置为随机端口这样做更安全,也可以使用固定端口,好处是更明确。

try {//netty入口引导类ServerBootstrap b = new ServerBootstrap();//设置核心线程组和业务工作线程组b.group(bossGroup, workGroup);//快速复用端口,避免端口冲突,原理tcp连接需要2ML时间单位回收,这个配置加快进度b.option(ChannelOption.SO_REUSEADDR, true);//设置nio类型的channelb.channel(NioServerSocketChannel.class);//流量整形 读写最大流量100M/sGlobalTrafficShapingHandler globalTrafficShapingHandler = new GlobalTrafficShapingHandler(eventLoopGroupForTrafficShaping, gatewayConfig.getNettyConfig().getTrafficShapingWriteLimit(), gatewayConfig.getNettyConfig().getTrafficShapingReadLimit());//netty日志级别,用于排查问题使用LoggingHandler debugLogHandler = new LoggingHandler(LogLevel.DEBUG);LoggingHandler infoLogHandler = new LoggingHandler(LogLevel.INFO);b.childHandler(new ChannelInitializer<SocketChannel>() {@Overrideprotected void initChannel(SocketChannel ch) throws Exception {ChannelPipeline pipeline = ch.pipeline();//最大字符支持及分隔符pipeline.addLast("frameDecoder", new DelimiterBasedFrameDecoder(gatewayConfig.getNettyConfig().getMaxFrameLength(), Delimiters.lineDelimiter()));//编码类型pipeline.addLast("stringDecoder", new StringDecoder(CharsetUtil.UTF_8));pipeline.addLast("stringEncoder", new StringEncoder(CharsetUtil.UTF_8));//心跳超时检测 及超时清除通道pipeline.addLast("heartBeatTimeOutCheckHandler", new HeartBeatTimeOutCheckHandler(gatewayConfig.getNettyConfig().getIdleTimeOut()));//心跳、读、写超时拦截pipeline.addLast("timeServerHandler", new TimeServerHandler());//在线设备统计pipeline.addLast("metricHandler", metricsHandler);//日志级别pipeline.addLast("debegLog", debugLogHandler);pipeline.addLast("infoLog", infoLogHandler);//流量整形pipeline.addLast("tsHandler", globalTrafficShapingHandler);//通道合法性校验pipeline.addLast("sessionAuthHandler",sessionAuthHandler); //心跳消息pipeline.addLast("heartBeatRespHandler",heartBeatRespHandler); //业务接收消息pipeline.addLast("businessHandler",businessServerHandler);pipeline.addLast(businessGroup, new OrderServerProcessHandler());}});/*** 监听端口范围* */for(int port = 4000;port<=4030;port++) {int portTemp = port;b.bind(port).sync().addListener(future -> {if (future.isSuccess()) {log.info("netty监听端口成功:{}", portTemp);} else {log.info("netty监听端口失败:{}", portTemp);}});}} catch (Exception e) {log.error("netty异常:{}",e.getMessage()); stopNetty();} 

2、方案测试

百万长连接最难的是测试环节。通常压测使用jmeter,一般一台服务器也就1、5万线程,远远低于100万的要求。

1、Jmeter集群方案

应为我没有这样的集群,只能按照一台的情况推断,单台jmeter能支持5w长连接。预计百万链接需要20台Jmeter。

2、其他方案

那个大佬有巧妙的、资源低消耗的方案,麻烦留言介绍下。

三、操作系统参数优化

net.ipv4.tcp_max_tw_buckets = 10000
#表示系统同时保持TIME_WAIT套接字的最大数量net.ipv4.tcp_timestamps = 0
#关闭TCP时间戳
#以一种比重发超时更精确的方法(请参阅 RFC 1323)来启用对 RTT 的计算;为了实现更好的性能应该启用这个选项net.ipv4.tcp_tw_recycle = 1
#表示开启TCP连接中TIME-WAIT sockets的快速回收,默认为0,表示关闭。net.ipv4.tcp_tw_reuse = 1
#表示开启重用。允许将TIME-WAIT sockets重新用于新的TCP连接,默认为0,表示关闭;net.ipv4.tcp_retries2 = 1
#活动TCP连接重传次数,超过次数视为掉线,放弃连接。缺省值:15,建议设为 2或者3.net.ipv4.tcp_fin_timeout = 1
#FIN_WAIT状态的TCP连接的超时时间

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.luyixian.cn/news_show_72383.aspx

如若内容造成侵权/违法违规/事实不符,请联系dt猫网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

多种调度模式下的光储电站经济性最优储能容量配置分析(Matlab代码实现)

&#x1f4a5;&#x1f4a5;&#x1f49e;&#x1f49e;欢迎来到本博客❤️❤️&#x1f4a5;&#x1f4a5; &#x1f3c6;博主优势&#xff1a;&#x1f31e;&#x1f31e;&#x1f31e;博客内容尽量做到思维缜密&#xff0c;逻辑清晰&#xff0c;为了方便读者。 ⛳️座右铭&a…

Crafting interpreters 中文翻译(全),持续修正

本书在线地址 http://craftinginterpreters.com/ 感谢作者 作者用近 4 年的时间持续创作和改进本书&#xff0c;并把其 Web 版本公开在网上。这本纸质书于今年 7 月出版&#xff0c;立刻在 Hacker News 等网络媒介上引起关注和讨论。 书中作者首先定义了一个动态类型的语言 …

23年PMP真的值得考吗?分析+资料分享

我觉得&#xff0c;如过是真的想学习项目管理&#xff0c;或者工作要求考PMP&#xff0c;招聘要求又的确“PMP证书”优先&#xff0c;那考一个是划算的&#xff0c;毕竟在项目管理这一块&#xff0c;PMP是专业和知名度最高的证书了。 它是由美国项目管理协会(PMI)在全球范围内推…

数组-二分查找-搜索插入位置/在排序数组中查找元素的第一个和最后一个位置/x 的平方根/有效的完全平方数

二分查找 35搜索插入位置 https://leetcode.cn/problems/search-insert-position/submissions/ class Solution:def searchInsert(self, nums: List[int], target: int) -> int:l 0r len(nums)-1# // 整数除法 int /浮点数除法while(l<r):mid l (r - l)//2if nums…

二叉树——找树左下角的值

找树左下角的值 链接 给定一个二叉树的 根节点 root&#xff0c;请找出该二叉树的 最底层 最左边 节点的值。 假设二叉树中至少有一个节点。 示例 1: 输入: root [2,1,3] 输出: 1 示例 2: 输入: [1,2,3,4,null,5,6,null,null,7] 输出: 7 递归法 二叉树的 最底层 最左…

一维,二维差分の详解(简单易懂)

一,差分定义差分,就是前缀和的逆运算。二,具体过程1.一维差分例题构造差分数组首先给定一个原数组a&#xff1a;a[1], a[2], a[3],,,,,, a[n];然后我们构造一个数组b &#xff1a; b[1], b[2], b[3],,,,,, b[i];使得 a[i] b[1] b[2] b[3] ,,,,,, b[i]也就是说&#xff0c;…

Redis分布式锁实现及使用

文章目录分布式锁全局ID生成器一人一单实现超卖问题一人一单分布式锁Redis setnx实现分布式锁Redis在业内解决秒杀等业务场景有非常广的应用&#xff0c;如何设计实现一个分布式锁是解决超卖、一人一单问题非常重要… 分布式锁 分布式锁是控制分布式系统之间同步访问共享资源的…

CRM客户管理系统的作用和四大优势

CRM系统是一种以客户管理为核心&#xff0c;帮助营销、销售、服务部门实现业务自动化&#xff0c;为企业进行客户数据的收集、管理和分析&#xff0c;提高客户体验和留存&#xff0c;实现以客户为中心的管理模式的企业管理工具。那么&#xff0c;企业为什么要使用CRM系统&#…

Javaweb之mybits入门

2.1 Mybatis概述 2.1.1 Mybatis概念 MyBatis 是一款优秀的持久层框架&#xff0c;用于简化 JDBC 开发 MyBatis 本是 Apache 的一个开源项目iBatis, 2010年这个项目由apache software foundation 迁移到了google code&#xff0c;并且改名为MyBatis 。2013年11月迁移到Github …

XSS注入进阶练习篇(三) XSS原型链污染

XSS原型链污染1.原型链的概念1.1 构造函数的缺点1.2 prototype 属性的作用1.3 原型链1.4 constructor属性1.5 prototype和__proto__2. 原型链污染2.1 原型链污染是什么&#xff1f;2.2 原型链污染的条件2.3 原型连污染实例2.3.1 hackit 20182.3.2 challenge-04223.总结1.原型链…

新项目分析

1&#xff1a;数据类型处理 # sep‘\s‘ 这是正则表达式&#xff0c;通过一定规则的表达式来匹配字符串用的 \s 表示空白字符&#xff0c;包括但不限于空格、回车(\r)、换行(\n)、tab或者叫水平制表符(\t)等&#xff0c;这个根据编码格式不同代表的含义也不一样&#xff0c;感…

Codeforces Round #851 (Div. 2) A-E

题目链接&#xff1a;https://codeforces.com/contest/1788 A - One and Two 解题思路&#xff1a;将数组分成两半&#xff0c;两边二一样多就行了。 #include<bits/stdc.h> using namespace std; #define inf 0x3f3f3f3f #define lson l,mid,rt<<1 #define rso…

Kaggle系列之识别狗的品种类别(深度残差网络模型ResNet-34)

我们来到这个比赛页面&#xff1a;https://www.kaggle.com/competitions/dog-breed-identification这个数据集的目标是Determine the breed of a dog in an image(确定图像中狗的品种)我们先下载数据集解压之后来看下(当然不手动解压&#xff0c;也可以使用)&#xff0c;这里我…

记住这12个要点,你也能打造出让HR和技术主管前一亮的前端简历

第一篇章&#xff1a;吸引HR 如果你想在众多简历中脱颖而出&#xff0c;需要注意以下几点&#xff1a; 1、突出你的亮点&#xff1a; 给你的简历一个吸引人的文件命名和头部&#xff0c;突出你的关键技能和经验。 2、采用简洁的语言&#xff1a; 用简单易懂的语言来描述你的…

笔记本cpu温度多少正常?温度过高的4个常见原因

电脑CPU指的是中央处理器&#xff0c;它与电脑运行速度的快慢存在很大关系。如果电脑的处理器温度过高&#xff0c;就会影响我们电脑的运行速度&#xff0c;甚至出现蓝屏、卡顿的情况。 那么&#xff0c;对于电脑来说&#xff0c;笔记本cpu温度多少正常&#xff1f;有什么原因…

macOS Big Sur 11.7.4(20g1220)With OpenCore 0.8.9正式版 and winPE双引导分区原版镜像

原文来源于黑果魏叔官网&#xff0c;转载需注明出处。镜像特点完全由黑果魏叔官方制作&#xff0c;针对各种机型进行默认配置&#xff0c;让黑苹果安装不再困难。系统镜像设置为双引导分区&#xff0c;全面去除clover引导分区&#xff08;如有需要&#xff0c;可以自行直接替换…

KT1025A蓝牙音频芯片_立讯KC认证FCC测试现场整改记录

目录 一、问题说明简介 测试机构立讯反馈&#xff0c;客户寄的样板进行无线KC【韩国】测试不过&#xff0c;体现在如下两点 蓝牙部分接收杂散不过 蓝牙的发射功率偏低 2.1 单独只给蓝牙部分供电的测试图片--OK 2.2 单独给整板供电--但是使用电池供电 2.3 单独给整板供电-…

关于机器人坐标系变换的笔记

ROS TFros中&#xff0c;可以通过TF Tree来进行获取 机器人不同坐标系之间的转换关系&#xff0c;命令如下&#xff1a;rosrun tf tf_echo base_link head_link1意思为&#xff0c;从源坐标系base_link&#xff0c;到目标坐标系head_link1的变换关系&#xff0c;结果如下所示。…

Crafting interpreters 中文翻译,持续修正

本书在线地址 http://craftinginterpreters.com/ 感谢作者 作者用近 4 年的时间持续创作和改进本书&#xff0c;并把其 Web 版本公开在网上。这本纸质书于今年 7 月出版&#xff0c;立刻在 Hacker News 等网络媒介上引起关注和讨论。 书中作者首先定义了一个动态类型的语言 …

棋牌类游戏测试用例怎么写?我敢打赌你绝对不知道

目录 一&#xff0e;登陆 二&#xff0e;大厅 三&#xff0e;小游戏 四&#xff0e;银行功能 五&#xff0e;其他按钮 总结感谢每一个认真阅读我文章的人&#xff01;&#xff01;&#xff01; 重点&#xff1a;配套学习资料和视频教学 一&#xff0e;登陆 1&#xff0e…