AlexiaChen.github.io icon indicating copy to clipboard operation
AlexiaChen.github.io copied to clipboard

每个程序员都应该知道的数字

Open AlexiaChen opened this issue 5 years ago • 0 comments

前言

这篇也主要是收集一些Google大佬的slide整理,其中第二篇是Jeff Dean的。标题就意味着,这些大概的数值在你构造高性能的系统的时候,应该大致在你头脑中有个概念。

正文

Google AppEngine number

写的代价是很昂贵的

  • 数据存储是事务型的:写需要磁盘访问
  • 磁盘访问意味着磁盘寻道
  • 拇指法则(经验规则):一次磁盘寻道就往往浪费了10 ms(毫秒)
  • 简单的计算一下: 1s / 10ms = 100 seeks / sec, 也就是1秒磁盘最大寻道次数在100次

所以,根据以上法则,要时刻考虑你的数据大小和数据结构,并且要以批量的思想来做,批量写和批量读。

读的代价是很便宜(cheap)的

  • 读是不需要事务化的,它仅仅跟一致性有关。
  • 数据从磁盘中读一次,一般就轻而易举被缓存了(缓存在内存了)。
  • 所以,随之而后的读,都是直接从内存中读取的。
  • 拇指法则(经验规则):1MB的数据从内存中只需要250 us(微秒)
  • 简单的计算一下:1s / 250usec = 4GB/sec 也就是1秒中最大能读4GB的数据

Numbers Miscellaneous

  • CPU L1缓存的访问引用是0.5 ns
  • CPU分支预测失败代价是5ns
  • CPU L2缓存的访问引用是7ns
  • Mutex的lock或unlock操作代价是100ns(所以加锁解锁的操作不耗费时间,锁的大量竞争才耗费,思路降低锁粒度,每个锁对象只保护一小部分数据)
  • 主内存的访问引用代价是100ns
  • 用Zippy压缩1K字节大概是在10000ns(0.01ms)
  • 通过千兆网卡发送2K字节数据代价是20000ns(0.02ms)
  • 从内存中顺序(内存地址连续)读1M的数据代价是250000ns(0.25ms)
  • 在一个数据中心(高性能局域网)内数据往返的代价时间是500000ns(0.5ms)
  • 一次磁盘寻道在10000000ns(10ms)
  • 从网络中顺序(网络字节流顺序)读取1M数据要10000000ns(10ms)
  • 从磁盘中顺序(文件字节流顺序)读取1M数据要30000000ns(30ms)
  • 从美国加州从发一个Packet(网络IP层的Packet包)到荷兰再回到加州的往返时间为150000000ns(150ms)

The lessons

  • 写的代价一般是读的40倍
  • 全局共享数据是非常昂贵的,这一般是分布式系统的基本单元的瓶颈,它是性能杀手,它让事务变成串行和缓慢
  • 为可扩展的写行为作架构
  • 优化比较缓慢的写行为
  • 优化的更加广泛些,就是尽可能让写行为并行化

参考

  • http://highscalability.com/numbers-everyone-should-know

AlexiaChen avatar Nov 12 '19 03:11 AlexiaChen