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
系统port:0-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 @ 2025-02-04 16:21  流光最璀璨i  阅读(5)  评论(0编辑  收藏  举报