4台虚拟机实现百万并发

4台虚拟机实现百万并发

服务端和客户端代码见:zcx-create/Millions_of_concurrency: 4台虚拟机实现百万并发 (github.com)

准备了4台虚拟机来模拟百万并发,一台当服务器,三台当客户端,服务器的内存为6G,客户端的内存均为4G

服务端采用了基于epoll的reactor网络模型,开20个端口来提供客户端访问

打印消息为:每1000个连接,打印一条信息以及所用的耗时

先来看最终结果图

在这里插入图片描述

最终跑到了102万个连接,百万并发达成,下面详细讲解可能出现的问题

1、编译错误

直接编译服务端代码

gcc -o server server.c

可能会出现下面的类似错误

在这里插入图片描述

只需要添加编译选项即可,改为下面这样即可编译成功

gcc -mcmodel=medium -o server server.c

2、Too many open files

如图所示:

在这里插入图片描述

其实就是可以打开的文件受到限制,通过ulimit -a选项查看

ulimit -a

在这里插入图片描述

可以看到open files的值为1024

修改方法:ulimit -n 1048576,注意服务端和客户端都要修改

ulimit -n 1048576

在这里插入图片描述

注意:此方法修改open files只是暂时的,在重启之后会重置为1024

3、Cannot assign requested address

如下所示:

在这里插入图片描述

其实就是五元组不够。五元组是什么呢?就是服务器IP、客户端IP、服务器端口、客户端端口、协议。具体来说,这里主要是端口受限,可用端口为1024-65535,在我的虚拟机上,系统默认的可用端口为32768-60999,通过如下指令查看

cat /proc/sys/net/ipv4/ip_local_port_range

在这里插入图片描述

永久修改端口范围的方法

①打开/etc/sysctl.conf文件

vim /etc/sysctl.conf

②在文件中添加或修改:

net.ipv4.ip_local_port_range = 1024 65535

③保存并退出,然后运行

sysctl -p

一般的朋友在上述操作后是可以连接到百万的,如果做不到,说明还有限制没有打开

4、NAT 表溢出问题

因为我的网络是用的NAT,并发连接数过多可能会导致NAT表溢出,从而导致新的连接失败。这个问题比较独特,在运行的时候甚至不会报错,就一直卡在那里,然后显示连接超时,我费了老大劲才搞定

查看NAT表的大小:

sysctl net.netfilter.nf_conntrack_max

在这里插入图片描述

默认限制为65535

可以通过增加NAT表的大小来缓解这一问题,指令如下

sysctl -w net.netfilter.nf_conntrack_max=1048576

5、总结

百万并发对epoll来说是小菜一碟,问题在于如何解除所有系统限制,可以打开的文件数量限制和五元组的限制是所有人都会遇到的问题,NAT表溢出是比较独特的问题,这两份代码是可以跑到百万并发的(在物理机性能不要太低的情况下),每个人系统的独特限制可能会不一样,如果你出现了新的问题,可以在评论区留言讨论!
制,可以打开的文件数量限制和五元组的限制是所有人都会遇到的问题,NAT表溢出是比较独特的问题,这两份代码是可以跑到百万并发的(在物理机性能不要太低的情况下),每个人系统的独特限制可能会不一样,如果你出现了新的问题,可以在评论区留言讨论!

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值