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