现代硬件

时间:2020-01-09 10:36:18  来源:igfitidea点击:

为了从Java应用程序中获得最大性能,我们需要了解其运行的硬件。当我们编写符合硬件工作方式的代码时,我们将获得更高的性能。马丁·汤普森(Martin Thompson)称之为"机械同情"。

当然,我们不需要了解硬件的每个小细节。因此,本教程重点介绍我们应该了解的部分。

现代硬件架构

现代计算机通常具有以下组件:

  • CPU-一个或者多个。
  • L1一级缓存
  • L2二级缓存
  • L3三级缓存
  • 内存(RAM)
  • 硬盘(HD)
  • 网卡(NIC)

L1,L2和L3是" Level 1"," Level 2"和" Level 3"的缩写。

上述硬件组件在此处进行了说明:

每个部分将在下面更详细地说明。

中央处理器

一台现代计算机可能具有多个CPU。实际上,这是规则,而不是计算机具有多个CPU的例外。

CPU具有指令缓存和数据缓存(L1)。指令高速缓存用于读取程序的指令。当CPU执行紧密循环时,从指令高速缓存中读取循环内的指令要比从主存储器中读取指令更快。因此,较小的紧密循环比不适合指令高速缓存的较大的循环更快。

L1和L2缓存

每个CPU都有一个L1和L2内存高速缓存。 L1缓存通常很小,但是对于CPU来说读取速度非常快。 L2缓存通常比L1缓存更大,但读取速度也较慢。

当CPU从主存储器读取数据时,它会将一个数据块读入其L2和L1高速缓存。一次从主存储器读取更大的存储块比一次读取一个字节(或者64位)要快。一旦数据位于L1和L2缓存中,CPU便可以更快地访问它们。如果CPU更改了CPU缓存中的任何数据,则该数据需要在某个时候写回到主存储器。

三级缓存

L3(3级)高速缓存通常是位于主内存顶部的高速缓存层。因此,L3缓存由主板上的所有CPU共享。每当CPU需要从主存储器中获取数据时,就会将较大的数据块读入L3高速缓存中。如果CPU在先前请求的内存之后需要连续存储更多数据,则很有可能在L3高速缓存中找到该内存。

硬盘

硬盘用于存储数据,以便在服务器重新启动后继续运行。硬盘要比内存慢很多(尽管这种情况即将改变)。但是硬盘的存储容量也远大于内存。

硬盘分为两类:旋转硬盘和SSD(固态驱动器)。旋转硬盘通常比SSD便宜且更大,但通常也更慢。

3D XPoint内存

2014年,英特尔宣布了一种新型的内存,称为" 3D XPoint内存"(发音为" cross point")。该内存几乎和今天的DRAM一样快,但是它是耐用的,这意味着存储其中的数据可以在服务器重新启动后幸存下来,就像写入硬盘的数据一样。

3D XPoint内存也应该相当便宜,因此我们可以以可承受的价格获得大容量的内存块,其大小相当于硬盘大小。希望3D XPoint内存将彻底改变需要读取和写入大量数据的软件的速度。

网络接口卡(NIC)

网络接口卡(NIC)用于通过网络发送和接收数据。计算机中网卡的速度会影响我们与其他计算机通信的速度。

速度可能会影响在内存或者磁盘上本地缓存数据的需求。我们拥有的NIC(以及连接的另一端)越快,对缓存的需求就越少。当然,如果数据需要途中通过其他几台计算机,例如通过Internet发送的数据,那么所有这些中间计算机+ NIC的速度也很重要。

通常,当我们从网卡读取数据时,首先会将数据从网络读取到OS内存中,然后再从OS内存中读取到应用程序的内存中。但是,某些类型的网卡技术可以绕过OS内存复制步骤,将数据直接从网卡直接复制到应用程序的内存中。其中一些技术是" Infiniband"和"融合以太网上的RDMA"。

顺序数据访问更快

由于所有的缓存层以及普通硬盘的工作方式,顺序数据访问比任意数据访问要快。原因是,所有缓存策略都基于程序将顺序访问数据的假设。让我再解释一下。

当CPU从主内存请求一条数据时,硬件假定CPU可能很快会在此之后请求下一个字节(或者64位块)等。由于许多内存和磁盘技术都可以在以下位置快速读取较大的内存块:一次,对于硬件而言,一次只复制这么大的内存块是很有意义的。如果CPU实际按顺序处理内存,则访问数据块中的下一个地址会更快,因为该地址已存在于高速缓存中。

这是说明L1,L2和L3中的缓存原理的图:

这种大块加载行为适用于所有缓存层,一直到硬盘。即使是硬盘,也比一次读取一个字节更快地从磁盘读取更大的数据块。

这种缓存行为意味着顺序访问数据要比访问任意地址的数据快得多。这就是说,像Java的ArrayList这样的数据结构比LinkedList更快。

当我们访问内存(或者磁盘)中任意地址的数据时,速度会慢得多,因为请求的数据很少位于缓存中。这意味着必须从磁盘,主存储器,另一个缓存层等中加载数据,这比直接访问最近的缓存(最好是L1)要慢。