关于cpu:x64-和-arm64-处理器架构的区别

在深入探讨 x64 和 arm64 这两个处理器架构之前,让咱们先明确它们在计算机科学和硬件设计畛域中的基本概念和重要性。了解这些概念对于把握它们的区别至关重要,而且能够帮忙咱们意识到为什么古代计算设施,从服务器到智能手机,会抉择这些架构。 x64,也被称为 AMD64 或 Intel 64,是对经典的 32 位 x86 指令集架构(ISA)的扩大。这种架构最后由 AMD 开发,并迅速被 Intel 驳回,其次要目标是容许计算机解决更大的内存空间(超过 4GB),同时放弃对旧 x86 应用程序的兼容性。x64 架构反对的是 64 位计算,这意味着它能够应用更宽的数据通道和更大的寄存器,这对于进步数据处理能力和运行简单的应用程序十分重要。 另一方面,arm64,亦称为 AArch64,是 ARM 架构的 64 位版本,由 ARM Holdings 设计。它用于 ARM 的 v8-A 架构中,标记着从 32 位转向 64 位解决能力的重大转变。arm64 架构特地重视能效比,这使得它在挪动设施、嵌入式零碎以及越来越多的服务器和桌面平台上变得十分受欢迎。与 x64 相比,arm64 提供了更高的能源效率和老本效益,局部起因是其精简指令集(RISC),这种设计缩小了每条指令的复杂度,使得硬件实现更为简略。 当初,让咱们探讨 x64 和 arm64 之间的要害区别: 架构设计哲学x64 架构遵循简单指令集计算(CISC)设计准则,这意味着它设计有简单的指令,能够执行多步操作。这种设计初衷是为了缩小编译器的工作量,间接在硬件层面实现简单的操作。然而,这也使得 x64 处理器的设计和实现更加简单,耗费更多的电力,并且在某些状况下升高了处理速度。 相同,arm64 遵循精简指令集计算(RISC)准则,强调应用较少、更简略的指令集来执行操作。这种办法旨在通过进步指令的执行速度来晋升性能,同时升高处理器的能耗和老本。arm64 的这种设计理念使得它在挪动设施和须要高能效的场合十分受欢迎。 利用和生态系统x64 架构长期以来始终是桌面计算机和服务器的主导架构,得益于其与旧 x86 应用程序的兼容性,以及其在解决高性能计算工作方面的能力。这意味着,对于运行简单的桌面操作系统、大型数据库和高端游戏等,x64 提供了弱小的反对。 而 arm64,因为其杰出的能效比和对低功耗的优化,次要用于智能手机、平板电脑、嵌入式零碎和轻薄笔记本电脑。近年来,随着 Apple 推出基于 arm64 的 M1 芯片,以及微软和 Qualcomm 合作开发的 Windows on ARM 我的项目,arm64 架构开始进入高性能计算和桌面计算畛域,挑战 x64 的主导地位。 ...

March 4, 2024 · 1 min · jiezi

关于cpu:什么是GPU与CPU有什么不同哪个更好

如果您以前应用过计算机,您可能遇到过对于 GPU 与 CPU 的探讨。这两个术语有什么区别,哪个更好?计算机依附 GPU 和 CPU 来执行不同的性能,有时两者互相补充。本文将定义 GPU 和 CPU,并概述它们的优缺点。咱们还将概述两者如何协同工作以执行各种计算机性能。 一、什么是图形处理单元(GPU)?GPU 是一种计算机处理器,可依据给定的数学计算执行图形和成像工作。如果您在计算机、平板电脑或智能手机上查看任何图像或图形,GPU 将对此负责。只管大多数计算机都带有3D 图形,但它们须要 GPU 的性能能力更快更好地解决这些图形。GPU 在视频编辑过程中也很重要,因为它容许人们在不影响其余计算机过程的状况下解决简单的动画。为确保您计算机的 CPU 不会变慢,GPU 应用“并行处理”性能,多个处理器同时解决工作的不同局部。 二、什么是中央处理器(CPU)?CPU 也称为“中央处理器”或“微处理器”,是负责大多数解决流动的计算机单元。CPU 依据来自硬件和软件的特定计算机指令工作,以提供所需的后果(输入)。它被宽泛地称为计算机的“大脑”,因为它执行简单的数学计算以无效地解决不同的工作。CPU 在 ALU(算术逻辑单元)和 CU(管制单元)的帮忙下高效地执行其性能。管制单元治理所有解决操作,而 ALU 执行所有数学和逻辑性能。除了 ALU 和 CU 之外,CPU 还与主存储器同时工作,为特定工作获取指令并存储后果。 三、GPU与CPU有何区别?尽管人们有时会把 GPU 和 CPU 了解为同一个货色,但两者是不同的。上面是一个比拟表,概述了 GPU 和 CPU 之间的差别。GPU VS CPU 四、GPU的长处和毛病GPU的劣势:高数据吞吐量,因为它蕴含 100 个内核,可同时解决同一工作的不同局部。通过并行计算执行大量计算。具备很高的计算能力,可用于比特币挖矿。在生成深度学习算法时在机器学习中很有用。GPU 实用于数据迷信畛域的分析程序。GPU的毛病:它被认为比 CPU 更低廉。它不适宜多任务处理,因而不适宜通用计算。   因为其无限的性能和复杂性,它很难解决简单的工作。 五、CPU的长处和毛病CPU具备以下长处:具备高度的灵活性来解决各种工作。因为其高上下文能力,优于 GPU。它能够拜访大内存空间,能够并发解决更多任务。在执行简单的计算工作时具备很高的精度。它具备老本效益且易于取得。中央处理器的毛病:不善于并行处理;因而无奈解决须要数百万个相似操作的大型工作。CPU 的倒退也很迟缓。与所有零碎或软件不兼容,即用于 x86 Intel 处理器的应用程序不能在 ARM 处理器上运行。 六、GPU和CPU如何协同工作?CPU 和 GPU 协同工作以进步给定应用程序的数据吞吐量和并发计算。只管 GPU 最后仅反对计算机图像和图形,但您也能够应用它来进步须要大量数据的 CPU 速度。GPU 能够通过并行运行反复计算来补充 CPU 架构,而其余流动则在 CPU 上串行运行。这反过来又进步了 CPU 的处理速度。此外,GPU 和 CPU 协同工作,因为前者运行专门的数学工作,而后者协调计算机中同时运行的各种流动。因为 GPU 反对并行性,它能够帮忙 CPU 在同一时间范畴内执行更多任务。 ...

July 5, 2023 · 1 min · jiezi

关于cpu:云服务器的vCPU和CPU有什么区别

CPU是指中央处理器,CPU代表物理CPU核数,是实在存在的,CPU不是虚构的,vCPU是物理CPU的根底上通过超线程HT技术虚构进去的,一般来讲,云服务器的CPU指的是vCPU。 首先一台云服务器ECS实例的CPU选项由CPU物理外围数和每核线程数决定,以ecs.g6.xlarge实例为例,阿里云默认提供2个物理核CPU,开启超线程,将每核线程数设置为2,则该实例规格有2*2=4个vCPU,默认状况下该实例规格开启超线程配置。如果敞开超线程配置,则1个物理核只能运行1个线程,实例的vCPU数量等于物理核数,为2。 残缺内容请点击下方链接查看: https://developer.aliyun.com/ask/507098%20?utm_content=g_1000... 版权申明:本文内容由阿里云实名注册用户自发奉献,版权归原作者所有,阿里云开发者社区不领有其著作权,亦不承当相应法律责任。具体规定请查看《阿里云开发者社区用户服务协定》和《阿里云开发者社区知识产权爱护指引》。如果您发现本社区中有涉嫌剽窃的内容,填写侵权投诉表单进行举报,一经查实,本社区将立即删除涉嫌侵权内容。

June 6, 2023 · 1 min · jiezi

关于cpu:SRAM-和-DRAM-的区别

SRAM(Static Random-Access Memory)和DRAM(Dynamic Random-Access Memory)是计算机中两种常见的存储器类型。它们在工作原理、性能特色和应用领域上存在着显著的区别。上面将具体介绍SRAM和DRAM之间的区别。 工作原理: SRAM:SRAM是一种基于触发器的存储器,应用稳固的存储电路来存储和保持数据。每个存储单元由一个存储器单元和控制电路组成,其中存储器单元由多个触发器形成,可能存储比特数据。因为采纳了触发器构造,SRAM在一直刷新的过程中保持数据的稳定性。DRAM:DRAM是一种基于电容的存储器,应用电容来存储和示意数据。每个存储单元由一个电容和一个拜访晶体管组成。电容在存储器中充电或放电来示意数据的0和1。因为电容会逐步漏电,DRAM须要定期刷新以保持数据的正确性。存储密度: SRAM:因为SRAM采纳了稳固的存储电路,每个存储单元须要更多的晶体管来实现,因而SRAM的存储密度绝对较低。每个存储单元通常须要6个晶体管。DRAM:因为DRAM采纳了电容存储构造,每个存储单元只须要一个电容和一个拜访晶体管,因而DRAM的存储密度较高。每个存储单元通常只须要1个晶体管和1个电容。刷新需要: SRAM:因为SRAM的存储单元采纳稳固的触发器构造,不须要进行定期刷新操作。数据能够始终保持稳定,无需周期性刷新。DRAM:因为DRAM的电容逐步漏电,数据须要定期刷新以放弃其正确性。DRAM须要通过刷新操作周期性地从新写入数据,否则数据会失落。访问速度: SRAM:SRAM的访问速度十分快,因为数据存储在触发器中,能够立刻读取和写入。SRAM具备较低的拜访提早和高速的读写性能。DRAM:DRAM的访问速度绝对较慢,因为数据存储在电容中,须要通过拜访晶体管的操作。DRAM具备较高的拜访提早和绝对较慢的读写性能。

May 18, 2023 · 1 min · jiezi

关于cpu:什么是计算机-cpu-的地址总线

计算机的CPU(中央处理器)的地址总线是用于传输内存地址的一组导线或线路。它将内存地址从CPU发送到内存控制器或其余外部设备,用于定位和抉择要读取或写入的内存单元或外设。地址总线的宽度决定了CPU能够寻址的内存空间大小。 上面将具体介绍计算机CPU的地址总线的作用、性能以及相干概念: 地址示意:地址总线用于示意内存地址。内存地址是用来惟一标识计算机内存中的每个存储单元的数字值。地址总线的位数决定了能够示意的地址数量,也就是内存地址空间的大小。例如,32位地址总线能够寻址的内存空间为2^32,即4GB。内存拜访:CPU通过地址总线向内存发送地址信息,以读取或写入数据。当CPU执行指令时,须要拜访特定的内存地址来获取指令或操作数。地址总线将指定的内存地址发送到内存控制器,从而实现对内存的拜访。外设拜访:地址总线不仅用于内存拜访,还用于拜访连贯到计算机的外部设备,如硬盘、显卡、网络接口等。这些外设通常与CPU通过一组地址进行通信。CPU将特定的地址发送到外设控制器,以申请对外设进行读取或写入操作。寻址范畴:地址总线的宽度决定了CPU能够寻址的内存范畴。宽度为n位的地址总线能够寻址2^n个不同的内存单元。例如,32位地址总线能够寻址2^32个不同的内存单元,每个内存单元通常为1字节(8位)。地址解码:地址总线还参加地址解码过程。在计算机系统中,内存和外设通常被划分为不同的地址范畴。地址总线的不同位对应不同的地址范畴或设施。通过地址解码电路,能够将CPU发送的地址与特定的内存区域或外设关联起来,从而抉择正确的指标。性能和扩展性:地址总线的宽度还会影响计算机系统的性能和扩展性。较宽的地址总线容许CPU间接寻址更多的内存,进步零碎的存储容量。它还能够反对更大的物理地址空间,适应更简单和大规模的利用。须要留神的是,地址总线仅负责传输地址信息,而不负责数据传输。数据的读取和写入是通过数据总线来实现的.

May 18, 2023 · 1 min · jiezi

关于cpu:什么是计算机的数据总线宽度

计算机的数据总线宽度是指计算机体系结构中用于传输数据的总线的宽度,也称为数据通路宽度(Data Path Width)。它示意计算机系统中数据传输的并行性,即每个时钟周期内能够同时传输的数据位数。数据总线宽度通常以位(bit)为单位进行示意。 数据总线宽度对计算机的性能和数据传输速度有重要影响,它间接决定了每个时钟周期内可能传输的数据量。以下是对于计算机数据总线宽度的一些重要概念和作用: 并行传输:数据总线宽度决定了计算机能够同时传输的数据位数。较宽的数据总线意味着更多的数据位能够一次性传输,从而实现更高的数据传输速率。例如,一个32位的数据总线能够一次性传输32位的数据,比一个16位的数据总线传输速度快一倍。数据传输效率:较宽的数据总线能够在更短的工夫内传输更多的数据,从而进步数据传输效率。这对于高性能计算和大规模数据处理工作十分重要。较宽的数据总线能够缩小数据传输的等待时间,进步零碎的响应速度。内存带宽:数据总线宽度与内存零碎的带宽密切相关。较宽的数据总线能够反对更大的内存带宽,从而放慢数据在内存和处理器之间的传输速度。这对于大规模计算、图形处理和多媒体利用十分要害。外设连贯:数据总线宽度也对连贯到计算机的外部设备的数据传输速度产生影响。例如,连贯到计算机的硬盘驱动器、显卡、网络接口等外部设备,它们的数据传输速度受到计算机数据总线宽度的限度。零碎扩展性:较宽的数据总线能够提供更大的扩展性。它能够反对更多的设施连贯和更高的数据吞吐量,使计算机系统可能解决更简单和更大规模的工作。须要留神的是,数据总线宽度并不是惟一影响数据传输速度的因素。其余因素包含处理器的性能、存储器速度、总线协定和数据传输方式等,都会对系统性能产生影响。因而,在设计和抉择计算机系统时,须要综合思考各种因素,以实现最佳的性能和数据传输效率。

May 18, 2023 · 1 min · jiezi

关于cpu:寄存器寻址和寄存器间接寻址的区别

寄存器寻址(Register Direct Addressing)和寄存器间接寻址(Register Indirect Addressing)是计算机体系结构中两种不同的寻址模式。它们用于确定指令中操作数所在的地位或获取操作数的值。上面将具体介绍寄存器寻址和寄存器间接寻址的区别以及它们的利用。 寄存器寻址:寄存器寻址是指指令中间接应用寄存器作为操作数的寻址模式。在寄存器寻址中,操作数的值存储在一个或多个特定的寄存器中,并且指令间接指定要应用的寄存器。这种寻址模式能够通过寄存器号或寄存器名称来示意。寄存器寻址的长处是速度快,因为数据间接存储在寄存器中,无需额定的内存拜访。它能够进步程序执行的效率,特地实用于须要频繁拜访和操作数据的场景,如算术运算和逻辑运算。寄存器间接寻址:寄存器间接寻址是指指令中应用寄存器存储的地址来获取操作数的寻址模式。在寄存器间接寻址中,寄存器中存储的是数据的地址,而不是理论的数据值。指令通过寄存器中的地址来拜访内存中的数据。寄存器间接寻址的长处是灵活性,它容许程序在执行过程中动静地扭转寻址的指标地址。这对于实现数据结构、数组、函数调用等简单的内存拜访操作十分有用。此外,寄存器间接寻址还能够缩小指令的长度,因为操作数不须要显式地呈现在指令中。区别和利用: 访问速度:寄存器寻址间接从寄存器中读取数据,速度十分快,而寄存器间接寻址须要额定的内存拜访,速度较慢。灵活性:寄存器寻址在编译时确定操作数的寄存器,实用于固定的操作数,而寄存器间接寻址容许在运行时动静扭转指标地址,实用于灵便的内存拜访。存储空间:寄存器寻址不须要调配额定的内存空间来存储操作数,而寄存器间接寻址须要在寄存器中存储地址值。

May 18, 2023 · 1 min · jiezi

关于cpu:CPU-中通用寄存器的作用

在计算机的中央处理器(CPU)中,通用寄存器(General-Purpose Registers)是其中的一个重要组件。通用寄存器是一种高速的外部存储器,用于存储和操作计算机中的数据。它们是CPU的一部分,用于长期存储指令和数据,以反对计算、逻辑操作和数据传输等操作。上面将具体介绍通用寄存器的作用和性能。 存储数据:通用寄存器用于存储数据。它们提供了一组可供程序应用的存储单元,用于临时保留计算过程中的数据。寄存器是CPU外部最疾速的存储器,能够迅速拜访和更新其中的数据,放慢计算速度。数据传递:通用寄存器用于在CPU外部传递数据。它们能够作为数据的长期存储地位,将数据从一个计算单元传递到另一个计算单元。通过将数据存储在寄存器中,能够缩小对内存的拜访次数,进步数据传输的效率。算术和逻辑操作:通用寄存器用于执行算术和逻辑操作。CPU能够间接从寄存器中获取数据,并对其进行加法、减法、乘法、除法和逻辑运算等操作。这些寄存器作为操作数和后果的暂存区域,反对计算机中各种运算的执行。寄存器间数据传输:通用寄存器能够用于在寄存器之间传输数据。CPU能够将一个寄存器的值间接传送到另一个寄存器中,而不须要通过内存来进行直达。这种寄存器间的数据传输能够更快地实现数据的挪动和操作。地址计算:通用寄存器用于反对地址计算。在程序执行过程中,CPU须要计算内存中的数据地址。通用寄存器能够存储和操作地址计算所需的两头后果和长期值,以便进行无效的地址计算。存储长期后果:通用寄存器用于存储长期计算的后果。在程序执行过程中,CPU须要执行一系列的计算操作,这些操作的两头后果能够临时存储在寄存器中,供后续指令应用。这样能够防止频繁地拜访内存,进步计算效率。参数传递:通用寄存器能够用于函数调用中的参数传递。当一个函数被调用时,参数能够被存储在寄存器中,而后传递给被调用函数。这样能够进步参数传递的速度。

May 18, 2023 · 1 min · jiezi

关于cpu:CPU-中控制器的作用

在计算机的中央处理器(CPU)中,控制器(Control Unit)是其中的一个重要组件。控制器是负责指挥和协调整个CPU工作的外围局部,它管制着指令的执行和数据的传输,是计算机执行程序的要害局部。上面将具体介绍控制器的作用和性能。 指令解码:控制器负责解码指令。它从内存中读取指令,并将其解析为对应的操作码和操作数。指令解码是将指令翻译成CPU能够了解和执行的管制信号的过程。时序管制:控制器生成和治理计算机外部的时序信号。它确定和控制指令的执行程序、数据传输的时序和各个组件之间的协调。时序管制保障计算机各个部件依照正确的程序和工夫执行操作。程序计数器(PC):控制器维护程序计数器,它保留着以后正在执行的指令的地址。控制器依据指令的执行程序,逐渐更新程序计数器的值,使得CPU可能依照程序的程序执行指令。分支和跳转:控制器负责解决分支和跳转指令。当遇到条件分支或无条件跳转指令时,控制器会依据条件或跳转指标更新程序计数器的值,以跳转到新的指令地址继续执行。这样,控制器实现了程序的流程管制。中断解决:控制器可能响应和解决中断信号。当产生硬件故障、内部事件或特定条件满足时,控制器会暂停以后的指令执行,保留现场状态,解决相应的中断服务程序,并在中断解决实现后返回到原来的执行点继续执行。数据传输管制:控制器协调和控制数据在CPU外部的传输。它将指令须要的数据从内存或寄存器中取出,依据指令要求进行数据传输和操作,并将后果写回内存或寄存器。控制器确保数据的正确传输和存储。管制信号生成:控制器生成管制信号,用于管制CPU外部各个部件的工作。这些管制信号包含时钟信号、使能信号、读写信号、操作抉择信号等。通过管制信号,控制器可能准确地管制和调度CPU外部各个部件的操作。异样解决。

May 18, 2023 · 1 min · jiezi

关于cpu:CPU-中运算器的作用

在计算机的中央处理器(CPU)中,运算器(Arithmetic Logic Unit,简称ALU)是其中的一个重要组件。运算器是负责执行各种算术和逻辑运算的外围局部,它是计算机进行计算和决策的要害局部。上面将具体介绍运算器的作用和性能。 算术运算:运算器可能执行各种算术运算,如加法、减法、乘法和除法。它能够对数字进行加减乘除等数学运算,以实现各种简单的计算工作。算术运算是计算机进行数值计算和数据处理的根底。逻辑运算:运算器也可能执行逻辑运算,如与(AND)、或(OR)、非(NOT)和异或(XOR)等。逻辑运算用于判断条件、比拟数据和执行布尔逻辑操作。它在管制流程和决策制定中起着重要作用。比拟运算:运算器还可能执行比拟运算,用于比拟两个数值的大小关系。通过比拟运算,能够判断两个数是否相等、大小关系以及逻辑条件是否满足。比拟运算是计算机程序中罕用的操作之一。位运算:运算器反对位级的运算,如按位与(AND)、按位或(OR)、按位非(NOT)和按位异或(XOR)等。位运算能够间接对二进制数据进行操作,对于位级解决和位掩码操作十分有用。数据移位:运算器能够执行数据的移位操作,包含逻辑左移、逻辑右移、算术右移和循环移位等。数据移位罕用于解决二进制数据、位操作和数据编码等畛域。数据处理:运算器不仅能够解决整数数据,还能够进行浮点数运算、定点数运算和逻辑数据处理。它反对各种数据格式和数值示意,可能解决不同精度和格局的数据。状态标记:运算器能够设置和更新一些状态标记,如零标记(Zero Flag)、进位标记(Carry Flag)、溢出标记(Overflow Flag)等。这些状态标记用于记录运算后果的一些属性和状态信息,供后续指令和程序判断和应用。管制单元交互:运算器与计算机的管制单元进行严密的交互。它接管管制单元收回的指令和数据,并执行相应的计算操作。

May 18, 2023 · 1 min · jiezi

关于cpu:从CPU的视角看-多线程代码为什么那么难写

 当咱们提到多线程、并发的时候,咱们就会回想起各种诡异的bug,比方各种线程平安问题甚至是利用解体,而且这些诡异的bug还很难复现。咱们不禁收回了灵魂拷问 “为什么代码测试环境运行好好的,一上线就不行了?”。 为了解决线程平安的问题,咱们的先辈们在编程语言中引入了各种各样新名词,就拿咱们相熟的Java为例,不仅java语言自带了synchronized、volatile、wait、notify… ,jdk中各种工具包也是层出不穷,就比方单一个Lock,就能够有很多种实现,甚至很多人都谈锁色变。 为什么会呈现这种状况,咱们得先从CPU和主存(RAM)的关系说起。 上个世纪80年代,PC机衰亡的时候,CPU的运算速度只有不到1MHz。放当初你桌上的计算器都能够吊打了它了。那时候就是因为CPU运算慢,它对数据存取速度的要求也不那么高,顶多也就1微秒(1000ns)取一次数据,一次访存100ns对CPU来说也算不上什么。 然而这么多年过来了,CPU始终在沿着摩尔定律的路线一路狂奔,而内存拜访提早的速度却始终止步不前。(当然存储也有十分大的倒退,但次要体现在容量方面,而拜访延时自诞生初就没什么变动)。 咱们来比照下CPU和内存过来几十年之间的倒退速率: 能够看出,在过来40年里, CPU的运算速度增量了上千倍,而内存的拜访延时却没有太大的变动。 咱们就拿当今最先进CPU和内存举例,目前商用的CPU主频根本都是3GHz左右的(其实十多年前基本上就这个程度了),算下来CPU每做一次运算仅需0.3ns(纳秒)。而以后最先进的内存,拜访提早是100ns左右的,两头相差300倍。如果把CPU比作一个打工人的话,那么他的工作状态就会是干一天活而后休一年,这劳动的一年里等着内存里的数据过去(真是令人羡慕啊)。 其实CPU的设计者早就意识到了这点,如果CPU真是干1休300的话,未免也太不高效了。在说具体解决方案前,我这里先额定说下内存,很多人会好奇为什么主存(RAM)的访问速度始终上不来? 这个精确来说其实只是DRAM内存的速度上不了。存储芯片的实现形式有两种,别离是DRAM和SRAM,SRAM的速度其实也始终尽可能跟着CPU在跑的。那为什么不必SRAM来制作内存?这个也很简略,就是因为它存储密度低而且巨贵(绝对于DRAM),所以出于老本考量当初内存条都是采纳DRAM的技术制作的。 SRAM容量小老本高,但速度快,DRAM容量大成本低,但速度慢。这俩能不能搭配应用,舍短取长?论断是必定的,在计算机科学里有个”局部性原理“,这个原理是计算机科学畛域所有优化的基石。我这里就单从数据拜访的局部性来说,某个地位的数据被拜访,那么相邻于这个地位的数据更容易被拜访。那么利用这点,咱们是不是能够把以后最可能被用到的小局部数据存储在SRAM里,而其余的局部持续保留在DRAM中,用很小的一块SRAM来当DRAM的缓存,基于这个思路,于是CPU芯片里就有了Cache,CPU的设计者们感觉一层缓存不够,那就给缓存再加一层缓存,于是大家就看到当初的CPU里有了所谓的什么L1 Cache、L2 Cache, L3 Cache。 存储示意图如下,实在CPU如右图(Intel I7某型号实物图): 多级缓存的呈现,极大水平解决了主存访问速度和CPU运算速度的矛盾,但这种设计也带来了一个新的问题。CPU运算时不间接和主存做数据交互,而是和L1 Cache交互,L1 cache 又是和L2 Cache交互…… 那么肯定意味着同一份数据被缓存了多份,各层存储之间的数据一致性如何保障? 如果是单线程还好,毕竟查问同一时间只会在一个外围上运行。但当多线程须要操作同一份数据时,数据一致性的问题就凸显进去了,如下图,咱们举个例子。 在上图中3个CPU外围各自的Cache别离持有了不同的a0值(先疏忽E和I标记),实际上只有Cache0里才持有正确的数值。这时候,如果CPU1或者CPU2须要拿着Cache中a0值去执行某些操作,那后果可想而知。如果想保障程序在多线程环境下正确运行,就首先得保障Cache里的数据能在"失当"的工夫生效,并且无效的数据也能被及时回写到主存里。 然而CPU是不晓得以后时刻下哪些数据该生效、哪些该回写、哪些又是能够接着应用的。这个时候其实CPU的设计者也很犯难,如果数据频繁生效,CPU每次获取必须从主存里获取数据,CPU理论运算能力将回到几十年前的程度。如果始终不给不生效,就会呈现数据不统一导致的问题。于是CPU的设计者不干了:”这个问题我解决不了,我给你们提供一些能够保证数据一致性的汇编指令,你们本人去解决”。 于是大家就在intel、arm的开发手册上看到了像xchg、lock、flush……之类的汇编指令,C/C++语言和操作系统的开发者将这些封装成了volatile、atomic……以及各种零碎调用,JVM和JDK的开发者又把这些封装了我在文首说的那一堆关键词。 于是CPU的设计者为了晋升性能导致数据一致性的问题,最终还是推给了下层开发者本人去解决。 作为下层的开发者们(比方咱们)就得判断,在多线程环境下那些数据操作必须是原子操作的,这个时候必须应用Unsafe.compareAndSwap()来操作。还有那些数据是不能被CPU Cache缓存的,这个时候就得加volatile关键词。极其状况下,你能够所有的操作搞成原子操作、所有的变量都申明成volatile,尽管这样确实能够保障线程平安,但也会因为主存拜访延时的问题,显著升高代码运行的速度。这个时候局部性原理又施展出其神奇的价值,在理论状况下,绝大多数场景都是线程平安的,咱们只须要保障某些要害操作的线程安全性即可。举个简略的例子,咱们在工作向多线程散发的时候,只须要保障一个工作同时只被分发给一个线程即可,而不须要保障整个工作执行的过程都是齐全线程平安的。 作为Java开发者,Java和JDK的开发者们曾经帮咱们在很多场景下封装好了这些工具,比方咱们就拿ReentrantLock实现一个多线程计数器的例子来看。 其中increment() 自身不是一个线程平安的办法,如果多个线程并发去调用,依然会呈现count值增长不精确的问题。但在lock的加持下,咱们能保障increment()办法同时只能有一个线程在执行。设想下,如果咱们把上述代码中的counter()办法换成一些更简单的办法,而齐全不须要在办法中去思考线程平安的问题,这不就实现了仅在要害操作上保障准确性就能保障全局的线程平安吗!而当咱们去深究lock的实现时,就会发现它底层也只是在tryAcquire中应用CAS设置了state值。 在多线程编程中,加锁或加同步其实是最简略的,然而在什么时候什么中央加锁却是一件非常复杂的事件。你须要思考锁的粒度的问题,粒度太大可能影响性能,粒度过小可能导致线程平安的问题。还须要思考到加锁程序的问题,加锁程序不当可能会导致死锁。还要思考数据同步的问题,同步的数据越多,CPU Cache带来的性能晋升也就越少…… 从下面CPU的倒退变动咱们能够看到,古代CPU的实质其实也是一个分布式系统,很多时候仍须要编程者手动去解决数据不一致性的问题。当然随着编程语言的倒退,这些底层相干的货色也逐步对一般程序员变得更透明化,咱们是不是能够料想,将来是不是会有一门高性能、并且齐全不须要程序员关注数据一致性的编程语言呈现? 最初下面计数器代码给大家留一个思考题: 代码中的counter变量申明是否须要加volatile关键字?

April 30, 2023 · 1 min · jiezi

关于cpu:CPU基础知识详解

冯·诺依曼计算机 冯·诺依曼计算机由存储器、运算器、输出设施、输出设备和控制器五局部组成。 哈佛构造 哈佛构造是一种将程序指令存储和数据存储离开的存储器构造,它的次要特点是将程序和数据存储在不同的存储空间中,即程序存储器和数据存储器是两个独立的存储器,每个存储器独立编址、独立拜访,目标是为了加重程序运行时的访存瓶颈。哈佛架构的中央处理器典型代表ARM9/10及后续ARMv8的处理器,例如:华为鲲鹏920处理器。 组成计算机的根底硬件都须要与主板(Motherboard)连贯 计算机根底硬件 (2) Opening the Box(Apple IPad2) 手机的内部结构 – 华为Mate30 Pro 主板(来自于 Tech Insights) 主板 反面 射频板 Inside the Processor (CPU) Datapath(数据通路): performs operationson dataControl: sequences datapath, memory, ...Register 寄存器Cache memory 缓存 Small, fast: SRAM(动态随机拜访存储器)memory for immediate access to data Intel Core i7-5960X 毅力号CPU曝光:250nm工艺、23年旧架构、主频仅233MHz 毅力号搭载的处理器是20多年前技术的产品。处理器型号为PowerPC 750处理器,与1998年苹果出品的iMac G3 电脑同款,PowerPC 750 处理器最高主频速度仅233MHz,且晶体管数量也只有600 万个,但单价仍高达20 万美元(约130万元)。抗辐射、耐凛冽-55~125℃ 比照苹果最近推出的M1ARM 架构处理器领有最高主频3.2GHz,晶体管数量达160 亿个。 ...

March 19, 2023 · 6 min · jiezi

关于cpu:从一次CPU打满到ReDos攻击和防范

作者:京东物流 刘海茂 近期碰到一起值班报警事件,web 应用服务器 CPU 耗费打到 99%,排查后发现是因为 ReDoS 导致了服务器产生了资源被耗尽、拜访零碎迟缓的问题,通过排查过程从而分享下 ReDos 攻打的原理、常见场景以及防备和解决方案,如果有谬误欢送斧正。 背景值班的时候忽然报警,web 应用服务器 CPU 耗费打到 99%,同时现场反馈系统拜访迟缓 登录泰山平台,查看 ump 监控发现零碎耗费 CPU 耗费忽然被打满 通过 java 自带的 dump 工具,下载 jstock 文件,发现有大量雷同工作线程在运行,具体的堆栈信息如下 认真查看这些线程的执行代码,发现都调用了 UrlUtil.extractDomain 这个办法 依据堆栈信息查看业务代码,发现是 joybuy 登录拦截器用正则表达式匹配拜访 url 解析主域的办法呈现了阻塞,至此,能够判断是因为 ReDoS 导致了服务器产生了资源被耗尽、拜访零碎迟缓的问题,那么,什么是 ReDoS 呢? ReDos 简介ReDoS 攻打(正则表达式拒绝服务攻打 (Regular Expression Denial of Service)),攻击者可结构非凡的字符串,导致正则表达式运行会耗费大量的内存和 cpu 导致服务器资源被耗尽。无奈持续响应,那为何不确定的正则表达式会导致 redos 攻打呢?这得从正则表达式的实现原理说起 原理 目前实现正则表达式引擎的形式有两种 DFA 自动机(Deterministic Finite Automaton,确定无限状态自动机)NFA 自动机(Nondeterministic Finite Automaton,非确定无限状态自动机)DFA 自动机的结构代价远大于 NFA 自动机,但 DFA 自动机的执行效率高于 NFA 自动机假如一个字符串的长度为 n,如果采纳 DFA 自动机作为正则表达式引擎,则匹配的工夫复杂度为 O (n)如果采纳 NFA 自动机作为正则表达式引擎,NFA 自动机在匹配过程中存在大量的分支和回溯,假如 NFA 的状态数为 s,则匹配的工夫复杂度为 O(ns)NFA 自动机的劣势是反对更多高级性能,但都是基于子表达式独立进行匹配因而在编程语言里,应用的正则表达式库都是基于 NFA 自动机实现的NFA 的个性: ...

March 1, 2023 · 2 min · jiezi

关于cpu:DatenLord前沿技术分享-No13

1、演讲题目异步事件驱动的电路机制 & 基于RISC-V的全异步超标量CPU体系结构 2、演讲工夫2022年12月25日上午10:30 3、演讲人何安平 副教授 4、引言在传统硅基芯片畛域,随着芯片规模的急剧增大和半导体工艺的继续提高,解决超大规模集成电路中带来的跨时钟域、时钟抖动等引起的问题日益突出,为解决以上问题,一种勾销时钟机制的电路状态异步电路产生。异步电路类型泛滥,基于束缚绑定握手协定的新型绑定型异步电路是以后异步电路的最新进展,咱们将联合基于RISC-V的全异步CPU体系结构展开讨论。 5、内容简介异步电路的工作机制由电路逻辑产生的事件来实现,不依赖于晶振产生的时钟 。特定工作合成为事件流(序列),事件流驱动异步芯片执行工作,事件与数据可对立编码,也可拆散解决,最终造成具备特定性能的电路子系统,子系统受事件驱动而履行其性能。咱们课题组基于异步机制已研发7颗全异步芯片其中40nm制程下的1512颗轻量级众核芯片的典型功耗仅98毫瓦,面积96平方毫米,蕴含3.5亿颗晶体管。 6、直播预约欢迎您预约直播,或者登陆腾讯会议观看直播: 会议号:581-8301-3525

December 23, 2022 · 1 min · jiezi

关于cpu:性能透明提升-50SMC-ERDMA-云上超大规模高性能网络协议栈

编者按:以后内核网络协议栈有什么问题?新的协定栈是不是从新创造轮子?一个协定栈是否解决所有问题?适配所有场景?本文整顿自2022 年阿里巴巴开源凋谢周技术演讲,这里咱们将本人的思考分享进去,和大家一起交换。视频回放已上线至龙蜥官网(首页-动静-视频),欢送大家观看。 本文次要分为三局部:第一局部是咱们为什么须要一个新的内核网络协议栈,咱们是不是在反复创造轮子?第二局部是 SMC + ERDMA 的原理、优劣等等,疾速为大家理解 SMC 技术。第三局部是 SMC-R 在网易 Curve 分布式系统的实际。 一、咱们为什么须要一个新的内核网络协议栈?以后内核网络协议栈有什么问题?新的协定栈是不是从新创造轮子?一个协定栈是否解决所有问题?适配所有场景?这里咱们将本人的思考分享进去,和大家一起交换。 首先我想要抛出一个观点,没有一个网络栈是万能的,之于此没有银弹。要谈现状,离不开背景: 第一是 100G/400G 网络的遍及,此时 CPU 是瓶颈。第二是云、规模,以后越来越多的业务迁徙到云上,云上反对传统 RDMA 网卡老本很高。第三是 DPU,硬件卸载,承接第一点,CPU 成为瓶颈后,是否能够让网络栈将越来越多的逻辑卸载到网卡和 DPU 上,让 CPU 做更多更重要的事件。咱们如何均衡吞吐和时延?或者说如何用起码的 CPU 达到雷同的吞吐,如何尽可能地升高时延。首先 Linux 内核的网络栈偏向于吞吐,而不是时延。晋升吞吐很重的一点是,升高拷贝的开销。在大包吞吐的场景,咱们很容易看到拷贝占据了 CPU 的绝大部分工夫。而且内核网络栈的 context switch 开销,拷贝开销也会减少额定的时延。 那么这个问题变成了抉择在内核态还是用户态实现一个网络栈?我想很多利用,或者说云上 99% 以上的利用应用的是 socket 接口,如果侵入性革新,对于用户态计划最大的壁垒。比方 DPDK 等,此时不仅仅是革新老本,也包含了运维老本、部署老本等等。当然用户态也能够劫持 socket 实现用户态协定栈,但此时 zero copy 等劣势不在。并且同样须要革新,此处的革新是运维革新,调度革新和环境革新,这也是额定的老本。此时用户态的劣势也不再显著。 软件 vs 硬件卸载?一开始 Linux 网络栈,例如 TCP 协定是从纯软件实现到越来越多的将性能卸载到网卡,甚至 TOE 齐全卸载到网卡。如果提到卸载到网卡,是不是能够用一种更加成熟的硬件卸载计划?也就是 RDMA,也就是传统以太网卡 vs RDMA 网卡,局部卸载到成熟的齐全卸载。RDMA 网络自身有规模的限度,咱们能够在小规模把 RDMA 网络玩得很好。那是否有一种大规模 RDMA 的能力。咱们当初看到的是阿里云公布的 ERDMA 网络,一种普惠、高性能、齐全兼容 RDMA 的生态。咱们借助 SMC + ERDMA 能够实现硬件卸载 RDMA 、大规模部署,二者相辅相成。 ...

September 16, 2022 · 3 min · jiezi

关于cpu:如何理解处理器CPU多处理器内核多核

最早的时候,人们制作了一台计算用的集成电路(Circuit,或者IC) ,用树脂包起来,做成一个小片片(Chip),把它装在电路板(PCB)上,做成一台计算机(Computer),他们把这个小片片和其它小片片做了辨别,叫它中央处理器(CPU),写软件的人简略叫它处理器(Processor)。 这个阶段,不同的词,它们指的根本是同一个货色。 起初技术倒退了,为了提供更强的能力,他们首先把多个Chip装到同一个PCB中,这样,就呈现一台计算机,有多个Chip的状况,他们把这个叫做Multi-Processor,MP。如果这些Processor能够一样看待,不须要每个非凡解决,就叫同构多解决(SMP),否则就叫异步多解决(AMP)。 MP要把电路拉远,没有封装在一台计算机外面高效,所以又有人在一个Chip外面,把计算的电路做了多份,每份叫一个“外围”或者你这里翻译为内核了(Core),而仍把封装起来的整个Chip叫一个CPU。 但软件曾经把一个执行的硬件单元叫CPU了(也就是硬件认为的Core),从这里开始,软件和硬件用的名字指的就不是一个货色了。而对中文来说,软件把操作系统用来治理所有资源的那个被爱护的软件部件,也叫内核(Kernel),而把每个被治理的软件部件,叫解决者(Process,中文翻译为“过程”),这就更加容易引起人们的误会。实际上,无论Kernel还是Process,都是软件,是运行在CPU/Core上的货色,只是软件外部的辨别。就好比咱们人的躯体和思考的关系一样,CPU是躯体,软件是魂魄,Kernel是魂,Process是魄(当然咱们不细究两者确切的语义) Core越来越多,一个电路曾经很难制作了,他们开始离开造,再封装在一个Chip外面,那个独立制作的电路,有人叫它一个DIE,也有人叫它一个Cluster。软件其实不关怀,软件只关怀一共有多少“CPU”(芯片说的“Core”),但CPU们地位不一样,导致拜访内存的速度不一样,所以软件会认为他们在不同的“区域”(zone)上。 为了进一步优化Core,设计师发现Core的很多电路大部分时候都闲着,他们就让多个核复用这些电路。这样看起来一个硬件的Core,提供了多个软件看到的CPU,他们把这样的CPU,叫“硬线程”(hyper-thread)。 好了,不晓得你作为软件工程师晕掉没有?软件工程师就要求:别那么多废话了,就说你有多少个“假CPU”吧,我都对立解决好了。 但硬件说,我有30个A cpu,10个B CPU,4个C CPU,15个MPU(微处理器,了解为更简略的CPU吧),其中A CPU里有2连个硬线程,三种连法,B有一个硬线程,四种配置… 软件说,打住打住……算了,这样吧,咱们离开说,你CPU都一样给我的,咱们叫它SMP(留神这个名字的意思曾经和后面不同了),这种CPU我对立用,内存也对立拜访。如果你不是这样的,我叫它“非对称多解决”(AMP),那个你再一个个跟我说怎么用好了。 读者晕掉没有?有没有都来让我来洗一下脑,都用咱们服务器芯片上的定义吧:) 一个独立的硬件处理单元,被软件看做是“CPU”的货色,咱们叫Core。但有例外:Core能够有多个超线程(hyper-thread,HT),如果有HT,每个HT就是一个软件看到的CPU,但它并不具备所有计算资源。 多个共享一级cache的Core,咱们叫一个Cluster。 多个cluster组合能够被自由组合封装的电路,咱们叫一个超级 CPU CLUSTER(SCCL)。咱们还能够把网卡,sas等货色封装成超级IO cluster(SICL),从而提供超过PCIE速度的更靠近CPU的IO设施(比方100G的网口)。 把多个sccl和sicl组合在一起,封在树脂里,咱们称为一个chip。 多个chip放到一个电路板中,外面的core作为SMP应用,每个chip称为一个Processor,或者从PCB的角度,又叫一个插槽(Socket)。 电路板加上各种外网电路,封装成一台服务器,咱们叫一台Machine,多个Machine组合成一个柜子,咱们称为一个Rack。对外做广告,咱们称咱们一个Rack能够提供超过1万个,工作主频2.6G+的Core:

September 11, 2022 · 1 min · jiezi

关于cpu:性能提升1倍成本直降50基于龙蜥指令加速的下一代云原生网关

文 / Intel Arch SIG 技术背景网络信息传输的可靠性、机密性和完整性要求日渐晋升,HTTPS 协定曾经广泛应用。HTTPS 的 SSL/TLS 协定波及加解密、校验、签名等密码学计算,耗费较多 CPU 计算资源。因而 CPU 硬件厂商推出过多种减速卸载计划,如 AES-NI、QAT、KAE、ARMv8 平安扩大等。 业界软件生态在优化 HTTPS 的性能上也做了诸多摸索(参考[1]),传统的软件优化计划有 Session 复用、OCSP Stapling、False Start、dynamic record size、TLS1.3、HSTS 等, 但软件层面的优化无奈满足流量日益增长的速度,CPU 硬件加速成为业界一个通用的解决方案。 CPU 新个性不久前公布的第三代英特尔®至强®可扩大处理器(代号 Ice Lake),单核性能晋升 30%,整机算力晋升 50% 以上(参考[9])。 ISA 指令集在传统的 AES-NI 减速指令根底上,Ice Lake 新增了基于 Intel® Advanced Vector Extensions 512(Intel® AVX-512)的 Intel® Crypto Acceleration 个性,包含 Vector AES(VAES)、Integer Fused Multiply Add(IFMA 大数计算)、Galois Field New Instructions(GFNI)等(参考[2])。同时也补充反对了 SHA extension(SHA-NI),补足了上一代的 SHA256 性能短板。 (图 1/ Ice Lake 新增 Intel AVX512 指令集) ...

August 31, 2022 · 2 min · jiezi

关于cpu:关于-Intel-在-microvm-快速启动的探索及实例演示-第-3638-期

本周「龙蜥大讲堂」预报来啦!邀请了龙蜥云原生 SIG 成员及 Intel 资深云计算软件工程师臧锐来分享《云原生 SIG 组件引入》《利用 micro-VM 快照机制对 FaaS 冷启动减速的摸索与实际》、鉴释科技 CEO 梁宇宁分享《RISC-V 高性能编译器》、龙蜥云原生 SIG 成员分享《RunD ATC 论文分享与开源介绍》,快来扫码入群,预约前排小板凳观看直播吧! 直播主题及内容介绍一、利用 micro-VM 快照机制对 FaaS 冷启动减速的摸索与实际 直播工夫:2022 年 08 月 02 日 (周二)14:00-16:00 直播内容: 议题 1:龙蜥云原生 SIG 组件引入标准 议题 2:技术分享:利用 micro-VM 快照机制对 FaaS 冷启动减速的摸索与实际 听众受害: 本次双周会会进一步探讨 SIG 组件引入的标准,同时由 Intel 资深云计算软件架构师介绍 Intel 在 micro-vm 疾速启动的摸索,听众能够获取云原生函数计算场景下,实例疾速置备、疾速启动的解决方案。 适宜人群:容器、函数计算、云原生畛域的开发者、爱好者。 讲师介绍: 臧锐:龙蜥云原生 SIG 成员、Intel 资深云计算软件工程师 如何加入直播? 钉钉扫描下方海报二维码入群即可加入本次直播。 二、RISC-V 高性能编译器 直播工夫:2022 年 08 月 03 日 (周三)16:00-17:00 直播内容: ...

August 3, 2022 · 2 min · jiezi

关于cpu:SPDK对接Ceph性能优化

作者:天翼云 谭龙关键词:SPDK、NVMeOF、Ceph、CPU负载平衡 SPDK是intel公司主导开发的一套存储高性能开发套件,提供了一组工具和库,用于编写高性能、可扩大和用户态存储利用。它通过应用一些关键技术实现了高性能:1.将所有必须的驱动程序移到用户空间,以防止零碎调用并且反对零拷贝拜访2.IO的实现通过轮询硬件而不是依赖中断,以升高时延3.应用消息传递,以防止IO门路中应用锁SPDK是一个框架而不是分布式系统,它的基石是用户态(user space)、轮询(polled-mode)、异步(asynchronous)和无锁的NVMe驱动,其提供了零拷贝、高并发间接用户态拜访SSD的个性。SPDK的最后目标是为了优化块存储落盘性能,但随同继续的演进,曾经被用于优化各种存储协定栈。SPDK架构分为协定层、服务层和驱动层,协定层蕴含NVMeOF Target、vhost-nvme Target、iscsi Target、vhost-scsi Target以及vhost-blk Target等,服务层蕴含LV、Raid、AIO、malloc以及Ceph RBD等,driver层次要是NVMeOF initiator、NVMe PCIe、virtio以及其余用于长久化内存的driver等。 SPDK架构Ceph是目前利用比拟宽泛的一种分布式存储,它提供了块、对象和文件等存储服务,SPDK很早就反对连贯Ceph RBD作为块存储服务,咱们在应用SPDK测试RBD做性能测试时发现性能达到肯定规格后无奈持续晋升,影响产品的综合性能,通过多种定位办法并联合现场与代码剖析,最终定位问题起因并解决,过程如下。1.测试方法:启动SPDK nvmf_tgt并绑定0~7号核,./build/bin/nvmf_tgt -m 0xff,创立8个rbd bdev,8个nvmf subsystem,每个rbd bdev作为namespace attach到nvmf subsystem上,开启监听,initiator端通过nvme over rdma连贯每一个subsystem,生成8个nvme bdev,应用fio对8个nvme bdev同时进行性能测试。2.问题:咱们搭建了一个48 OSD的Ceph全闪集群,集群性能大概40w IOPS,咱们发现最高跑到20w IOPS就上不去了,无论减少盘数或调节其余参数均不见效。3.剖析定位:应用spdk_top显示0号核绝对其余核更加繁忙,持续加压,0号核繁忙水平减少而其余核则减少不显著。 查看poller显示rbd只有一个poller bdev_rbd_group_poll,与nvmf_tgt_poll_group_0都运行在id为2的thread上,而nvmf_tgt_poll_group_0是运行在0号核上的,故bdev_rbd_group_poll也运行在0号核。[root@test]# spdk_rpc.py thread_get_pollers{  "tick_rate": 2300000000,  "threads": [    {      "timed_pollers": [        {          "period_ticks": 23000000,          "run_count": 77622,          "busy_count": 0,          "state": "waiting",          "name": "nvmf_tgt_accept"        },        {          "period_ticks": 9200000,          "run_count": 194034,          "busy_count": 194034,          "state": "waiting",          "name": "rpc_subsystem_poll"        }      ],      "active_pollers": [],      "paused_pollers": [],      "id": 1,      "name": "app_thread"    },    {      "timed_pollers": [],      "active_pollers": [        {          "run_count": 5919074761,          "busy_count": 0,          "state": "waiting",          "name": "nvmf_poll_group_poll"        },        {          "run_count": 40969661,          "busy_count": 0,          "state": "waiting",          "name": "bdev_rbd_group_poll"        }      ],      "paused_pollers": [],      "id": 2,      "name": "nvmf_tgt_poll_group_0"    },    {      "timed_pollers": [],      "active_pollers": [        {          "run_count": 5937329587,          "busy_count": 0,          "state": "waiting",          "name": "nvmf_poll_group_poll"        }      ],      "paused_pollers": [],      "id": 3,      "name": "nvmf_tgt_poll_group_1"    },    {      "timed_pollers": [],      "active_pollers": [        {          "run_count": 5927158562,          "busy_count": 0,          "state": "waiting",          "name": "nvmf_poll_group_poll"        }      ],      "paused_pollers": [],      "id": 4,      "name": "nvmf_tgt_poll_group_2"    },    {      "timed_pollers": [],      "active_pollers": [        {          "run_count": 5971529095,          "busy_count": 0,          "state": "waiting",          "name": "nvmf_poll_group_poll"        }      ],      "paused_pollers": [],      "id": 5,      "name": "nvmf_tgt_poll_group_3"    },    {      "timed_pollers": [],      "active_pollers": [        {          "run_count": 5923260338,          "busy_count": 0,          "state": "waiting",          "name": "nvmf_poll_group_poll"        }      ],      "paused_pollers": [],      "id": 6,      "name": "nvmf_tgt_poll_group_4"    },    {      "timed_pollers": [],      "active_pollers": [        {          "run_count": 5968032945,          "busy_count": 0,          "state": "waiting",          "name": "nvmf_poll_group_poll"        }      ],      "paused_pollers": [],      "id": 7,      "name": "nvmf_tgt_poll_group_5"    },    {      "timed_pollers": [],      "active_pollers": [        {          "run_count": 5931553507,          "busy_count": 0,          "state": "waiting",          "name": "nvmf_poll_group_poll"        }      ],      "paused_pollers": [],      "id": 8,      "name": "nvmf_tgt_poll_group_6"    },    {      "timed_pollers": [],      "active_pollers": [        {          "run_count": 5058745767,          "busy_count": 0,          "state": "waiting",          "name": "nvmf_poll_group_poll"        }      ],      "paused_pollers": [],      "id": 9,      "name": "nvmf_tgt_poll_group_7"    }  ]}再联合代码剖析,rbd模块加载时会将创立io_channel的接口bdev_rbd_create_cb向外注册,rbd bdev在创立rbd bdev时默认做bdev_examine,这个流程会创立一次io_channel,而后销毁。在将rbd bdev attach到nvmf subsystem时,会调用创立io_channel接口,因为nvmf_tgt有8个线程,所以会调用8次创立io_channel接口,但disk->main_td总是第一次调用者的线程,即nvmf_tgt_poll_group_0,而每个IO达到rbd模块后bdev_rbd_submit_request接口会将IO上下文调度到disk->main_td,所以每个rbd的线程都运行在0号核上。 ...

June 2, 2022 · 2 min · jiezi

关于cpu:故障分析-大量短时进程导致-cpu-负载过高案例一则

作者:任坤 现居珠海,先后负责专职 Oracle 和 MySQL DBA,当初次要负责 MySQL、mongoDB 和 Redis 保护工作。 本文起源:原创投稿 *爱可生开源社区出品,原创内容未经受权不得随便应用,转载请分割小编并注明起源。 1、背景某我的项目的开发环境,单台虚拟机装了1套mongo集群用于测试,1个mongos + 3节点config + 1shard * 3正本,总计7个mongo实例。 mongo版本4.2.19,OS为centos 7.9。 测试完结后cpu负载始终维持在50%左右,而此时mongo的qps曾经降落为0。 这台机器上只装置了mongo,将所有mongo实例敞开,cpu负载立刻恢复正常,再将mongo实例开启,过了一会cpu负载又开始飙升。场景能复现,且确认是跟mongo实例有关系。 2、诊断执行top命令,cpu的usr曾经达到了40%,然而前几个过程的%cpu加起来远远凑不够数。 查看mongos的qps,的确没有执行用户命令了。 dstat查看整体负载(vmstat格式化做的不好,最初几列总是对不齐整)。 除了cpu负载不失常,其余指标均失常,中断和上下文切换也不算高,不太可能是这两个引发的。perf record -ag -- sleep 10 && perf report 查看cpu执行状况。 的确有大量mongo调用,然而API命名不直观,无奈猜想对应的执行逻辑。 至此,确认是mongo实例引发的问题,然而mongo的利用连贯为0,看调用API栈也找不到有用信息。 回到本文结尾,top过程的cpu利用率加起来远远小于cpu总体负载,大概率是有频繁短时过程偷走了这部分CPU资源,导致top命令来不及捕捉统计。 sar -w 1 查看每秒生成的过程数,均匀每秒新建80多个过程,应该就是它了。 要抓出频繁建设短时过程的利用,能够采纳execsnoop,该工具通过 ftrace 实时监控过程的 exec() 行为,并输入短时过程的根本信息, 包含过程 PID/PPID、命令行参数。 #下载execsnoop#cd /usr/binwget https://raw.githubusercontent.com/brendangregg/perf‐tools/master/execsnoopchmod 755 execsnoop 以下是输入内容,全是监控零碎在执行,不停的连贯mongo并对输入后果执行grep过滤,每个操作都会衍生一个新线程/过程,10s捕捉 了400多条记录。 将zabixx过程敞开,cpu马上恢复正常,找到了首恶。 咱们其余环境也采纳了zabbix监控,然而都没有遇到相似问题。 该节点部署了7个mongo实例,zabbix默认对每个mongo实例都进行监控,相当于执行损耗放大了7倍,而该机器是一台只有4核CPU的虚拟机。 这些因素凑齐了就会暴发问题。 这是个开发环境,临时敞开了zabbix监控,后续要对监控逻辑进行优化,尽量减少连贯db的次数以及grep调用链的长度。 3、小结当机器cpu负载继续低落却抓取不到top过程时,能够采纳execsnoop抓取短时过程,相似工具还有iosnoop、opensnoop。 ...

May 26, 2022 · 1 min · jiezi

关于cpu:嵌入式系统文件系统开发缓存的应用

一、前言最近开发一基于嵌入式零碎下的“文件系统”,前期测试呈现一些离奇的BUG,经审查和排故发现是开启了缓存加上DMA搬运数据导致的CACHE不统一问题。当初就来分享一下。 二、缓存改文件系统的利用场景是基于嵌入式操作系统,实现数据的无效记录。硬件设计基于Z7,BSP默认关上了CPU和主存之间的cache, 且写数据形式为写贯通。利用运行中,CPU通过cache拜访操作主存,而读写电子盘的驱动默认采纳DMA搬运数据到主存,这是cache不统一的根本原因。本文先介绍一下几个概念: cache line CPU cache的构造是由很多Cache Line组成的。每条cache line都有两个标记位。无效位(valid bit) 示意cache line的数据是否无效。零碎刚启动时,数据都置有效。脏位(dirty bit) 示意cache line的数据是否和下一级缓存统一。0统一,1不统一命中(Hit) CPU要拜访的数据在Cache中有缓存。成为命中(Hit),反之为缺失(Miss)DMA(Direct Memory Acess) 间接存储器拜访,是一种不通过CPU而间接从内存存取数据的数据交换形式。否则,CPU须要从起源把每一片段的材料复制到暂存器,而后把它们再次写回新的中央。三、缓存的读写形式写中转(write through) 任一从CPU收回的写信号送到cache的同时,也写入主存,以保障主存的数据可能同步更新。写回(write back) 如果当产生写操作时,数据曾经在 CPU Cache 里的话,则把数据更新到 CPU Cache 里,同时标记 CPU Cache 里的这个 Cache Block 为脏(Cache Block 的数据和内存是不统一);如果当产生写操作时,数据所对应的 Cache Block 里寄存的是「别的内存地址的数据」的话,就要检 查这个 Cache Block 里的数据有没有被标记为脏的,如果是脏的话,咱们就要把这个 Cache Block 里的数据写回到内存,而后再把以后要写入的数据,写入到这个 Cache Block 里,同时也把它标记为 脏的;如果 Cache Block 外面的数据没有被标记为脏,则就间接将数据写入到这个 Cache Block 里,而后再把这个 Cache Block 标记为脏。 读贯通(read through)CPU的所有对主存的数据申请都先送到cache,如果命中,则不申请拜访主存,并将数据送出;如果不命中,则向主存申请数据。读旁路(read aside) CPU收回数据申请时,并不是单通道地穿过Cache。而是向Cache和主存同时发出请求。因为Cache速度更快,如果命中,则Cache在将数据回送给CPU的同时,还来得及中断CPU对主存的申请;不命中。则Cache不做任何动作。由CPU间接拜访主存。四、利用场景文件系统是基于vxWorks开发的。针对CACHE不统一问题,剖析vxWorks零碎提供的cacheLib,提出两种解决办法: 所有通过DMA操作的数据都用cacheDmaMalloc申请内存空间 默认用malloc申请的内存不是缓存平安的。用cacheDmaMalloc能够为DMA设施和驱动调配缓存平安的内存缓冲。调用cacheFlush和cacheInvalidate解决问题 cacheFlush强制将缓冲的数据更新到内存。对于写贯通类型,cacheFlush什么都不须要做因为内存和缓存条目是匹配的。cacheInvalidate将所有的缓冲条目都设置为有效,齐全切断内存和缓冲之间的分割。本我的项目采纳的是第二种形式,间接在调用磁盘的读写驱动处减少cacheFlush和cacheInvalidate。在调用写驱动之前,调用cacheFlush强制将缓冲的数据更新到内存,保障写入磁盘的数据是从cache中拿到的最新的数据。在调用读驱动后,调用cacheInvalidate切断以后内存区域和cache的分割,保障后续CPU拜访该区域的时候,可能间接拜访内存而不是缓存中可能存在的旧数据。 int rawFsBlkWrt(unsigned int startsector,int nsectors,char *pdata, const char *devname){ STATUS stats = ERROR; BLK_DEV * pdev = NULL; int ldrs_num = -1; int i = 0; for(i=0;i<LDRS_NUM;i++) { if(ldrs_handle[i].ldrs_valid_flag == LDRS_HANDLE_VALID_FLAG) { if(0==strcmp(devname,ldrs_handle[i].ldrs_name)) { ldrs_num = i; break; } } } if(ldrs_num<0) { ldrs_errno = ERR_BLKDEV_INVALID; printf("ERR_BLKDEV_INVALID %s",(char *)devname); return -1; } if(pdata == NULL) { ldrs_errno = ERR_ADDR_IS_NULL; return ldrs_errno; } if(ERROR == semTake(ldrs_handle[ldrs_num].sem_blkdev,sysClkRateGet()*30)) { ldrs_errno = ERR_SEMPHONE_TAKE; return ldrs_errno; } cacheFlush(DATA_CACHE, (void*)pdata, nsectors); stats = fsBlkWrt(pdev,startsector,nsectors,pdata); semGive(ldrs_handle[ldrs_num].sem_blkdev); if(stats == ERROR) { ldrs_errno = ERR_BLK_WRITE; return ldrs_errno; } return DISC_OK; }int rawFsBlkRd(unsigned int startsector,int nsectors,char *pdata, const char *devname){ STATUS stats = ERROR; BLK_DEV * pdev = NULL; int ldrs_num = -1; int i = 0; for(i=0;i<LDRS_NUM;i++) { if(0==strcmp(devname,ldrs_handle[i].ldrs_name)) { ldrs_num = i; break; } } if(ldrs_num<0) { ldrs_errno = ERR_BLKDEV_INVALID; printf("ERR_BLKDEV_INVALID %s",(char *)devname); return -1; } if(pdata == NULL) { ldrs_errno = ERR_ADDR_IS_NULL; return ldrs_errno; } if(ERROR == semTake(ldrs_handle[ldrs_num].sem_blkdev,sysClkRateGet()*30)) { ldrs_errno = ERR_SEMPHONE_TAKE; return ldrs_errno; } stats = fsBlkRd(pdev,startsector,nsectors,pdata); cacheInvalidate(DATA_CACHE, pdata, nsectors); semGive(ldrs_handle[ldrs_num].sem_blkdev); if(stats == ERROR) { ldrs_errno = ERR_BLK_READ; return ldrs_errno; } return DISC_OK; }

January 28, 2022 · 2 min · jiezi

关于cpu:程序猿之电脑CPU的妙用

过期的电脑除了卖给废品收购站外,还有别的用处吗?:用电脑的CPU当作电热器来热早餐!无奈晓得理论的加热成果如何,不过想必厂商是不会心愿看到他们的处理器还有充当电热器的作用吧? CPU充当电热器 这个所谓的“早餐盘”具备一台规范电脑的所有组件,包含显示器、主板、显卡、硬盘、处理器等。不同于惯例电脑的是,它没有机箱,取而代之的是一块槽形木板扣在主板上。木板上在处理器的地位开了一个圆形的洞,洞的大小跟咖啡杯差不多。 AMD K5处理器 这台“早餐盘电脑”采纳的处理器为133MHZ的 AMD K5。整个零碎的工作原理异样简略,只有关上电脑失常工作,而后把咖啡杯间接放在处理器上加热就行了。同时在小木板上还能够放上面包和小菜,这样就能够边打电脑边吃早点啦!CPU上煮咖啡滋味看起来着实不错

September 17, 2021 · 1 min · jiezi

关于cpu:干掉讨厌的-CPU-限流让容器跑得更快

简介: 让人厌恶的 CPU 限流影响容器运行,有时人们不得不就义容器部署密度来防止 CPU 限流呈现。本文介绍的 CPU Burst 技术能够帮忙您既能保障容器运行服务质量,又不升高容器部署密度。文章分为高低两篇,该文为上篇,下篇将分析应用 CPU Burst 和其余防止限流伎俩的区别,以及如何配置 CPU Burst 性能以达到最佳成果。 在 K8S 容器调度中,容器的 CPU 资源下限是由 CPU limits 参数指定。设置 CPU 资源下限能够限度个别容器耗费过多的 CPU 运行工夫,并确保其余容器拿到足够的 CPU 资源。CPU limits 限度在 Linux 内核中是用 CPU Bandwidth Controller 实现的,它通过 CPU限流限度 cgroup 的资源耗费。所以当一个容器中的过程应用了超过 CPU limits 的资源的时候,这些过程就会被 CPU 限流,他们应用的 CPU 工夫就会受到限制,过程中一些要害的提早指标就会变差。 面对这种状况,咱们应该怎么办呢?个别状况下,咱们会联合这个容器日常峰值的 CPU 利用率并乘以一个绝对平安的系数来设置这个容器的 CPU limits ,这样咱们既能够防止容器因为限流而导致的服务质量变差,同时也能够兼顾 CPU 资源的利用。举个简略的例子,咱们有一个容器,他日常峰值的 CPU 使用率在 250% 左右,那么咱们就把容器 CPU limits 设置到 400% 来保障容器服务质量,此时容器的 CPU 利用率是 62.5%(250%/400%)。 然而生存真的那么美妙么?显然不是!CPU 限流的呈现比预期频繁了很多。怎么办?仿佛看上去咱们只能持续调大 CPU limits 来解决这个问题。很多时候,当容器的 CPU limits 被放大 5~10 倍的时候,这个容器的服务质量才失去了比拟好的保障,相应的这时容器的总 CPU 利用率只有 10%~20%。所以为了应答可能的容器 CPU 应用顶峰,容器的部署密度必须大大降低。 ...

August 11, 2021 · 2 min · jiezi

关于cpu:带你探索CPU调度的奥秘

摘要:本文将会从最根底的调度算法说起,一一剖析各种支流调度算法的原理,带大家一起摸索CPU调度的神秘。本文分享自华为云社区《摸索CPU的调度原理》,作者:元闰子。 前言软件工程师们总习惯把OS(Operating System,操作系统)当成是一个十分值得信赖的管家,咱们只管把程序托管到OS上运行,却很少深刻理解操作系统的运行原理。的确,OS作为一个通用的软件系统,在大多数的场景下都体现得足够的优良。但仍会有一些非凡的场景,须要咱们对OS进行各项调优,能力让业务零碎更高效地实现工作。这就要求咱们必须深刻理解OS的原理,不仅仅只会使唤这个管家,还能懂得如何让管家做得更好。 OS是一个十分宏大的软件系统,本文次要摸索其中的冰山一角:CPU的调度原理。 说起CPU的调度原理,很多人的第一反馈是基于工夫片的调度,也即每个过程都有占用CPU运行的工夫片,工夫片用完之后,就让出CPU给其余过程。至于OS是如何判断一个工夫片是否用完的、如何切换到另一个过程等等更深层的原理,理解的人仿佛并不多。 其实,基于工夫片的调度只是泛滥CPU的调度算法的一类,本文将会从最根底的调度算法说起,一一剖析各种支流调度算法的原理,带大家一起摸索CPU调度的神秘。 CPU的上下文切换在摸索CPU调度原理之前,咱们先理解一下CPU的上下文切换,它是CPU调度的根底。 现在的OS简直都反对"同时"运行远大于CPU数量的工作,OS会将CPU轮流调配给它们应用。这就要求OS必须晓得从哪里加载工作,以及加载后从哪里开始运行,而这些信息都保留在CPU的寄存器中,其中行将执行的下一条指令的地址被保留在程序计数器(PC)这一非凡寄存器上。咱们将寄存器的这些信息称为CPU的上下文,也叫硬件上下文。 OS在切换运行工作时,将上一工作的上下文保留下来,并将行将运行的工作的上下文加载到CPU寄存器上的这一动作,被称为CPU上下文切换。 CPU上下文属于过程上下文的一部分,咱们常说的过程上下文由如下两局部组成: 用户级上下文:蕴含过程的运行时堆栈、数据块、代码块等信息。零碎级上下文:蕴含过程标识信息、过程现场信息(CPU上下文)、过程管制信息等信息。这波及到两个问题:(1)上一工作的CPU上下文如何保留下来?(2)什么时候执行上下文切换? 问题1: 上一工作的CPU上下文如何保留下来? CPU上下文会被保留在过程的内核空间(kernel space)上。OS在给每个过程调配虚拟内存空间时,会调配一个内核空间,这部分内存只能由内核代码拜访。OS在切换CPU上下文前,会先将以后CPU的通用寄存器、PC等过程现场信息保留在过程的内核空间上,待下次切换时,再取出从新装载到CPU上,以复原工作的运行。 问题2: 什么时候执行上下文切换? OS要想进行工作上下文切换,必须占用CPU来执行切换逻辑。然而,用户程序运行的过程中,CPU曾经被用户程序所占用,也即OS在此刻并未处于运行状态,天然也无奈执行上下文切换。针对该问题,有两种解决策略,合作式策略与抢占式策略。 合作式策略依赖用户程序被动让出CPU,比方执行零碎调用(System Call)或者呈现除零等异样。但该策略并不靠谱,如果用户程序没有被动让出CPU,甚至是歹意死循环,那么该程序将会始终占用CPU,惟一的复原伎俩就是重启零碎了。 抢占式策略则依赖硬件的定时中断机制(Timer Interrupt),OS会在初始化时向硬件注册中断解决回调(Interrupt Handler)。当硬件产生中断时,硬件会将CPU的处理权交给来OS,OS就能够在中断回调上实现CPU上下文的切换。 调度的掂量指标对于一种CPU调度算法的好坏,个别都通过如下两个指标来进行掂量: 周转工夫(turnaround time),指从工作达到至工作实现之间的工夫,即T_{turnaround}=T_{completiong}-T_{arrival}Tturnaround=Tcompletiong−Tarrival响应工夫(response time),指从工作达到至工作首次被调度的工夫,即T_{response}=T_{firstrun}-T_{arrival}Tresponse=Tfirstrun−Tarrival两个指标从某种程度上是对抗的,要求高的均匀周转工夫,必然会升高均匀响应工夫。具体谋求哪种指标与工作类型无关,比方程序编译类的工作,要求周转工夫要小,尽可能快的实现编译;用户交互类的工作,则要求响应工夫要小,防止影响用户体验。 工作负载假如OS上的工作负载(也即各类工作运行的情况)总是变幻无穷的,为了更好的了解各类CPU调度算法原理,咱们先对工作负载进行来如下几种假如: 假如1:所有工作都运行时长都雷同。假如2:所有工作的开始工夫都是雷同的假如3:一旦工作开始,就会始终运行,直至工作实现。假如4:所有工作只应用CPU资源(比方不产生I/O操作)。假如5:事后晓得所有工作的运行时长。筹备工作曾经做好,上面咱们开始进入CPU调度算法的微妙世界。 FIFO:先进先出FIFO(First In First Out,先进先出)调度算法以原理简略,容易实现著称,它先调度首先达到的工作直至完结,而后再调度下一个工作,以此类推。如果有多个工作同时达到,则随机选一个。 在咱们假如的工作负载情况下,FIFO效率良好。比方有A、B、C三个工作满足上述所有负载假如,每个工作运行时长为10s,在t=0时刻达到,那么任务调度状况是这样的: 依据FIFO的调度原理,A、B、C别离在10、20、30时刻实现工作,均匀周转工夫为20s( \frac {10+20+30}{3}310+20+30),成果很好。 然而事实总是残暴的,如果假如1被突破,比方A的运行工夫变成100s,B和C的还是10s,那么调度状况是这样的: 依据FIFO的调度原理,因为A的运行工夫过长,B和C长时间得不到调度,导致均匀周转工夫好转为110( \frac {100+110+120}{3}3100+110+120)。 因而,FIFO调度策略在工作运行工夫差别较大的场景下,容易呈现工作饿死的问题! 针对这个问题,如果运行工夫较短的B和C先被调度,问题就能够解决了,这正是SJF调度算法的思维。 SJF:最短工作优先SJF(Shortest Job First,最短工作优先)从雷同达到工夫的多个工作中选取运行时长最短的一个工作进行调度,接着再调度第二短的工作,以此类推。 针对上一节的工作负载,应用SJF进行调度的状况如下,周转工夫变成了50s( \frac {10+20+120}{3}310+20+120),相比FIFO的110s,有了2倍多的晋升。 让咱们持续突破假如2,A在t=0时刻,B和C则在t=10时刻达到,那么调度状况会变成这样: 因为工作B和C比A后到,它们不得不始终期待A运行完结后才有机会调度,即便A须要长时间运行。周转工夫好转为103.33s(\frac {100+(110-10)+(120-10)}{3}3100+(110−10)+(120−10)),再次出现工作饿死的问题! STCF:最短时间实现优先为了解决SJF的工作饿死问题,咱们须要突破假如3,也即工作在运行过程中是容许被打断的。如果B和C在达到时就立刻被调度,问题就解决了。这属于抢占式调度,原理就是CPU上下文切换一节提到的,在中断定时器达到之后,OS实现工作A和B的上下文切换。 咱们在合作式调度的SJF算法的根底上,加上抢占式调度算法,就演变成了STCF算法(Shortest Time-to-Completion First,最短时间实现优先),调度原理是当运行时长较短的工作达到时,中断以后的工作,优先调度运行时长较短的工作。 应用STCF算法对该工作负载进行调度的状况如下,周转工夫优化为50s(\frac {120+(20-10)+(30-10)}{3}3120+(20−10)+(30−10)),再次解决了工作饿死问题! 到目前为止,咱们只关怀了周转工夫这一掂量指标,那么FIFO、SJF和STCF调度算法的响应工夫又是多长呢? 无妨假如A、B、C三个工作都在t=0时刻达到,运行时长都是5s,那么这三个算法的调度状况如下,均匀响应时长为5s(\frac {0+(5-0)+(10-0)}{3}30+(5−0)+(10−0)): 更蹩脚的是,随着工作运行时长的增长,均匀响应时长也随之增长,这对于交互类工作来说将会是灾难性的,重大影响用户体验。该问题的本源在于,当工作都同时达到且运行时长相同时,最初一个工作必须期待其余工作全副实现之后才开始调度。 为了优化响应工夫,咱们相熟的基于工夫片的调度呈现了。 RR:基于工夫片的轮询调度RR(Round Robin,轮训)算法给每个任务分配一个工夫片,当工作的工夫片用完之后,调度器会中断当前任务,切换到下一个工作,以此类推。 须要留神的是,工夫片的长度设置必须是中断定时器的整数倍,比方中断定时器时长为2ms,那么工作的工夫片能够设置为2ms、4ms、6ms … 否则即便工作的工夫片用完之后,定时中断没产生,OS也无奈切换工作。 当初,应用RR进行调度,给A、B、C调配一个1s的工夫片,那么调度状况如下,均匀响应时长为1s(\frac {0+(1-0)+(2-0)}{3}30+(1−0)+(2−0)): ...

July 29, 2021 · 1 min · jiezi

关于cpu:CPU基础知识

CPU是整个计算机的大脑,管制和解决内部输出的工作。CPU是由运算器、寄存器和控制器三大模块组成。 运算器运算器(Arithmatic unit ALU)用于做算术计算和逻辑计算。算术计算包含加减乘除四则运算,逻辑运算次要包含异、或、非、与、比拟等运算。运算器解决的数据通常为二进制数据,古代计算机中运算器一次解决的数据长度通常是64位,一次解决的二进制位长度越大,示意解决性能越高。寄存器寄存器是运算器的数据仓库,运算器须要的数据是存储在寄存器中的,当运算器计算实现后将后果再回写到寄存器中,最初返回到输出设备。寄存器分为 控制器包含程序计数器、时序发生器、指令译码器、寄存器。 程序计数器program counter 简称PC,用于记录CPU指令的地址。当CPU执行指令时,须要从PC中获取指令的地址,依据地址再获取到指令。当该条指令执行实现后,PC的地址会指向下一个指令地址位。 时序发生器用于发送时序脉冲,CPU根据不同的时序脉冲有节奏地进行工作,相似于CPU的节拍器。 指令译码器翻译指令 寄存器寄存器又分为多种不同类型数据寄存器数据寄存器(Data Register,DR)又称数据缓冲寄存器,其次要性能是作为CPU和主存、外设之间信息传输的中转站,用以补救CPU和主存、外设之间操作速度上的差别。数据寄存器用来临时寄存由主存储器读出的一条指令或一个数据字;反之,当向主存存入一条指令或一个数据字时,也将它们临时寄存在数据寄存器中。指令寄存器存储CPU的指令,PC中的指令地址就是指向的指令寄存器空间。当执行一条指令时,首先把该指令从主存读取到数据寄存器中,而后再传送至指令寄存器。主存地址寄存器主存地址寄存器(Address Register,AR),存储着数据的内存地址,CPU通过IO总线和内存替换数据。因为在主存和CPU之间存在操作速度上的差别,所以必须应用地址寄存器来临时保留主存的地址信息,直到主存的存取操作实现为止。当CPU和主存进行信息替换,即CPU向主存存入数据/指令或者从主存读出数据/指令时,都要应用地址寄存器和数据寄存器。累加寄存器累加寄存器通常简称累加器(Accumulator,AC),是一个通用寄存器。当运算器的算术逻辑单元ALU执行算术或逻辑运算时,为ALU提供一个工作区,能够为ALU临时保留一个操作数或运算后果。程序状态寄存器程序状态字(Program Status Word,PSW)用来表征以后运算的状态及程序的工作形式。程序状态字寄存器还用来保留中断和零碎工作状态等信息,以便CPU和零碎及时理解机器运行状态和程序运行状态。因而,程序状态字寄存器是一个保留各种状态条件标记的寄存器。 CPU高速缓存CPU在拜访内存时,首先从CPU高速缓存中查问数据,如果存在间接获取,否则拜访内存中的数据,并把数据放到CPU缓存中,最初返回给CPU应用。下图为CPU的缓存架构如图,CPU缓存分为一级缓存、二级缓存和三级缓存。越凑近CPU存取数据速度越快,其老本也会越高。每个CPU外围独自领有L1和L2缓存,同一颗物理CPU的多个外围共享同一个L3缓存。CPU在获取数据时,先从L1获取,如果没有再从L2、L3获取,直到从主存中获取数据。当L1中蕴含了所需的数据时,速度是最快的,反之每次都要到主从中获取数据时,就会很慢。 缓存行CPU和主存替换数据的最小单位是cache line(缓存行),每个缓存行的大小是64字节。思考到空间局部性,邻近的数据将来被拜访的可能性较大,因而当CPU装载主存数据到缓存时,会将邻近的64个字节一起载入到缓存中,这64个字节正好占了一个cache line。当一个缓存行的数据有变动时会清空该缓存行,并从主从中从新载入。多线程缓存共享问题多个线程同时操作cache line中的不同字节时,会呈现缓存伪共享状况。每个线程的操作都会导致缓存的生效,进而须要从主从读取,从新载入到CPU缓存中,这样导致缓存频繁的装载、生效,读取的数据理论都要从主存取得,大大降低了CPU的性能。缓存行对齐为了防止缓存行的伪共享问题,咱们能够将不同线程操作的数据分布到不同的缓存行中,互不烦扰。A线程批改A数据只须要对A数据缓存行生效,而不会影响到B线程的B数据。缓存行对齐有两种形式1、将共享变量数据左右填充有效的数据,保障总长为64个字节2、在JDK8中应用@Contended注解标注共享变量

July 13, 2021 · 1 min · jiezi

关于cpu:融云技术Native-CC-服务适配多指令集-CPU-漫谈

背景介绍 因为近些年,CPU 行业的摩尔定律生效了,很多厂商都纷纷从指令集架构层面寻找代替解决方案。在生产产品畛域,苹果推出了 ARM 指令集的 Apple Silicon M1,大获好评;在云服务行业,华为云和 Amazon 前些年就曾经在自研并上线了 ARM CPU 服务器,在老本和性能方面颇有建树。 而对于国产 CPU 行业而言,除了北公众志、海光、兆芯等少数几家手上领有 x86_64 指令集受权外,其余厂家根本都专一于非 x86_64 指令集。如:华为和飞腾在研发 ARM CPU,龙芯长年专一于 MIPS CPU;近些年衰亡的 RISC-V 也吸引了泛滥厂家的眼光。 对于各种非 x86_64 CPU,行业软件的移植和适配次要会波及嵌入式端、手机端、桌面端和服务器。嵌入式端思考到功耗,个别逻辑较为简单,代码移植和适配复杂程度不高。手机端个别都是 Android ARM,不波及太多适配问题。 桌面端分为三种状况: 如果利用基于浏览器即可满足所有性能,国产化零碎发型版本,个别内置了 Firefox 浏览器,利用对 Firefox 浏览器进行适配即可。如果利用是一个轻度的桌面利用,能够思考应用 Electron 的计划。Electron(原名为 Atom Shell)是 GitHub 开发的一个开源框架。它通过应用 Node.js(作为后端)和 Chromium 的渲染引擎(作为前端)实现跨平台的桌面 GUI 应用程序的开发。这种状况下,首先能够看下国产化零碎的软件源是否有对应的 Electron 依赖(个别都有);如果没有,须要进行编译。如果利用是一个重度的 Native 利用,则须要把代码在对应的指令集和零碎依赖上进行编译,工作量较大。 服务器,也分为三种状况: 如果应用的是面向虚拟机的语言,比方 Java 或基于 JVM 的各种语言(Kotlin、Scala 等),则服务不须要进行非凡的适配。个别国产化零碎的软件源中个别都会自带已实现好的 OpenJDK;如果没有,参见的指令集个别也都能找到对应的 OpenJDK 开源实现,能够自行装置。近些年呈现的一些对 C 库无强依赖的语言,如 Go 等。编译体系在设计之初就思考了多种指标零碎和指令集架构,只须要在编译时指定指标零碎和架构即可,如 GOOS=linux GOARCH=arm64 go build,如果应用了 CGO 还须要指定 C/C++ 的编译器。如果服务应用的是 C/C++ 等 Native 语言,且对系统 C 库有强依赖,则须要把代码在对应的指令集和零碎依赖上进行编译,工作量较大。 ...

June 17, 2021 · 2 min · jiezi

关于cpu:芯片圈也内卷英伟达推出-ARM-架构-CPU比英特尔-x86-快十倍

4 月 13 日凌晨,NVIDIA 创始人兼首席执行官黄仁勋又一次在自家厨房「举办」了一年一度的 GTC 2021 大会,会上黄教主围绕芯片、软件、服务、边缘计算、数据中心以及云,为粉丝们形容了NVIDIA对计算产业的将来愿景。 会上呈现了十分多让人惊喜的产品,特地是基于 Arm 架构寰球首款专为 TB 级减速计算而设计的 CPU NVIDIA Grace、全新 BlueField-3 DPU,以及业界首款 1000TOPS 算力的主动驾驶汽车 SoC-Atlan。 一、英伟达的第一款 CPU NVIDIA Grace NVIDIA Grace 是英伟达的第一款 CPU,它以美国海军少将、计算机编程先驱 Grace Hopper 的名字命名,不同于咱们日常常常应用的利用于电脑、手机等商业产品上的 CPU,Grace 的定位是一款高度专用型处理器,次要面向大型数据密集型 HPC(数据中心) 和 AI 利用。 NVIDIA 官网称基于 Grace 的零碎与 NVIDIA GPU 紧密结合,性能将比目前最先进的 NVIDIA DGX 零碎(在 x86 CPU 上运行)高出 10 倍,值得注意的是 NVIDIA DGX A100是当今世界最为先进的 AI 零碎。 Grace 在创新性上,能够总结为以下三点: 内置下一代 Arm Neoverse 内核,每个CPU能在 SPECrate2017_int_base 基准测试中单位工夫运行超过300个实例;采纳第四代 NVIDIA NVLink,从 CPU 到 GPU 连贯速度超过 900GB/s,相当于目前服务器 14 倍的带宽速度;从 CPU 到 CPU 的速度超过 600GB/s。领有最高的内存带宽,采纳的新内存 LPDDR5x 技术,带宽是 LPDDR4 的 2 倍,能源效率进步了 10 倍,能提供更多计算能力。联合 GPU 和 DPU,Grace 让 NVIDIA 领有了第三种根底计算技术,并具备从新构建数据中心以推动技术的能力,NVIDIA 无望扭转英特尔占据服务器处理器 90% 以上市场的格局,甚至有可能取代英特尔「老大」的位置。 ...

April 13, 2021 · 2 min · jiezi

关于cpu:一次CPU占用1600问题的定位过程-与-反思

通过一次略微大的改版后,零碎上线,上线后测试没发现问题,第二天反馈系统卡顿,下线。 查看零碎问题 ,优化接口速度 上线,上线后发现没问题,第二天仍旧呈现卡顿。此时察看CPU占用1600%.此时想到的时先回滚。没有保留现场。 测试环境测试,发现cpu闲暇时占用100% 找到问题 修复。然而能够确定,这里100%不是引起1600%的起因。 再次上线,人工实时监控cpu占用率。此时呈现了1600%的状况。此时占用cpu 1600%的过程对应的线程如下. 6619 6625 等是占用最高的过程Id. 对JVM栈信息进行打印 并输入到文件。 6619转成16进制后为19db 依据过程号在栈文件中 最初发现占用cpu高的全副为gc过程 ,此时能够断定。有局部代码逻辑内存占用过高。或者呈现内存透露。 寻找问题 此时曾经间断三次上线失败,没方法在从线上测试。那么想的是在灰度环境模拟这个景象 而后dump堆信息 这样必定能够找到起因。 第一天 转移很少一部其余零碎流量,以及很少一部分用户流量过来,没发现问题。 第二天 其余零碎申请的流量放弃不变,减少更多的用户流量,没有复现问题。 第三天 减少局部其余零碎申请的流量,没有复现问题。 第n天 减少其余零碎申请的流量 内存调整小,没有复现问题。 第n+1天 灰度环境服务与正式环境平分流量,持续减少用户量。没呈现问题。 此时外围流程代码批改过的局部 曾经查看了n遍 没发现问题。 那么 须要思考一下,为什么灰度环境没有问题。而线上有问题。他们的用户有什么不同? 此时发现灰度环境全是权限最低的用户,而管理员没有在灰度环境上工作,想到这里 问题曾经离假相很近了。能够说曾经定位到问题所在了,只须要验证一下本人的猜测。 其中有个性能,是查看本人所治理人的数据,这个性能因为不是外围性能 ,并且申请的量很小很小,起初并没有向这个方向思考。逻辑是 : 查找本人下一级别,如果有数据,在持续查找,恰好 数据库有一条异样的数据 ,他的下一级就是本人! 导致产生了死循环,导致内存里的数据越来越多。 并且 只有那一个异样用户才会引起这个问题! 又因为是IO密集的操作,所以 这个循环占用的cpu很低。在线程栈中并没有发现他。 解决问题 找到问题解决就是很容易的事件了,不再详细描述。 反思 第一次零碎呈现卡顿,正确的解决形式大略应该如下 发现cpu占用高,查看该过程对应的线程在执行什么操作 发现大量的线程远程桌面在执行gc操作,此时应该dump堆信息 应用jmap等工具查看哪些对象占用内存占用高 找到对应代码 解决问题 这种bug不应该存在,即便存在了呈现问题也不要太慌 应该疾速的保留能保留下来的信息。 大的改变上线前须要灰度公布,大量用户先应用。 完结

January 27, 2021 · 1 min · jiezi

关于cpu:电脑硬件基本常识

次要对电脑硬件包含cpu,显卡,主板 ,内存等DIY硬件进行一些简略通俗易懂的介绍,老手必看,高手飘过。 一、处理器CPU常识: ①CPU的分类 CPU品牌有两大阵营,别离是Intel(英特尔)和AMD,这两个行业老大简直垄断了CPU市场,大家拆开电脑看看,无非也是Intel和AMD的品牌(当然不排除极极少山寨的CPU)。而Intel的CPU又分为Pentium(奔流)、Celeron(赛扬)和Core(酷睿)。其性能由高到低也就是Core>Pentium>Celeron。AMD的CPU分为Semporn(闪龙)和Athlon(速龙),性能当然是Athlon优于Semporn的了。 Intel与AMD标记意识 ②CPU的主频意识 提CPU时,常常听到2.4GHZ、3.0GHZ等的CPU,这些到底代表什么?这些相似于2.4GHZ的东东其实就是CPU的主频,也就是主时钟频率,单位就是MHZ。这时用来掂量一款CPU性能十分要害的指标之一。主频计算还有条公式。主频=外频×倍频系数。 单击“我的电脑”→“属性”就能够查看CPU类型和主频大小 如下图: 我的电脑-属性查看cpu信息 ③CPU提到的FSB是啥玩意? FSB就是前端总线,简略来说,这个货色是CPU与外界替换数据的最次要通道。FSB的处理速度快慢也会影响到CPU的性能。 4.CPU提及的高速缓存指的又是什么呢?高速缓存指内置在CPU中进行高速数据交换的储存器。分一级缓存(L1Cache)、二级缓存(L2Cache)以及三级缓存(L3Cache)。 个别状况下缓存的大小为:三级缓存>二级缓存>一级缓存。缓存大小也是掂量CPU性能的重要指标。 ④常提及的 45nm规格的CPU又是什么货色? 相似于45nm这些呈现在CPU的字样其实就是CPU的制作工艺,其单位是微米,为秘制越小,制作工艺当然就越先进了,频率也越高、集成的晶体管就越多!当初的CPU制作工艺从微米到纳米,从90纳米---65纳米---45纳米---到当初的32纳米---未来的28纳米,再到将来的更低,工艺越小,产品做的越精,功耗低,体积越小。 ⑤CPU外围电压对CPU有什么影响? 一句话:更低的外围电压,更少的耗电和发热。 二:显卡常识: ①有人说GPU是显卡的灵魂,为何这样说? GPU是显卡的外围,负责大部分图形设计工作,间接决定了显卡的整体性能程度。说它是显卡灵魂,一点都不过分。当初酷睿i3等的CPU还集成了GPU,相当于cpu中集成了显卡。 ②显存是掂量显卡非常重要的指标,简略介绍一下显存对显卡性能施展很大影响。MHZ是显存的单位。显存也分为GDR、 GDR2和 GDR3,和当初的GDR5四种,未来还有更高的。显存速度单位是ns。显存位宽指显存在一个时钟周期内所能传递数据的位数,位数越大传输数据量越大。显存容量有共享内存和理论显存之分。共享显存是利用虚拟内存的容量,而虚拟内存则是应用硬盘的容量。理论显存性能大于共享显存的性能,这点很容易混同,也是JS忽悠咱们的中央。性能上目前 GDR5>GDR3>GDR2>GDR,目前市场上能看到的对数的GDR3与GDR5显卡,GDR3以下级别显卡均已淘汰。 ③显卡的外围频率是什么? 显卡的外围频率是指外围芯片的工作频率。显卡超频通常就是提供外围频率。 ④显卡接口类型分哪些? 显卡的接口类型分AGP和PCI-Express两种。PCI-Express的速度比AGP的速度快,AGP根本曾经退出历史舞台了。AGP接口的显卡目前曾经停产了,要买的渠道个别就只是二手买卖,而且性能上大大如前者。 ⑤独立显卡和集成显卡哪个好? 首先介绍下什么是独立显卡,与集成显卡,独立显卡就是独自购买的一块显卡,而集成显卡就是主板上集成了显卡,或者目前比拟新的cpu上集成显卡外围。个别游戏用户与大型软件电脑配置都选独立显卡,集成显卡因为受空间等流量交易限度,性能比拟差无奈满足支流游戏与大型利用需要,但能够满足个别影音娱乐与简略游戏或者办公需要,速度相对来说没独立显卡的快。 独立显卡与集成显卡在于后者须要共享零碎的内存作为显存,前者则独自配置显存。性能上,集成显卡无奈与独立显卡相比,前者贵。集成显卡和独立显卡根本就是两个品位! ⑥ 目前显卡的芯片品牌 目前电脑显卡品牌有很多,比方 影池,七彩虹,华硕等有很多,但选用的显卡显卡外围芯片都是NVidia]和ATI显卡芯片组,芯片决定显卡品位。 其中NVidia显卡 (寰球第一大显卡芯片研发和制造商)咱们喜爱称为N卡, ATI显卡 (寰球惟一能和NVidia显卡抗衡的显卡芯片制造商 )咱们简称为A卡。 三:内存常识: ①电脑弄个内存用来干什么的? 因为内存的速度比硬盘快,当CPU开始工作后,会将局部罕用的信息写入内存,须要应用时再从内存中读取,而不是从硬盘中读取。这样读取速度显著快去硬盘的读取速度,进步了效率,因而弄个内存是必要的! ②常常看到例如DDR2 800 以及 DDR3 1333 这些代表什么? DDR2指的是2代的内存,内存分为DDR(1代)、DDR2(2代)、DDR3(3代),当然性能比照,3代性能>2代的>1代的。至于相似于DDR2 800这里的800指的就是内存总线频率,内存总线频率决定主板前端总线频率,如DDR2 800内存,主板的前端总线也只能达到800MHZ的速度,DDR3 1333为内存总线频率1333MHZ。 ③内存的数据带宽都是指什么? 简略来说是指内存的数据 传输速度。有条公式是这样的,内存的数据带宽=总线频率×带宽位数÷8。举个例子,DDR800内存数据带宽=800(MHZ)×64(Bit)÷8=6.4(GB/s)。如果开双通道的话则乘以2,也就是12.8GB/s。目前应用的内存是DDR3 1333 1667等或更高频率。 四:主板常识①提到主板时不免要接触南 北桥芯片,这是干什么的?如何辨别? 北桥芯片次要性能是管制内存。通常状况,主板上离CPU最近的芯片就是北桥芯片了。还有个南桥芯片,很容易和北桥芯片混同啊!南桥芯片的性能是负责I/O总线之间的通信,如键盘控制器,当初支流的主板曾经不存在南桥芯片了。②COMS电池是什么回事? COMS电池为BIOS芯片供电,爱护其存在的信息。这个COMS电池是圆形的纽扣电池,在主板上,很容易辨别。其左右次要为电脑时钟和bios在断电的状况下供电,这也是为什么咱们电脑把电源插头拔里,下次开机电脑的工夫仍然的失常的起因。 BIOS(Basic Input/output System),中文全称根本输出/输入零碎,这是集成在主板上的一块Rom芯片。在开机时按del键看到蓝蓝的屏幕就是这个BIOS了(绝大部分为英文界面)。当须要U盘装零碎等都须要对bios进行设置才能够。 ③买主板有哪些品牌抉择好?还有那些一线品牌、二线品牌怎么辨别? ...

January 24, 2021 · 1 min · jiezi

关于cpu:CPU飙高系统性能问题如何排查

简介: 压测时或多或少都收到过CPU或者Load高的告警,如果是单机偶发性的,常常会认为是“宿主机抢占导致的”,那事实是否真是如此呢?是什么引起了这些指标的飙高?网络、磁盘还是高并发?有什么工具能够定位?TOP、PS还是vmstat?CPU高&Load高和CPU低&Load高,不同的表征又代表着什么? 一 背景常识LINUX过程状态LINUX 2.6当前的内核中,过程个别存在7种根底状态:D-不可中断睡眠、R-可执行、S-可中断睡眠、T-暂停态、t-跟踪态、X-死亡态、Z-僵尸态,这几种状态在PS命令中有对应解释。 D (TASK_UNINTERRUPTIBLE),不可中断睡眠态。顾名思义,位于这种状态的过程处于睡眠中,并且不容许被其余过程或中断(异步信号)打断。因而这种状态的过程,是无奈应用kill -9杀死的(kill也是一种信号),除非重启零碎(没错,就是这么头硬)。不过这种状态个别由I/O期待(比方磁盘I/O、网络I/O、外设I/O等)引起,呈现工夫十分短暂,大多很难被PS或者TOP命令捕捉(除非I/O HANG死)。SLEEP态过程不会占用任何CPU资源。R (TASK_RUNNING),可执行态。这种状态的过程都位于CPU的可执行队列中,正在运行或者正在期待运行,即不是在下班就是在下班的路上。S (TASK_INTERRUPTIBLE),可中断睡眠态。不同于D,这种状态的过程尽管也处于睡眠中,然而是容许被中断的。这种过程个别在期待某事件的产生(比方socket连贯、信号量等),而被挂起。一旦这些工夫实现,过程将被唤醒转为R态。如果不在高负载期间,零碎中大部分过程都处于S态。SLEEP态过程不会占用任何CPU资源。T&t (__TASK_STOPPED & __TASK_TRACED),暂停or跟踪态。这种两种状态的过程都处于运行进行的状态。不同之处是暂停态个别因为收到SIGSTOP、SIGTSTP、SIGTTIN、SIGTTOUT四种信号被进行,而跟踪态是因为过程被另一个过程跟踪引起(比方gdb断点)。暂停态过程会开释所有占用资源。Z (EXIT_ZOMBIE), 僵尸态。这种状态的过程实际上曾经完结了,然而父过程还没有回收它的资源(比方过程的描述符、PID等)。僵尸态过程会开释除过程入口之外的所有资源。X (EXIT_DEAD), 死亡态。过程的真正完结态,这种状态个别在失常零碎中捕捉不到。Load Average & CPU使用率谈到零碎性能,Load和CPU使用率是最直观的两个指标,那么这两个指标是怎么被计算出来的呢?是否能相互等价呢? Load Average 不少人都认为,Load代表正在CPU上运行&期待运行的过程数,即 但Linux零碎中,这种形容并不齐全精确。 以下为Linux内核源码中Load Average计算方法,能够看进去,因而除了可执行态过程,不可中断睡眠态过程也会被一起纳入计算,即: 602staticunsignedlongcount_active_tasks(void)603 {604structtask_struct*p;605unsignedlongnr=0;606607read_lock(&tasklist_lock);608for_each_task(p) {609if ((p->state==TASK_RUNNING610 (p->state&TASK_UNINTERRUPTIBLE)))611nr+=FIXED_1;612 }613read_unlock(&tasklist_lock);614returnnr;615 }......625staticinlinevoidcalc_load(unsignedlongticks)626 {627unsignedlongactive_tasks; /* fixed-point */628staticintcount=LOAD_FREQ;629630count-=ticks;631if (count<0) {632count+=LOAD_FREQ;633active_tasks=count_active_tasks();634CALC_LOAD(avenrun[0], EXP_1, active_tasks);635CALC_LOAD(avenrun[1], EXP_5, active_tasks);636CALC_LOAD(avenrun[2], EXP_15, active_tasks);637 }638 }在前文 Linux过程状态 中有提到过,不可中断睡眠态的过程(TASK_UNINTERRUTED)个别都在进行I/O期待,比方磁盘、网络或者其余外设期待。由此咱们能够看出,Load Average在Linux中体现的是整体零碎负载,即CPU负载 + Disk负载 + 网络负载 + 其余外设负载,并不能齐全等同于CPU使用率(这种状况只呈现在Linux中,其余零碎比方Unix,Load还是只代表CPU负载)。 CPU使用率 CPU的工夫分片个别可分为4大类:用户过程运行工夫 - User Time, 零碎内核运行工夫 - System Time, 闲暇工夫 - Idle Time, 被抢占工夫 - Steal Time。除了Idle Time外,其余工夫CPU都处于工作运行状态。 ...

September 29, 2020 · 1 min · jiezi

关于cpu:CPU-缓存一致性协议-MESI

CPU 高速缓存(Cache Memory)CPU 为何要有高速缓存CPU 在摩尔定律的领导下以每 18 个月翻一番的速度在倒退,然而内存和硬盘的倒退速度远远不迭 CPU。这就造成了高性能能的内存和硬盘价格及其低廉。然而 CPU 的高度运算须要高速的数据。为了解决这个问题,CPU 厂商在 CPU 中内置了大量的高速缓存以解决 I\O 速度和 CPU 运算速度之间的不匹配问题。 在 CPU 拜访存储设备时,无论是存取数据抑或存取指令,都趋于汇集在一片间断的区域中,这就被称为局部性原理。 工夫局部性(Temporal Locality):如果一个信息项正在被拜访,那么在近期它很可能还会被再次拜访。比方循环、递归、办法的重复调用等。 空间局部性(Spatial Locality):如果一个存储器的地位被援用,那么未来他左近的地位也会被援用。比方程序执行的代码、间断创立的两个对象、数组等。 带有高速缓存的 CPU 执行计算的流程程序以及数据被加载到主内存指令和数据被加载到 CPU 的高速缓存CPU 执行指令,把后果写到高速缓存高速缓存中的数据写回主内存 目前风行的多级缓存构造因为 CPU 的运算速度超过了 1 级缓存的数据 I\O 能力,CPU 厂商又引入了多级的缓存构造。 多级缓存构造 多核 CPU 多级缓存一致性协定 MESI多核 CPU 的状况下有多个一级缓存,如何保障缓存外部数据的统一, 不让零碎数据凌乱。这里就引出了一个一致性的协定 MESI。 MESI 协定缓存状态MESI 是指 4 中状态的首字母。每个 Cache line 有 4 个状态,可用 2 个 bit 示意,它们别离是: 缓存行(Cache line): 缓存存储数据的单元。状态形容监听工作M 批改 (Modified)该 Cache line 无效,数据被批改了,和内存中的数据不统一,数据只存在于本 Cache 中。缓存行必须时刻监听所有试图读该缓存行绝对就主存的操作,这种操作必须在缓存将该缓存行写回主存并将状态变成 S(共享)状态之前被提早执行。E 独享、互斥 (Exclusive)该 Cache line 无效,数据和内存中的数据统一,数据只存在于本 Cache 中。缓存行也必须监听其它缓存读主存中该缓存行的操作,一旦有这种操作,该缓存行须要变成 S(共享)状态。S 共享 (Shared)该 Cache line 无效,数据和内存中的数据统一,数据存在于很多 Cache 中。缓存行也必须监听其它缓存使该缓存行有效或者独享该缓存行的申请,并将该缓存行变成有效(Invalid)。I 有效 (Invalid)该 Cache line 有效。无留神: 对于 M 和 E 状态而言总是准确的,他们在和该缓存行的真正状态是统一的,而 S 状态可能是非统一的。如果一个缓存将处于 S 状态的缓存行作废了,而另一个缓存实际上可能曾经独享了该缓存行,然而该缓存却不会将该缓存行升迁为 E 状态,这是因为其它缓存不会播送他们作废掉该缓存行的告诉,同样因为缓存并没有保留该缓存行的 copy 的数量,因而(即便有这种告诉)也没有方法确定本人是否曾经独享了该缓存行。从下面的意义看来 E 状态是一种投机性的优化:如果一个 CPU 想批改一个处于 S 状态的缓存行,总线事务须要将所有该缓存行的 copy 变成 invalid 状态,而批改 E 状态的缓存不须要应用总线事务。### MESI 状态转换了解该图的前置阐明: 1. 触发事件触发事件形容本地读取(Local read)本地 cache 读取本地 cache 数据本地写入(Local write)本地 cache 写入本地 cache 数据远端读取(Remote read)其余 cache 读取本地 cache 数据远端写入(Remote write)其余 cache 写入本地 cache 数据2.cache 分类: 前提:所有的 cache 独特缓存了主内存中的某一条数据。本地 cache: 指以后 cpu 的 cache。 触发 cache: 触发读写事件的 cache。 其余 cache: 指既除了以上两种之外的 cache。 留神:本地的事件触发 本地 cache 和触发 cache 为雷同。上图的切换解释:状态触发本地读取触发本地写入触发远端读取触发远端写入M 状态(批改)本地 cache:M触发 cache:M其余 cache:I本地 cache:M触发 cache:M其余 cache:I本地 cache:M→E→S触发 cache:I→S其余 cache:I→S同步主内存后批改为 E 独享, 同步触发、其余 cache 后本地、触发、其余 cache 批改为 S 共享本地 cache:M→E→S→I触发 cache:I→S→E→M其余 cache:I→S→I同步和读取一样, 同步实现后触发 cache 改为 M,本地、其余 cache 改为 IE 状态(独享)本地 cache:E触发 cache:E其余 cache:I本地 cache:E→M触发 cache:E→M其余 cache:I本地 cache 变更为 M, 其余 cache 状态该当是 I(有效)本地 cache:E→S触发 cache:I→S其余 cache:I→S当其余 cache 要读取该数据时,其余、触发、本地 cache 都被设置为 S(共享)本地 cache:E→S→I触发 cache:I→S→E→M其余 cache:I→S→I当触发 cache 批改本地 cache 独享数据时时,将本地、触发、其余 cache 批改为 S 共享. 而后触发 cache 批改为独享,其余、本地 cache 批改为 I(有效),触发 cache 再批改为 MS 状态 (共享)本地 cache:S触发 cache:S其余 cache:S本地 cache:S→E→M触发 cache:S→E→M其余 cache:S→I当本地 cache 批改时,将本地 cache 批改为 E, 其余 cache 批改为 I, 而后再将本地 cache 为 M 状态本地 cache:S触发 cache:S其余 cache:S本地 cache:S→I触发 cache:S→E→M其余 cache:S→I当触发 cache 要批改本地共享数据时,触发 cache 批改为 E(独享), 本地、其余 cache 批改为 I(有效), 触发 cache 再次批改为 M(批改)I 状态(有效)本地 cache:I→S 或者 I→E触发 cache:I→S 或者 I →E其余 cache:E、M、I→S、I本地、触发 cache 将从 I 有效批改为 S 共享或者 E 独享,其余 cache 将从 E、M、I 变为 S 或者 I本地 cache:I→S→E→M触发 cache:I→S→E→M其余 cache:M、E、S→S→I既然是本 cache 是 I,其余 cache 操作与它无关既然是本 cache 是 I,其余 cache 操作与它无关下图示意了,当一个 cache line 的调整的状态的时候,另外一个 cache line 须要调整的状态。MESIM×××√E×××√S××√√I√√√√举个栗子来说:假如 cache 1 中有一个变量 x = 0 的 cache line 处于 S 状态 (共享)。 那么其余领有 x 变量的 cache 2、cache 3 等 x 的 cache line 调整为 S 状态(共享)或者调整为 I 状态(有效)。### 多核缓存协同操作假如有三个 CPU A、B、C,对应三个缓存别离是 cache a、b、 c。在主内存中定义了 x 的援用值为 0。 #### 单核读取那么执行流程是: CPU A 收回了一条指令,从主内存中读取 x。 从主内存通过 bus 读取到缓存中(远端读取 Remote read), 这是该 Cache line 批改为 E 状态(独享). #### 双核读取那么执行流程是: CPU A 收回了一条指令,从主内存中读取 x。 CPU A 从主内存通过 bus 读取到 cache a 中并将该 cache line 设置为 E 状态。 CPU B 收回了一条指令,从主内存中读取 x。 CPU B 试图从主内存中读取 x 时,CPU A 检测到了地址抵触。这时 CPU A 对相干数据做出响应。此时 x 存储于 cache a 和 cache b 中,x 在 chche a 和 cache b 中都被设置为 S 状态 (共享)。 #### 批改数据那么执行流程是: CPU A 计算实现后发指令须要批改 x. CPU A 将 x 设置为 M 状态(批改)并告诉缓存了 x 的 CPU B, CPU B 将本地 cache b 中的 x 设置为 I 状态 (有效) CPU A 对 x 进行赋值。 #### 同步数据那么执行流程是:CPU B 收回了要读取 x 的指令。 CPU B 告诉 CPU A,CPU A 将批改后的数据同步到主内存时 cache a 批改为 E(独享) CPU A 同步 CPU B 的 x, 将 cache a 和同步后 cache b 中的 x 设置为 S 状态(共享)。 MESI 优化和他们引入的问题---------------缓存的一致性消息传递是要工夫的,这就使其切换时会产生提早。当一个缓存被切换状态时其余缓存收到音讯实现各自的切换并且收回回应音讯这么一长串的工夫中 CPU 都会期待所有缓存响应实现。可能呈现的阻塞都会导致各种各样的性能问题和稳定性问题。### CPU 切换状态阻塞解决 - 存储缓存(Store Bufferes)比方你须要批改本地缓存中的一条信息,那么你必须将 I(有效)状态告诉到其余领有该缓存数据的 CPU 缓存中,并且期待确认。期待确认的过程会阻塞处理器,这会升高处理器的性能。应为这个期待远远比一个指令的执行工夫长的多。#### Store Bufferes为了防止这种 CPU 运算能力的节约,Store Bufferes 被引入应用。处理器把它想要写入到主存的值写到缓存,而后持续去解决其余事件。当所有生效确认(Invalidate Acknowledge)都接管到时,数据才会最终被提交。 这么做有两个危险#### Store Bufferes 的危险第一、就是处理器会尝试从存储缓存(Store buffer)中读取值,但它还没有进行提交。这个的解决方案称为 Store Forwarding,它使得加载的时候,如果存储缓存中存在,则进行返回。 第二、保留什么时候会实现,这个并没有任何保障。`value = 3;void exeToCPUA(){ value = 10; isFinsh = true;}void exeToCPUB(){ if(isFinsh){ //value肯定等于10?! assert value == 10; }}`试想一下开始执行时,CPU A 保留着 finished 在 E(独享) 状态,而 value 并没有保留在它的缓存中。(例如,Invalid)。在这种状况下,value 会比 finished 更迟地摈弃存储缓存。齐全有可能 CPU B 读取 finished 的值为 true,而 value 的值不等于 10。即 isFinsh 的赋值在 value 赋值之前。这种在可辨认的行为中产生的变动称为重排序(reordings)。留神,这不意味着你的指令的地位被歹意(或者好心)地更改。它只是意味着其余的 CPU 会读到跟程序中写入的程序不一样的后果。~顺便提一下 NIO 的设计和 Store Bufferes 的设计是十分相像的。~### 硬件内存模型执行生效也不是一个简略的操作,它须要处理器去解决。另外,存储缓存(Store Buffers)并不是无穷大的,所以处理器有时须要期待生效确认的返回。这两个操作都会使得性能大幅升高。为了应酬这种状况,引入了生效队列。它们的约定如下:* 对于所有的收到的 Invalidate 申请,Invalidate Acknowlege 音讯必须立即发送* Invalidate 并不真正执行,而是被放在一个非凡的队列中,在不便的时候才会去执行。* 处理器不会发送任何音讯给所解决的缓存条目,直到它解决 Invalidate。即使是这样处理器未然不晓得什么时候优化是容许的,而什么时候并不容许。 罗唆处理器将这个工作丢给了写代码的人。这就是内存屏障(Memory Barriers)。> 写屏障 Store Memory Barrier(a.k.a. ST, SMB, smp_wmb) 是一条通知处理器在执行这之后的指令之前,利用所有曾经在存储缓存(store buffer)中的保留的指令。> 读屏障 Load Memory Barrier (a.k.a. LD, RMB, smp_rmb) 是一条通知处理器在执行任何的加载前,先利用所有曾经在生效队列中的生效操作的指令。`void executedOnCpu0() { value = 10; //在更新数据之前必须将所有存储缓存(store buffer)中的指令执行结束。 storeMemoryBarrier(); finished = true;}void executedOnCpu1() { while(!finished); //在读取之前将所有生效队列中对于该数据的指令执行结束。 loadMemoryBarrier(); assert value == 10;}`##### 援用文章http://www.importnew.com/1058...https://www.cnblogs.com/yanlo...

September 28, 2020 · 3 min · jiezi