实现单机的百万连接,瓶颈有以下几点:
1、如何模拟百万连接
3、突破全局文件句柄的限制
在linux系统里面,单个进程打开的句柄数是非常有限的,一条TCP连接就对应一个文件句柄,而对于我们应用程序来说,一个服务端默认建立的连接数是有限制的。
下面通过优化要突破这个连接数。
优化
1、局部文件句柄限制
一个jvm进程最大能够打开的文件数.png
修改65535的这个限制
vi /etc/security/limits.conf
在文件末尾添加两行
*hard nofile 1000000
soft nofile 1000000
soft和hard为两种限制方式,其中soft表示警告的限制,hard表示真正限制,nofile表示打开的最大文件数。整体表示任何用户一个进程能够打开1000000个文件。注意语句签名有
号 表示任何用户
shutdown -r now 重启linux
再次查看
已经修改生效了。
测试
最大连接数10万多.png
2、突破全局文件句柄的限制
cat /proc/sys/fs/file-max
file-max 表示在linux 中最终所有x线程能够打开的最大文件数
修改这个最大值:
sudo vi /etc/sysctl.conf
在文件的末尾添加 fs.file-max=1000000
然后让文件生效 sudo sysctl -p
这个时候再查看一下全局最大文件句柄的数已经变成1000000了
测试
最大连接数36万多.png
注: 测试的服务器型号
cpu 相关配置
linux的TCP连接数量最大不能超过65535个,这种说法是错误的。
一、TCP最大连接数和端口数量没有必然联系
TCP连接是服务器IP端口和客户端IP端口组成的,对于服务器而言,一般一个服务器只监听一个端口,而客户端是可以不计其数的。一个连接由一个5元组决定(protocol,local IP,local port,remote ip,remote port),对于TCP,protocol固定是TCP,还有四个元素。对于服务器来说,local port一般是固定的,比如HTTP(80),但是remote ip和remote port没有限制。也就是说,可以有百万千万的并发。如果并发量能达到百万千万量级,那么不会只有一个服务器,一般都会是一个服务集群。
二、TCP连接数是和内存正成比的
客户端和服务器建立的每个TCP连接都会占用服务器内存,所以最大TCP连接数和内存成正比。简单估算为最大内存除以单TCP连接占用的最小内存。
三、linux对tcp数量限制是为了文件管理方便
1、Linux *** 作系统中,一切都是文件。所以每个TCP连接,都会打开一个文件。为此Linux *** 作系统限制了每个用户能打开的文件数量,通过ulimit -n 查看。当然,我们也可以对此进行修改,修改方式如下:
vi /etc/security/limits.conf文件,在文件中添加如下行(限制修改为10240):
speng soft nofile 10240
speng hard nofile 10240
2、Linux *** 作系统对所有用户最大能打开文件的限制:cat /proc/sys/fs/file-max。
3.网络核心模块对tcp连接的限制(最大不能超过65535)。
4、防火墙管理策略也会对tcp连接数量进行限制。
基于以上的原因,在Linux *** 作系统中,对TCP连接数量的限制依次有:端口数量限制,网络核心限制,最大文件数量限制(因为每建立一个连接就要打开一个文件),防火墙限制,用户打开文件限制。但并不存在65535这个数量限制。
使用起来很清晰,首先要调用epoll_create建立一个epoll对象。参数size是内核保证能够正确处理的最大句柄数,多于这个最大数时内核可不保证效果。epoll_ctl可以 *** 作上面建立的epoll,例如,将刚建立的socket加入到epoll中让其监控,或者把 epoll欢迎分享,转载请注明来源:内存溢出
评论列表(0条)