为什么要采用异步编程?
# CPU 的时间观
我们将一个 2.6GHz 的 CPU 拟人化,假设它执行一条命令的时间,它感觉上过了一秒钟。CPU 是计算机的处理核心,也是最宝贵的资源,如果有浪费 CPU 的运行时间,导致其利用率不足,那程序效率必然低下(因为实际上有资源可以使效率更高)。
如上图所示,在千兆网上传输 2KB 数据,CPU 感觉过了 14 个小时,如果是在 10M 的公网上呢?那效率会低百倍!如果在这么长的一段时间内,CPU 只是傻等结果而不能去干其他事情,是不是在浪费 CPU 的青春?
鲁迅说,浪费“CPU”的时间等于谋财害命。而凶手就是程序猿。
CPU 的时间观 - 简书 (opens new window)
# 面临的问题
- 成本问题
如果一个程序不能有效利用一台计算机资源,那必然需要更多的计算机通过运行更多的程序实例来弥补需求缺口。例如我前不久主导重写的项目,使用 Python 异步编程,改版后由原来的 7 台服务器削减至 3 台,成本骤降 57%。一台 AWS m4.xlarge 型通用服务器按需付费实例一年价格约 1.2 万人民币。
- 效率问题
如果不在乎钱的消耗,那也会在意效率问题。当服务器数量堆叠到一定规模后,如果不改进软件架构和实现,加机器是徒劳,而且运维成本会骤然增加。比如别人家的电商平台支持 6000 单/秒支付,而自家在下单量才支撑 2000 单/秒,在双十一这种活动的时候,钱送上门也赚不到。
- C10k/C10M 挑战
C10k(concurrently handling 10k connections)是一个在 1999 年被提出来的技术挑战,如何在一颗 1GHz CPU,2G 内存,1gbps 网络环境下,让单台服务器同时为 1 万个客户端提供 FTP 服务。而到了 2010 年后,随着硬件技术的发展,这个问题被延伸为 C10M,即如何利用 8 核心 CPU,64G 内存,在 10gbps 的网络上保持 1000 万并发连接,或是每秒钟处理 100 万的连接。(两种类型的计算机资源在各自的时代都约为 1200 美元)
成本和效率问题是从企业经营角度讲,C10k/C10M 问题则是从技术角度出发挑战软硬件极限。C10k/C10M 问题得解,成本问题和效率问题迎刃而解。
# 解决方案
《约束理论与企业优化》中指出:“除了瓶颈之外,任何改进都是幻觉。”
CPU 告诉我们,它自己很快,而上下文切换慢、内存读数据慢、磁盘寻址与取数据慢、网络传输慢……总之,离开 CPU 后的一切,除了一级高速缓存,都很慢。我们观察计算机的组成可以知道,主要由运算器、控制器、存储器、输入设备、输出设备五部分组成。运算器和控制器主要集成在 CPU 中,除此之外全是 I/O,包括读写内存、读写磁盘、读写网卡全都是 I/O。I/O 成了最大的瓶颈。
异步程序可以提高效率,而最大的瓶颈在 I/O,业界诞生的解决方案没出意料:异步 I/O 吧,异步 I/O 吧,异步 I/O 吧吧!