epoll_C100K百万级连接

使用epoll假定有一百万个设备同时接入服务器

能够同时承载百万个设备连接(只讨论服务器端的连接),不断地建立连接模拟真实连接

问题一:(连接数量到1000多上不去)

ulimit -a 查看系统设置
//open files (-n) 1024 表示一个进程只允许创建1024个fd
//修改
ulimit -n 1048576  //2^20

问题二(段错误)

//存fd与对应数据的数组不够大,改大一点,能够多承载一些,说明数组大小有问题
//可以改成1048576

问题三(不能分配请求地址,模拟建立连接端错误,到63999个连接时)

第一种

一个socket ----> (fd  +  tcb)
tcb ---> (原目ip+原目port+协议)  
port-> unsigned short 2个字节--->16bit max=65535
系统port0-1024固定 所以原端口不足

解法一:原ip做多,多准备几个机器,更改client端
解法二:目的port做多(除了2048增加几个),更改sever端

第二种

sudo vim etc/sysctl.conf
可用端口范围有限制
增加一条 net.ipv4.ip_local_port_range = 1024 65535

问题四(开辟存数据的数组太大了) 1048576个加上buffer的大小大于2G 提示出错

struct 里面的wbuffer和rbuffer的值改小一点 
修改 #define BUFFER_LENGTH 512  //(1024->512)

问题五(client模拟的连接不能增长了)

sudo vim etc/sysctl.conf
增加fs.file-max = 1048576
sudo sysctl -p //生效

问题六(server端直接down,退出了,约90万个连接)(代码能改的已经不多了)

tcp连接的内存问题,内存占满会有回收,或者直接杀死程序的风险
sudo vim etc/sysctl.conf
//有关内核空间的tcp协议栈的缓存
net.ipv4.tcp_mem  262144(1G)524288(2G)786432(3G)//对应的单位是页(页表)1-2G不优化2-3G优化回收,大于3G直接down表示内存超过多少要开始回收
net.ipv4.tcp_wmem 1024 1024 2048  //min 默认值 max
net.ipv4.tcp_rmem 1024 1024 2048

问题七(client端虚拟机的内存不够了)

posted @   流光最璀璨i  阅读(4)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 全程不用写代码,我用AI程序员写了一个飞机大战
· DeepSeek 开源周回顾「GitHub 热点速览」
· 记一次.NET内存居高不下排查解决与启示
· 物流快递公司核心技术能力-地址解析分单基础技术分享
· .NET 10首个预览版发布:重大改进与新特性概览!
点击右上角即可分享
微信分享提示