首页 > 其他分享 >用Netty实现单机百万TCP长连接

用Netty实现单机百万TCP长连接

时间:2023-01-14 17:24:38浏览次数:39  
标签:Netty 文件 单机 端口 TCP 端口号 连接 服务端

一、模拟单机连接瓶颈
我们知道,通常启动一个服务端会绑定一个端口,例如8000端口,当然客户端连接端口是有限制的,除去最大端口65535和默认的1024端口及以下的端口,就只剩下1024~65535个,再扣除一些常用端口,实际可用端口只有6万个左右。

那么,我们如何实现单机百万连接呢?假设在服务端启动[8000,8100]这100个端口,100×6万就可以实现600万左右的连接,这是TCP的一个基础知识,虽然对于客户端来说是同一个端口号,但是对于服务端来说是不同的端口号,由于TCP是一个私源组概念,也就是说它是由源IP地址、源端口号、目的IP地址和目的端口号确定的,当源IP地址和源端口号是一样的,但是目的端口号不一样,那么最终系统底层会把它当作两条TCP连接来处理,所以这里取巧给服务端开启了100个端口号,这就是单机百万连接的准备工作,如下图所示。

单机1024及以下的端口只能给ROOT保留使用,客户端端口范围为1025~65535,接下来用代码实现单机百万连接的模拟场景。先看服务端类,循环开启[8000-8100)这100个监听端口,等待客户端连接。下面已Netty为例编写代码如下。

案例见:springboot-netty-demo

二、服务器和客户端配置
1. 修改server配置
1.1 突破局部文件句柄的限制
首先在服务端输入命令,看一下单个进程所能支持的最大句柄数。

$ ulimit -n

输入命令后,会出现1024的数字,表示Linux系统中一个进程能够打开的最大文件数,由于开启一个TCP连接就会在Linux系统中对应创建一个文件,所以就是受这个文件的最大文件数限制。
那为什么前面演示的服务端连接数最终定格在870,比1 024小呢?其实是因为除了连接数,还有JVM打开的文件Class类也算作进程内打开的文件,所以,1 024减去JVM打开的文件数剩下的就是TCP所能支持的连接数。接下来想办法突破这个限制,首先在服务器命令行输入以下命令,打开/etc/security/limits.conf文件。

$ vim /etc/security/limits.conf

然后在这个文件末尾加上下面两行代码。

* hard nofile 1000000
* soft nofile 1000000

前面的*表示当前用户,hard和soft分别表示限制和警告限制,nofile表示最大的文件数标识,后面的数字1000 000表示任何用户都能打开100万个文件,这也是操作系统所能支持的最大值,如下图所示。

接下来,输入以下命令。

$ ulimit -n

这时候,我们发现还是1 024,没变,重启服务器。将服务端程序和客户端程序分别重新运行,这时候只需静静地观察连接数的变化,最终连接数停留在137 920,同时抛出了异常,如下所示。

1.2 突破全局文件句柄限制
首先在Linux命令行输入以下命令,可以查看Linux系统所有用户进程所能打开的文件数。

$ cat /proc/sys/fs/file-max
3210650

$ vim /etc/sysctl.conf
fs.file-max=1000000

重启Linux服务器

$ cat /proc/sys/fs/file-max
1000000

2. 修改客户机设置

cat /proc/sys/net/ipv4/ip_local_port_range
值为32768 61000

大概也就是共61000-32768=28232个端可用,单个IP对外只能发送28232个TCP请求。
以管理员身份,把端口的范围区间增到最大

echo "1024 65535"> /proc/sys/net/ipv4/ip_local_port_range

现在有64511个端口可用.

以上做法只是临时,系统下次重启,会还原。 需要做永久修改, vi /etc/sysctl.conf文件,增加一行内容

net.ipv4.ip_local_port_range= 1024 65535
sysctl -p

 

标签:Netty,文件,单机,端口,TCP,端口号,连接,服务端
From: https://www.cnblogs.com/linjiqin/p/17052096.html

相关文章

  • 通过tcpdump抓取lldp/cdp报文判断服务器上联网络配置
    在一般运维工作中,时常要检查服务器的网络配置,例如服务器有几个网卡,有没有做绑定,上联网络情况等。一般可以从以下几个方面判断:查看布线表查看CMDB搜索相关信息通过上行交换机......
  • Netty-核心模块组件-4
    Netty核心模块组件一、Bootstrap、ServerBootstrap1、Bootstrap意思是引导,一个Netty应用通常由一个Bootstrap开始,主要作用是配置整个Netty程序,串联各个组件Netty......
  • 一、tcp三次握手
    (1)首先客户端向服务器端发送一段tcp报文,其中标志位为SYN,表示“请求创建新连接”序列号为sqe=x,随后进入SYN_SEND状态(2)服务器端接受到客户端发送的tcp报文后,接受listen状态,......
  • 49-Docker-网络管理及Compose单机多容器编排
    Docker安装后默认的网络设置Docker服务安装完成之后,默认在每个宿主机会生成一个名称为docker0的网卡其IP地址都是172.17.0.1/16[root@ubuntu2204~]#ipa1:lo:<LOOPBACK,U......
  • prometheus单机存储与victoriametrics远程存储
      prometheus存储系统  Prometheus有着非常高效的时间序列数据存储方法,每个采样数据仅仅占用3.5byte左右空间,上百万条时间序列,30秒间隔,保留60天,大概200多G空间。......
  • Netty03:进阶篇,十万字教程附源码!
    本内容为连载第三篇文章目录​​三.Netty进阶​​​​1.粘包与半包​​​​1.1粘包现象​​​​1.2半包现象​​​​1.3现象分析​​​​1.4解决方案​​​​方法1,短......
  • TCP
    TCP传输控制协议(TCP,TransmissionControlProtocol)是为了在不可靠的互联网络上提供可靠的端到端字节流而专门设计的一个传输协议 一.TCP的客户端和服务端客户端:客户也......
  • linux TCP连接的状态详解以及故障排查
    TCP连接的状态详解以及故障排查  一、TCP网络常用命令了解TCP之前,先了解几个命令:linux查看tcp的状态命令:1)、netstat-nat查看TCP各个状态的数量2)、lso......
  • Redis-单机数据库-服务器
    服务器命令请求的执行过程客户端发送命令请求当客户端与服务器之间的连接套接字因为客户端的写入而变得可读时,服务器将调用命令请求处理器来执行以下操作:读取套接字中......
  • 关于华普物联HP-ERS-T200串口服务器TCP 连接互联网服务器操作案例
    本案例使用“路由侠”模拟互联网服务器,使用“路由侠”生成的外网地址进行测试。    硬件连接 将HP-ERS-T200通过USB转RS232串口线连接到PC的USB口......