系统设计估算方法以及必知的那些数据
当系统设计师拿到需求,开始做系统设计,评估系统的负载、吞吐能力的时候,是需要有个大致的估算过程的。有经验的系统设计师会根据以往的经验,估算出一个范围。但这个数字真的只是拍脑袋得到的么?当然不是,其实每个操作都是有一个数值,拿到这些数值,分析、分解现有业务的操作就可以估算出这个系统需要设计的负载和吞吐能力。
一些数字
操作 | 时间(nano sec) |
---|---|
L1 cache reference | 0.5 |
Branch mispredict | 5 |
L2 cache reference | 7 |
Mutex lock/unlock | 25 |
Main memory reference | 100 |
Compress 1K bytes with Zippy | 3000 |
Send 2K bytes over 1 Gbps network | 20000 |
Read 1 MB sequentially from memory | 250000 |
Round trip within same datacenter | 500000 |
Disk seek | 10000000 |
Read 1 MB sequentially from disk | 20000000 |
Send packet CA->Netherlands->CA | 150000000 |
数据来源: Jeff Dean分享
之前我们在做系统设计的时候总是在说,CPU要快于内存,内存的访问要快于硬盘存储,硬盘存储要快于网络访问。
上面的说法都是感性认识的,那么具体到数量级(注意是数量级,因为每台机器的运算能力会跟固定的硬件配置相关,如果脱离硬件谈具体数字是没有意义的)。 CPU的访问速度(7 nano seconds)是内存(100 nano seconds)的10倍,内存的访问(100 nano seconds)是硬盘访问(10000000)的 10w倍。
估算方法
这里谈到了估算系统负载的方法,现在通行的方法有下面两种:
- 信封背面估算法(Back of envelop calculation)
估算法其实就是一开篇提到的根据上面提到的这些数据估算出一个数值(当然你要清楚这个数字并不是准确的数字,而是一个数量级参考范围) - 微基准测试(Microbenchmarking)
基准测试更多地被使用在系统优化的过程中,我们知道任何优化不做基准测试都是耍流氓,没有数据支持,优化和设计的过程就犹如在伸手不见五指的夜晚走夜路。
有了这两个强大的系统设计工具我们就可以放手做系统设计了,首先要培养估算的能力,找到系统设计的量化(至少是数量级)感觉;然后通过基准测试不断深化对系统设计认识。
更多内容参看这里 numbers everyone should know