如需转载,请根据 知识共享署名-非商业性使用-相同方式共享 4.0 国际许可协议 许可,附上本文作者及链接。
本文作者: 陈进涛
作者昵称: 江上轻烟
本文链接: https://zhizhi123.com/2021/02/24/high-concurrency-1/
本篇为高并发程序设计系列第一篇,主要内容为:
- 高并发程序设计相关概念
- 高并发与高吞吐率讨论
一:基本概念
1.并发与并行
并发(concurrency):
逻辑上具备同时处理多个任务的能力
并行(parallesim):
物理上在同一时刻执行多个并发任务
我们通常会说程序是并发设计的,也就是说它允许多个任务同时执行,但实际上并不一定真在同一时刻发生。在单核处理器上,它们能以间隔方式切换执行。而并行则依赖多核处理器等物理设备,让多个任务真正在同一时刻执行,它代表了当前程序运行状态。简单点说,并行是并发设计的理想执行模式。《Go语言学习笔记》
并发示例:
多道程序设计中,CPU划分时间片,轮流执行每个请求任务,时间片到期后,换到下一个

并行示例:
在多核服务器上,每个CPU内核执行一个任务,是真正的并行

2.吞吐率
吞吐率:
单位时间内网络上传输的数据量,也可以指单位时间内处理客户请求数量。它是衡量网络性能的重要指标。通常情况下,吞吐率 可以用“字节数/秒”(byte/s) 来衡量。当然你也可以用 “请求数/秒”(RPS:req/s) 和 “页面数/秒” (PPS:page/s)来衡量。
其它相关概念:
QPS:
每秒查询数(QPS)是衡量信息检索系统(例如搜索引擎或数据库)在一秒钟内接收到的搜索流量的常用量度。该术语在任何请求-响应系统中都得到更广泛的使用,更正确地称为每秒请求数(RPS)。
高流量的系统必须注意其QPS,才能知道何时扩展系统以处理更多负载。
TPS:
在非常普通的意义上,术语每秒事务是指每秒由某些实体执行的原子动作的数量。从更严格的角度来看,DBMS供应商和用户社区通常使用该术语来表示每秒执行的数据库事务数。
最近,该术语已用于描述加密货币的交易率,例如运行比特币 区块链的分布式网络。能够适应实际交易量的交易速率的发展是加密货币技术研究的重要领域。
举例:
假设 https://zhizhi123.com 每个请求的latency为100ms,服务器总共有40个workers处理客户请求,理论吞吐量上限为:1000/100*40 = 400rps,理论每日处理动态请求上限3456万。
3.I/O
I/O(英语:Input/Output),即输入/输出,通常指数据在存储器(内部和外部)或其他周边设备之间的输入和输出,是信息处理系统(例如计算机)与外部世界(可能是人类或另一信息处理系统)之间的通信。输入是系统接收的信号或数据,输出则是从其发送的信号或数据。
常见I/O类型:
磁盘I/O、网络I/O
4.CPU密集型与IO密集型应用

“图2-38中有一件值得注意的事,即某些进程(图2-38a的进程)花费了绝大多数时间在计算上,而其他进程(图2-38b的进程)则在等待I/O上花费了绝大多数时间。前者称为计算密集型(compute-bound),后者称为I/O密集型(I/O-bound)。典型的计算密集型进程具有较长时间的CPU集中使用和较小频度的I/O等待。I/O密集型进程具有较短时间的CPU集中使用和频繁的I/O等待。它是I/O类的,因为这种进程在I/O请求之间较少进行计算,并不是因为它们有特别长的I/O请求。在I/O开始后无论处理数据是多还是少,它们都花费同样的时间提出硬件请求读取磁盘块。
“有必要指出,随着CPU变得越来越快,更多的进程倾向为I/O密集型。这种现象之所以发生是因为CPU的改进比磁盘的改进快得多,其结果是,未来对I/O密集型进程的调度处理似乎更为重要。这里的基本思想是,如果需要运行I/O密集型进程,那么就应该让它尽快得到机会,以便发出磁盘请求并保持磁盘始终忙碌。”
摘录来自: Andrews Tanenbaum. “现代操作系统(原书第3版) (计算机科学丛书)。
二:高并发与高吞吐率
问题:并发真能提高吞吐量吗?
假设每个请求执行100ms,顺序执行10个请求共需要1s
单核服务器并发处理10个请求,假设平均分配时间片 10ms,请求1到请求10将在910ms到1000ms间执行完毕。吞吐量没有任何提高。并发越多,所有请求都变得非常缓慢。(考虑到进程切换开销,吞吐量还会下降,需要超过1s才能执行完毕)。
大多数应用都是IO密集型:
执行请求100ms当中,可能有80ms花在IO上,只有 20ms消耗CPU时钟周期,下图二情况下,请求1到请求10 将在190ms到280ms间执行完毕,吞吐量极大提高。
图一:

图二(假设每个请求的I/O处理都在最后80ms处理):

三:本篇总结
CPU密集型的应用
在单核上并发执行多个请求,不能提高吞吐量(除非你是想从系统争夺更多CPU时间片,假设该机器上跑有其它服务),由于进程切换的开销,吞吐量反而会下降。
只有多核并行运算,才能有效提高吞吐量
IO密集型的应用
- 由于请求过程中,很多时间都是外部IO操作,不占用CPU,所以并发执行可以有效提高系统吞吐量
参考资料:
1.《Go语言学习笔记》
2.《现代操作系统》
4.维基百科
-------------本文结束,感谢您的阅读-------------
本文链接: https://zhizhi123.com/2021/02/24/high-concurrency-1/
版权声明: 本作品采用 署名—非商业性使用—相同方式共享 4.0 协议国际版 进行许可。转载请注明出处!
