文章目录
先膜拜王博经大佬
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就是零拷贝的意思