番外9-reactor于单台服务器百万并发的学习


先膜拜王博经大佬

1.服务器的并发量:

  • 1)服务器同时能够承载的客户端数量,这个选项才是并发量
  • 2)服务器处理客户端请求的数量,这个答案没什么意义,没时间限制
  • 3)单位时间内,能够处理请求数量,这是每秒的吞吐量,QPS

2.服务器的并发量条件


里面能够承载这些fd是最基本的条件,其他条件:

  • 1)每秒5W以上的相应请求
  • 2)对数据库的操作
  • 3)操作的操作,如日志
  • 4)CPU占有率(不能超过百分之60
  • 5)内存的占有率(不能超过百分之80

3.reactor怎么样才能同时承载100W的fd呢?

docker是干嘛的?
王博及的为什么能够100W并发?
mongoDB一般什么场景会用?

1)第一个问题:linux操作系统的限制,

  • 跑到1024的时候会上不去,open files 限制了每个进程能打开fd的最大值为1048576,104w
  • 在这里插入图片描述

2) 可以修改限定fd的值

  • ①vim /etc/security/limits.conf
  • ②设置fd的最大值
  • vim /etc/sysctl.conf
  • 改完后,用下面的指令刷新到系统
  • sudo sysctl -p 看fs.file-max是设定的最大值
    在这里插入图片描述
  • 看fd的上限
  • cat /proc/sys/fs/file-max

在这里插入图片描述

3)端口的问题,限制fd只能到达4W附近

1)客户端端口问题还是服务器端口问题?
  • 我们send的时候,参数包括fd,通过fd找到五元组才能发送数据
  • 现在服务器listen多个端口
2)解决方案:
  • 服务器现在同时listen多个端口,客户端同时发包多个端口,现在监听5个端口,估计可以达到并发量25W,

在这里插入图片描述

3) 第三个问题:但是达到65535,现在服务器不动了,现在客户端也不动了

在这里插入图片描述

  • 现在不是代码的问题,现在客户端服务器进如了阻塞的状态
  • 原因猜测
  • ①客户端的随机端口,满了1024到65535的端口满了
  • ②打开的fd到达了上限
  • ③看端口限制,但是监听了5个端口,每个端口3w到6w,可见不是端口的问题
  • 命令:cat /proc/sys/net/ipv4/ip_local_port_range
    在这里插入图片描述

真正原因:
1.这个不是服务器的问题
2.sudo sysctl -p可以看到
是nf_conntrack_max限制到了65535,需要加载一个模块,加载命令:sudo modprobe ip_conntrack

4)第四个问题:如何将客户端,每一1000个链接的耗时变短?(未解决)

背景:每3微妙创建一个连接
目的:让服务器每秒接入的数量更多
方法:多个accept()
解决方法:多个进程或线程accept

  • ①多个accept放在一个线程
  • ②多个accept放在不同的线程,每一个线程listen,和多进程的区别在于:
  • 多进程的资源不需要加锁

  • 多进程的数量可以做到更多,进程fd的上限比多线程还要多

  • ③多个accept放在不同的进程 ,nginx做法:适用于IO请求之间是没有联系的,所以做法③更适合用于降低客户端连接的延迟
5)第五个问题:客户端不能分配地址,卡在28W

现在端口开了50个
线上:向上的环境客户端的IP地址是不一样的,所以一个端口是可以做得到的
局域网内做的话:必须准备开多个端口,无解做不了
fd->五元组:sip dip sport dport proto
2 , 1 , 6w , 5 , 1
在这里插入图片描述

6)关于网络IO操作
1) 操作:

1…accept
2.send
3.recv
4.close()

2)网络IO服务模型(10种)

在这里插入图片描述

C10K–> C1000K–>C10M
C10K表示1W并发
影响服务器并发的因素
cpu,内存,网络,操作系统,应用程序、

  • ①linux引入了epoll解决了C10K的问题,epoll_ctl把监听到的时间加入到内核的红黑树,一旦哪个IO活跃了节点,就加入就绪队列(并没有从红黑树移除),而epoll_wait就是将就绪队列的节点copy过来,不需要全部copy出来,只需要copy就绪的
  • 之前是select和poll,epoll没有用到共享内存
  • CPU不超过百分之60,
  • ②现在到了C1000K,百万计的并发
  • ③怎么达到千万级并发?
  • 用户态协议栈
  • 第一个块网卡,第二个块协议栈,第三个块应用程序
  • 首先通过外网接受数据到达网卡,copy到协议栈里面,再从协议栈copy到应用程序上面,send的过程正好相反,千万级并发无论大小,必须经过两次copy,所以在这个过程,减少协议栈的copy,直接从网卡虚拟到内存种,在内存中操作,少了协议栈,所以引出了用户态协议栈的东西,减少了copy的作用,放在用户层面上操作,这个copy就是零拷贝的意思
  • 在这里插入图片描述
  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值