当前位置: 首页 > Web前端 > HTML5

让CPU告诉你硬盘和网络有多慢

时间:2023-04-04 23:22:37 HTML5

让CPU告诉你硬盘和网络有多慢是的,比如复制一个文件到硬盘需要几分钟到几十分钟,足够我吃一顿饭了;而从网上下载一部电影有时需要几个小时,我什至可以睡觉。最熟悉的计算机不同组件速度差异的图表是以下金字塔形式:速度越高,容量越低,价格越高。这张图只是给我们一个直观的感受,并没有对每一个速度和性能做量化的说明和解释。事实上,不同级别之间的差异比这张图要大得多。这篇文章将让你从CPU的角度看世界,它们到底有多慢。希望你看完这篇文章能明白两点:磁盘和网络确实很慢,性能优化是一项复杂的系统性活动。注:所有数据均来自该地址。所有数据会因机器配置或硬件更新不同而有所不同,但不影响我们的直观感受。如果你对这些数据比较感兴趣,这个网站给出了一些指标在不同年份的数值。数据1.我们先来看看CPU的速度。以我的电脑为例,主频是2.6G,也就是说每秒可以执行2.6*10^9条指令,每条指令只需要0.38ns(现在很多个人电脑的主频都更高比这个更高的配置可以达到3.0G+)。我们把这个时间作为基本单位1s,因为1s大概是人类可以感知的最小时间单位。2.一级缓存读取时间0.5ns,换算成人的时间大约1.3s,大概一两次心跳。这里可以看出缓存的重要性,因为它的速度可以赶上CPU,程序本身的局部性和指令层面的优化,缓存访问的命中率非常高,可以大大提高效率到底。3.BranchpredictionErrorstake5ns,相当于人类时间13s左右,有点长,所以你会看到很多文章分析如何优化代码来降低branchprediction的概率,比如这个stackoverflow的问题就很高分数。4.二级缓存时间比较长,大概7ns,换算成人的时间大概是18.2s。可以看出,如果一级缓存未命中,再去二级缓存读取数据,时间差一个数量级。小知识:为什么我们需要多层CPU缓存?本文通过一个通俗易懂的例子进行说明。5、继续,mutex的加锁和解锁时间需要25ns,换算成人的时间大约是65s,第一次达到一分钟。在并发编程中,我们经常听说加锁是一件很耗时的事情,因为如果用微波炉加热一个东西需要一分钟,你就得在那里等很久。6.然后是记忆。每次内存寻址需要100ns,换算成人的时间是260s,也就是4分钟多。如果你看一些不需要太多思考的文章,这么长的时间可以读完2-3千字(在这个快阅读的时代,很少有人能在手机上冥思这么多字)。看起来还不错,从内存中读取一条数据会花费更多的时间。内存之后,时间变化了一个数量级,CPU和内存之间的速度瓶颈称为冯诺依曼瓶颈。7.一次CPU上下文切换(系统调用)大概需要1500ns,也就是1.5us(这个图是参考这篇文章,使用单核CPU线程的平均时间),换算成人的时间大概是65分钟,嗯,也就一个小时。我们也知道上下文切换是一个耗时的行为。毕竟每次都浪费一个小时,也是很愧疚的。上下文切换更可怕的是,CPU在此期间并没有做任何有用的计算,只是切换了两个不同进程的寄存器和内存状态;而这个过程也破坏了缓存,使得后续的计算更加耗时。8、1Gbps网络传输2K数据需要20us,按人的时间计算是14.4小时。《星球大战》的六部都看完了好久(连吃饭尿尿的时间都包括在内)!可以看出,网络上很少的数据传输对于CPU来说已经很长了。而且,这里的时间还是理论上的最大值,实际的过程还要慢一些。9.SSD随机读取耗时150us,换算成人的时间约为4.5天。也就是说,SSD读取了一些数据,CPU可以放假了,我就可以报个团,参加一个外设游。虽然我们知道固态硬盘的速度要比机械硬盘快很多,但是这个速度对于CPU来说就像乌龟一样。I/O设备的速度从硬盘开始增长,这时候我们就想到了内存的好处。尽量减少IO设备的读写,将最常用的数据放在内存中作为缓存是所有程序的常识。近几年memcached、redis等缓存系统的异军突起,解决了这里的问题。10、从内存中读取1MB的连续数据大约需要250us,换算成人的时间是7.5天。11、在同一个数据中心网络上跑一个来回需要0.5ms,按人的时间算15天左右,也就是半个月。如果你的程序中有一段代码需要和数据中心的其他服务器进行交互,这段时间CPU已经疯狂计算了半个月。减少不同服务组件的网络请求是性能优化的一大课题。12.从SSD读取1MB的顺序数据大约需要1ms,人类时间是1个月。也就是说,如果SSD读取一个普通文件,非要等你读完,CPU会浪费一个月。即便如此,SSD已经非常快了。不信你看看下面机械盘的表现。13、磁盘寻道时间为10ms,换算成人类时间为10个月,刚好够人类创造新生命。如果CPU需要叫磁盘冲一杯咖啡,在它眼里,磁盘生完孩子回来告诉它你叫我冲的咖啡好了。机械硬盘用RPM(RevolutionsPerMinute/每分钟转速)来评价磁盘的性能:RPM越大,平均寻道时间越短,磁盘性能越好。寻址只是将磁头移动到正确的磁道上,就可以读取指定扇区的内容了。也就是说,寻址虽然是浪费时间,但实际上并没有做任何事情(读取磁盘内容)。14、从磁盘读取1MB连续数据需要20ms,人类时间是20个月。IO设备是计算机系统的瓶颈,希望你看完后能对这句话有更深刻的理解!如果你还是不明白,你不妨想一想,你在网上买的东西,快递过去快两年了,是什么感觉。15、从世界不同城市的网络来回平均需要150ms(参考世界各地ping消息的时间),相当于人类的12.5年。不难理解,所有的程序和架构都会尽量避免在不同城市甚至跨国家的网络访问。CDN是解决这个问题的一种方法:让用户与离自己最近的服务器进行交互,从而减少消息在网络上的传输时间。16、虚拟机重启需要4秒左右,换算成人要300多年。为此,我想到了乔布斯试图优化Mac系统开机时间的故事。如果机器能少重启,每次启动快一点,不仅能救命,还能救CPU的命。17、物理服务器重启一次需要5分钟,按人类时间计算是25000年,快赶上人类文明史了。人类都要等5分钟,CPU更不用说了,所以不要没事就随便重启服务器,分分钟结束一个文明的节奏。【注】本文转自http://blog.51cto.com/1318846...。