1.文档阅读
网络编程原理:一个字符的互联网之旅_穿素白衫的少年的博客-CSDN博客
2021-03-22 - 数据 - 系统/程序/服务/网络 - 性能数据/性能指标收集_穿素白衫的少年的博客-CSDN博客
高性能 - 单服务器高性能模式[网络模型]及性能对比 - 学习/实践_穿素白衫的少年的博客-CSDN博客
计算机网络 - 网络I/O模型 - 学习/实践_穿素白衫的少年的博客-CSDN博客
https://blog.csdn.net/william_n/article/details/124629946
2.整理输出 一定要结合下面这篇文章以及其中的补充部分,思考汇总 高性能 - 单服务器高性能模式[网络模型]及性能对比 - 学习/实践_穿素白衫的少年的博客-CSDN博客 问题目录 1. 连接,请求,进程/线程之间的关系 以及连接分为半连接,就绪连接,活动连接。?
供信息汇总:
18 | 单服务器高性能模式:PPC与TPC-极客时间
网友-咬尾巴的蛇
很感谢分享,我想问下 就是我开一个tomcat,支持tcp请求,然后什么都不做处理,同时有几百个请求是后面连接就进不来了吗,我是新手才开始架构这块,希望能帮忙解释下,非常感谢
作者回复: tomcat应该不是ppc的模式,如果你找一个ppc的服务器,连接满了后新的连接进不来,但旧的连接发送请求是没问题的
个人问题:
后面的连接进不来,是否会出现报错,是由服务端来决定如何处理的?TBD
MySQL似乎会报错: To many connections
确实是MySQL本身报错,还是由PDO扩展进行的报错?TBD
网友-互联网老辛
单台数据库服务器可以支撑多少并发?单台nginx 可以支撑多少呢
作者回复: nginx反向代理可以达到3万以上,具体需要根据业务和场景测试
个人补充问题:
请问,这个并发是指并发连接还是并发请求呢。 另外,关于连接超时,这个通常是由谁来做控制呢?
网友-熊猫酒仙
单方close和双方close应该是全双工与半双工的区别,连接仍然还存在的。 ppc/tpc比较适合系统中担当路由器或容器角色的部分,像nginx,甚至像mongodb集群也有router。 感觉一些部署容器的线程池,应该属于tpc范畴!
作者回复: close是减少文件描述符引用计数,当socket的文件描述符引用计数为0时,操作系统底层会执行连接关闭操作,全双工和半双工是shutdown操作。 路由器恰恰不适合ppc/tpc,nginx也不是这种模式
网友-盘尼西林
怎么理解常量连接 海量请求。 如果请求多的话,连接还会是常量么?
作者回复:
常量连接海量请求:100个连接,每个连接每秒发10000个请求,例如数据库
海量连接常量请求:100000个连接,每个连接每秒发1个请求,例如nginx
天外来客
主要考察连接数,因单机的fd 是有限的,可根据并发连接数考虑是否部署集群!
作者回复: fd不是关键,关键是进程或者线程数量太多,所占资源和上下文切换很耗费性能
网友-siwei
同一页面发起多次ajax请求是一个连接还是多个连接?
作者回复: ajax发的是HTTP请求,所以你要看你具体的HTTP协议版本是1.0还是1.1还是HTTP/2
个人补充:
持久连接在 HTTP/1.1 中是默认开启的,所以你不需要专门为了持久连接去 HTTP 请求头设置信息,如果你不想要采用持久连接,可以在 HTTP 请求头中加上Connection: close。目前浏览器中对于同一个域名,默认允许同时建立 6 个 TCP 持久连接。
极客时间,使用的http协议基本都是1.1 和 2.0, 打开开发者工具,查看network就可以知道,另外,也可以看到很多请求走的是统一连接,从Connection ID就可以知道。
插入补充:
这里的连接是基于TCP传输协议,如果是UDP协议,没有连接的过程,而是直接传输数据,不保证可靠输出。具体要对比TCP与UDP的区别。
29 | HTTP/1:HTTP性能优化-极客时间
30|HTTP/2:如何提升网络速度?-极客时间
31|HTTP/3:甩掉TCP、TLS 的包袱,构建高效网络-极客时间
一段话总结
TBD
2. 网络模型有哪些?出现的原因?解决的问题?
计算机网络 - 网络I/O模型 - 学习/实践_穿素白衫的少年的博客-CSDN博客
18 | 单服务器高性能模式:PPC与TPC-极客时间
临时插入,供参考:
DFighting
看大家的评论,对aio、bio和nio讨论的比较多,我也来凑个数: 请求到达服务器到最终处理完毕可以分为3个过程,接受请求+系统处理+结果返回,其中需要切换线程写作的是请求接受后,在系统处理这段时间,连接线程如何做: bio:阻塞调用等待系统处理完毕 nio:不阻塞调用,不断查询结果,其实从结果上来看依然是阻塞等待的一种,只不过是主动点 io复用:一个连接同时处理多个io请求,本质上还是阻塞,不过由多个线程同时阻塞等待转为一个线程阻塞,等待多个io调用结果 aio:连接请求和处理请求完全异步,连接交给系统处理以后,我就可以去处理下一个连接,等待系统处理结果完毕以后,发送消息或者信号异步发送结果返回 其实从本质以上来看,阻塞和非阻塞这两种性能差异感觉不大,多路复用虽然也是阻塞但是它复用了阻塞线程,提高了性能。异步io才是真正实现了连接线程和系统处理线程的并发执行。 以上是我自己的了解,如有不正确的地方,欢迎指正和探讨
作者回复: 异步io性能相比io复用没有明显优势,但操作系统设计比较复杂,目前来看:Linux上主流的是epoll io复用,windows上是IOCP的异步io
19 | 单服务器高性能模式:Reactor与Proactor-极客时间
最终 Reactor 模式有这三种典型的实现方案:
单 Reactor 单进程 / 线程。
单 Reactor 多线程。
多 Reactor 多进程 / 线程。
以上方案具体选择进程还是线程,更多地是和编程语言及平台相关。
例如,Java 语言一般使用线程(例如,Netty),C 语言使用进程和线程都可以。例如,Nginx 使用进程,Memcache 使用线程。
。。。
单 Reactor 单进程的方案在实践中应用场景不多,只适用于业务处理非常快速的场景,目前比较著名的开源软件中使用单 Reactor 单进程的是 Redis。
需要注意的是,C 语言编写系统的一般使用单 Reactor 单进程,因为没有必要在进程中再创建线程;而 Java 语言编写的一般使用单 Reactor 单线程,因为 Java 虚拟机是一个进程,虚拟机中有很多线程,业务线程只是其中的一个线程而已。
一段话总结:
TBD
3.?C10K
https://blog.csdn.net/william_n/article/details/124629946
一段话总结:
TBD
4. MySQL, Memcached, Redis, Apache,?Nginx,ES,??Kafka, RocketMQ, RabitMQ 是如何处理连接问题的,以及各自采用的网络模型是怎样的,考虑的原因,优缺点? -- 待汇总为表格 临时插入: 18 | 单服务器高性能模式:PPC与TPC-极客时间 网友-Hanson 如果针对自内部系统,是否使用长链接性能损耗较低,毕竟频繁建链拆链性能损耗还是不小的,尤其是TLS的情况下 作者回复: 内部系统长连接多,例如各种中间件,数据库. 网友-馒头 理论上可以理解,如果有实际场景分析配合一起讲解就完美啦 作者回复: 可以看看apache服务器不同运行模式 19 | 单服务器高性能模式:Reactor与Proactor-极客时间 单 Reactor 单进程的方案在实践中应用场景不多,只适用于业务处理非常快速的场景,目前比较著名的开源软件中使用单 Reactor 单进程的是 Redis。 prethread确实可以,mysql就是这种模式 目前著名的开源系统 Nginx 采用的是多 Reactor 多进程,采用多 Reactor 多线程的实现有 Memcache 和 Netty。 我多说一句,Nginx 采用的是多 Reactor 多进程的模式,但方案与标准的多 Reactor 多进程有差异。具体差异表现为主进程中仅仅创建了监听端口,并没有创建 mainReactor 来“accept”连接,而是由子进程的 Reactor 来“accept”连接,通过锁来控制一次只有一个子进程进行“accept”,子进程“accept”新连接后就放到自己的 Reactor 进行处理,不会再分配给其他子进程,更多细节请查阅相关资料或阅读 Nginx 源码。
产品/组件 | 网络IO模型 | 优点 | 缺点 | 补充 | MySQL | prethread | | | | Memcached | 多Reactor 多线程 | | | | Redis | 单Reactor 单线程 | | | 因为基于内存操作,单次操作非常快,这作为前提,才可以使用这种方式,否则很难达到高性能。 | Apache | | | | | Nginx | 多Reactor 多进程 | | | Nginx 采用的是多 Reactor 多进程的模式,但方案与标准的多 Reactor 多进程有差异。具体差异表现为主进程中仅仅创建了监听端口,并没有创建 mainReactor 来“accept”连接,而是由子进程的 Reactor 来“accept”连接,通过锁来控制一次只有一个子进程进行“accept”,子进程“accept”新连接后就放到自己的 Reactor 进行处理,不会再分配给其他子进程,更多细节请查阅相关资料或阅读 Nginx 源码。 | ES | | | | | Kafka | | | | | RocketMQ | | | | | RabitMQ | | | | | 后续补充 ... |