人生就是一列开往坟墓的列车, 路途上有很多站口, 列车上没有一个人可以由始至终陪着你走完, 包括亲人,友人,爱人。 你会看到来来往往,上上下下的人。 如果幸运,会有人陪你走过一段, 当这个人要下车时候, 即使不舍得, 也该心存感激, 然后挥手道别, 因为她就算不是你生命中最重要的人,但她却一定是让你在生命中成长的人~~ 每日签到 收藏本站
登陆 / 注册 搜索

USERCENTER


查看:1306   回复: 3

一个CPU的自诉——这个世界好慢啊啊啊

  [复制链接]
发新帖
跳转到指定楼层
楼主
仗剑天涯吾是土豪 发表于 2018-2-15 16:09:02 | 只看该作者 |只看大图 回帖奖励 |倒序浏览 |阅读模式

今生相逢便是缘分,何苦去怨恨,何苦去仇视。

1,简介:
; h3 j* s' q2 C- A8 [3 e8 h
& s3 ]/ K7 d! t) R4 ]( {    经常听到有人说磁盘很慢、网络很卡,这都是站在人类的感知维度去表述的,比如拷贝一个文件到硬盘需要几分钟到几十分钟,够我去吃个饭啦;而从网络下载一部电影,有时候需要几个小时,我都可以睡一觉了。
$ y9 k+ f7 h. ^/ ~7 n4 k& Z: Y- ?+ K' d# G+ ^( _4 H
    最为我们熟知的关于计算机不同组件速度差异的图表,是下面这种金字塔形式:越往上速度越快,容量越小,而价格越高。这张图只是给了我们一个直观地感觉,并没有对各个速度和性能做出量化的说明和解释。而实际上,不同层级之间的差异要比这张图大的多。, T9 p( Y; H3 L5 t; k, P8 k
) f6 N# c* r. v9 w5 @$ i! J* T
    这篇文章就让你站在 CPU 的角度看这个世界,说说到底它们有多慢。# R7 }) P0 H# y4 I2 q8 O* `

# B0 ~/ u' [8 |5 D! f
 500004956.jpg 一个CPU的自诉——这个世界好慢啊啊啊
) s) U  e8 k8 v: u
    希望你看到看完这篇文章能明白两件事情:磁盘和网络真的很慢,性能优化是个复杂的系统性的活。
- [% X: y2 r4 m, X& }0 \$ O0 I0 d' t5 i3 H2 _3 {
    注:所有的数据都是来自 这个地址。所有的数据会因为机器配置不同,或者硬件的更新而有出入,但是不影响我们直觉的感受。如果对这些数据比较感兴趣,这个网址 给出了不同年份一些指标的数值。* q  j& Y+ H9 r0 u- i+ k
6 W7 [8 n7 E' d4 d* w
2,数据" G7 U  C6 f. P: `
1 `) b% I0 Z3 s# R( I- O2 D2 {% |
    先来看看 CPU 的速度,就拿我的电脑来说,主频是 2.6G,也就是说每秒可以执行 2.6*10^9 个指令,每个指令只需要 0.38ns(现在很多个人计算机的主频要比这个高,配置比较高的能达到 3.0G+)。我们把这个时间当做基本单位 1s,因为 1s 大概是人类能感知的最小时间单位。
5 }" _7 f8 k1 O3 p$ V; g
* p6 W, l3 L' u1 w; _/ y) E* b8 S2 G    一级缓存读取时间为 0.5ns,换算成人类时间大约是 1.3s,大约一次或者两次心跳的时间。这里能看出缓存的重要性,因为它的速度可以赶上 CPU,程序本身的 locality 特性加上指令层级上的优化,cache 访问的命中率很高,这最终能极大提高效率。6 O7 Z$ _4 d0 E+ l# n) L. w' m
3 q/ B% |2 f1 ]: _
    分支预测错误需要耗时 5ns,换算成人类时间大约是 13s,这个就有点久了,所以你会看到很多文章分析如何优化代码来降低分支预测的几率,比如这个得分非常高的 stackoverflow 问题。
' v4 w+ f: W/ }& }4 \
0 M, u  ~3 i5 h" {    二级缓存时间就比较久了,大约在 7ns,换算成人类时间大约是 18.2s,可以看到的是如果一级缓存没有命中,然后去二级缓存读取数据,时间差了一个数量级。
4 q: `+ e6 N" X, e: J
( W$ J# d2 Z2 D( y2 z$ }    小知识:为什么需要多层的 CPU 缓存呢?这篇文章通过一个通俗易懂的例子给出了讲解。 / r* k: M* l. W& q+ t1 L! B+ h2 L
Why do CPUs have multiple cache levels?
2 ]3 |7 ^3 |: E! W+ u( D. O" I, W& D- j1 Y
    我们继续,互斥锁的加锁和解锁时间需要 25ns,换算成人类时间大约是 65s,首次达到了一分钟。并发编程中,我们经常听说锁是一个很耗时的东西,因为在微波炉里加热一个东西需要一分钟的话,你要在那傻傻地等蛮久了。
! _. B0 B. s+ J2 b4 V6 }
7 G& ^( `% N: L# C2 [    然后就到了内存,每次内存寻址需要 100ns,换算成人类时间是 260s,也就是4分多钟,如果读一些不需要太多思考的文章,这么久能读完2-3千字(这个快阅读的时代,很少人在手机上能静心多这么字了)。看起来还不算坏,不多要从内存中读取一段数据需要的时间会更多。到了内存之后,时间就变了一个量级,CPU 和内存之间的速度瓶颈被称为 冯诺依曼瓶颈
  D. _- i4 I9 d6 f
. r3 g1 ^- M, Y5 v9 n# u    一次 CPU 上下文切换(系统调用)需要大约 1500ns,也就是 1.5us(这个数字参考了这篇文章 How long does it take to make a context switch?,采用的是单核 CPU 线程平均时间),换算成人类时间大约是 65分钟,嗯,也就是一个小时。我们也知道上下文切换是很耗时的行为,毕竟每次浪费一个小时,也很让人有罪恶感的。1 A4 j. ~, P; F  Q5 f3 f& X; u
5 ?8 j1 I1 n5 [" ~& ?8 W4 A: s0 N- p
     上下文切换更恐怖的事情在于,这段时间里 CPU 没有做任何有用的计算,只是切换了两个不同进程的寄存器和内存状态;而且这个过程还破坏了缓存,让后续的计算更加耗时。
9 ]3 Y$ g# T% j% w; `
6 ]9 G, J* t9 K- I1 K: H( {    在 1Gbps 的网络上传输 2K 的数据需要 20us,换算成人类时间是 14.4小时,这么久都能把《星球大战》六部曲看完了(甚至还加上吃饭撒尿的时间)!可以看到网络上非常少数据传输对于 CPU 来说,已经很漫长。而且这里的时间还是理论最大值,实际过程还要更慢一些。
5 d% P0 o, q7 [$ y5 @( Z0 Q( S' d& |# n* W+ n5 p9 m- z, @
    SSD 随机读取耗时为 150us,换算成人类时间大约是 4.5天。换句话说,SSD 读点数据,CPU 都能休假,报团参加周边游了。虽然我们知道 SSD 要比机械硬盘快很多,但是这个速度对于 CPU 来说也是像乌龟一样。7 B, n8 O$ L( N7 F9 F& K

' c; I& t5 E1 B, E/ H) E      I/O 设备 从硬盘开始速度开始变得漫长,这个时候我们就想起内存的好处了。尽量减少 IO 设备的读写,把最常用的数据放到内存中作为缓存是所有程序的通识。像 memcached 和 redis 这样的高速缓存系统近几年的异军突起,就是解决了这里的问题。6 c' Y) p  {1 ^$ y

# C/ I% {6 I: @* }! j& L$ n6 i    从内存中读取 1MB 的连续数据,耗时大约为 250us,换算成人类时间是 7.5天,这次假期升级到国庆七天国外游了。
& e* T3 R0 L1 U/ F+ d+ H/ ^/ r" G( W4 j+ X  u
    同一个数据中心网络上跑一个来回需要 0.5ms,换算成人类时间大约是 15天,也就是半个月的时间。如果你的程序有段代码需要和数据中心的其他服务器交互,在这段时间里 CPU 都已经狂做了半个月的运算。减少不同服务组件的网络请求,是性能优化的一大课题。# c' V. {2 W, W2 b

, I6 e0 u, c3 ^) B3 H8 u    从 SSD 读取 1MB 的顺序数据,大约需要 1ms,换算成人类时间是 1个月。也就是说 SSD 读一个普通的文件,如果要等你做完,CPU 一个月时间就荒废了。尽管如此,SSD 已经很快啦,不信你看下面机械磁盘的表现。" V# Q$ p' r+ U3 s$ n) M
- A/ h/ i. A% e& y- T
    磁盘寻址时间为 10ms,换算成人类时间是 10个月,刚好够人类创造一个新的生命了。如果 CPU 需要让磁盘泡杯咖啡,在它眼里,磁盘去生了个孩子,回来告诉它你让我泡的咖啡好了。
, P5 D0 J) G6 i7 d6 H1 E# B
: ]; Y- @1 r" h* k% o4 e: Z- a      机械硬盘使用 RPM(Revolutions Per Minute/每分钟转速) 来评估磁盘的性能:RPM 越大,平均寻址时间更短,磁盘性能越好。寻址只是把磁头移动到正确的磁道上,然后才能读取指定扇区的内容。换句话说,寻址虽然很浪费时间,但其实它并没有办任何的正事(读取磁盘内容)。
% w! d& ^1 c7 n: J" `1 w8 j
" ]' E% b, x9 P6 @5 d8 ?0 k    从磁盘读取 1MB 连续数据需要 20ms,换算成人类时间是 20个月。IO 设备是计算机系统的瓶颈,希望读到这里你能更深切地理解这句话!如果还不理解,不妨想想你在网上买的东西,快递送了将近两年,你的心情是怎么样的。
' u+ s) ~# u0 V: Q
' _( s/ n* Y: g/ }$ v    而从世界上不同城市网络上走一个来回,平均需要 150ms,换算成人类时间是 12.5年。不难理解,所有的程序和架构都会尽量避免不同城市甚至是跨国家的网络访问,CDN 就是这个问题的一个解决方案:让用户和最接近自己的服务器交互,从而减少网络上报文的传输时间。
% E( m+ J0 C* k# C0 K& f# L8 X- S4 v* a
    虚拟机重启一次大约要 4s 时间,换算成人类的时间是 3百多年。对于此,我想到了乔布斯《要死命优化 Mac 系统开机启动时间》的故事。如果机器能少重启而且每次启动能快一点,不仅能救人命,也能救 CPU 的命。% g' n3 p$ v, L! ]1 T6 L

: _8 @1 v7 G% e' o6 Y" B    物理服务器重启一次需要 5min,换算成人类时间是 2万5千年,快赶上人类的文明史了。5 分钟人类都要等一会了,更别提 CPU 了,所以没事不要乱重启服务器啊,分分钟终结一个文明的节奏。7 G6 {/ b* e! g1 @. ~6 Y
   
" G% ?. N9 [2 X4 o    参考资料
# A7 R' n' d) y% w* ` What Every Programmer Should Know About Memory
  N4 L: i# {5 K' ]& {& q    Getting Physical With Memory& b8 N& ~! v/ M# n# K+ R

4 j) h! Q( U2 B' Y    本文来自:http://blog.51cto.com/13188467/2065321?wx=
" p3 u4 O4 f; Q0 @) @3 V! i3 t    作者:cizixs
& Z5 @- F  ]$ {9 X  {0 @  h

上一篇:  CPU的自述

下一篇:  各种机械键盘轴的区别

评分

参与人数 1成长值 +1 金币 +1 收起 理由
空谷幽兰 + 1 + 1 这个科普真有意思

查看全部评分

楼主| 仗剑天涯吾是土豪 发表于 2018-2-15 16:09:55 | 只看该作者
我是一个GPU,这个世界难看死了
放我一个人生活「出类拔萃」 发表于 2018-2-15 22:52:04 来自手机 | 只看该作者
楼主的文笔实在用笔墨难以形容。。。熄了灯。。。打着赤脚。。。将整个人都倦在大班椅里。。。喝着清茶看那一个个帖子在论坛之间时隐时现。。。记得一位高人说。。。好帖子与垃圾帖的区别在于。。。好帖子越看越暖。。。而垃圾帖。。。越看越寒。。。我呢。。。一开始就和普通人一样。。。不相信真有一种帖子可以让人学会忘记烦恼和所有不开心的事情。。。所以。。。我选择看垃圾帖。。。选择垃圾帖的人。。。一般都比较冷静。。。 
微雨黄昏「出类拔萃」 发表于 2018-2-16 23:23:46 | 只看该作者
君甚吊,家翁可知?#y445:
您需要登录后才可以回帖 登录 | 立即注册  

本版积分规则

关于我们|小黑屋|手机版|Archiver|古黑论

GMT+8, 2019-8-26 12:58 , Processed in 0.055723 second(s), 32 queries , Gzip On, Redis On.

© 2015-2019 GuHei.Net

Powered by Discuz! X3.4

快速回复 返回列表