Main 鲲鹏处理器架构与编程

鲲鹏处理器架构与编程

0 / 0
How much do you like this book?
What’s the quality of the file?
Download the book for quality assessment
What’s the quality of the downloaded files?
Year:
2020
Publisher:
清华大学出版社
Language:
chinese
File:
EPUB, 6.56 MB
Download (epub, 6.56 MB)

Most frequently terms

 
0 comments
 

To post a review, please sign in or sign up
You can write a book review and share your experiences. Other readers will always be interested in your opinion of the books you've read. Whether you've loved the book or not, if you give your honest and detailed thoughts then people will find new books that are right for them.
1

Das Haus der Düfte

Year:
2021
Language:
german
File:
EPUB, 4.01 MB
0 / 0
2

大规模C++程序设计 (C/C++技术丛书)

Year:
2014
Language:
chinese
File:
EPUB, 13.50 MB
0 / 0
本书封面贴有清华大学出版社防伪标签,无标签者不得销售。

版权所有,侵权必究。举报: 010-62782989, beiqinquan@tup.tsinghua.edu.cn。

图书在版编目(CIP)数据

鲲鹏处理器架构与编程/戴志涛,刘健培编著.—北京:清华大学出版社,2020.9

(华为智能计算技术丛书)

ISBN 978-7-302-56268-9

Ⅰ.①鲲… Ⅱ.①戴… ②刘… Ⅲ.①微处理器—程序设计 Ⅳ.①TP332

中国版本图书馆CIP数据核字(2020)第152924号

责任编辑:盛东亮 钟志芳

封面设计:李召霞

责任校对:时翠兰

责任印制:沈 露

出版发行:清华大学出版社

网  址:http://www.tup.com.cn, http://www.wqbook.com

地  址:北京清华大学学研大厦A座

邮  编:100084

社总机:010-62770175

邮  购:010-83470235

投稿与读者服务:010-62776969, c-service@tup.tsinghua.edu.cn

质量反馈:010-62772015, zhiliang@tup.tsinghua.edu.cn

课件下载:http://www.tup.com.cn, 010-83470236

印装者:三河市龙大印装有限公司

经  销:全国新华书店

开  本:186mm×240mm

印  张:24

字  数:482千字

版  次:2020年9月第1版

印  次:2020年9月第1次印刷

印  数:1~2500

定  价:79.00元



* * *



产品编号: 087735-01





内容简介


华为海思设计的鲲鹏(Kunpeng)920系列芯片是兼容ARMv8-A架构的高性能处理器片上系统,也是华为 “算、存、传、管、智”五个产品系列构成的鲲鹏芯片家族的核心产品。本书首先介绍高性能处理器与服务器的技术背景,然后总结了ARMv8-A处理器的体系结构。在此基础上,重点讨论鲲鹏920处理器片上系统的体系结构及其软件生态和架构。为方便读者理解鲲鹏920处理器片上系统的应用场景,本书最后还给出了基于鲲鹏920处理器片上系统的服务器软件的安装、配置、开发与应用案例。

本书可以作为读者了解和应用鲲鹏920处理器片上系统的参考用书,特别适合有兴趣使用鲲鹏920处理器片上系统的软件构架师、软件工程师和需要在鲲鹏920处理器片上系统上开发、优化应用程序的应用工程师和调优工程师。本书还可以作为普通高等学校计算机科学与技术、大数据、人工智能等相关专业的本科生及研究生教材。对计算机组成和设计有学习兴趣的读者也可以通过本书了解现代高性能处理器的体系结构。





FOREWORD 序 一


人类文明以农业社会形态延续了数千年。工业革命在不到300年的时间内,给人类社会带来了翻天覆地的变化,极大地推动了生产力的进步,将人类文明带入工业社会。当前,我们正处于一个新时代的开端!新一轮工业革命开启,互联网革命进入下半场,数字经济正在成型展开,在这些“变革”的背后,“信息技术”及“信息化”是其核心驱动力。以计算机和互联网为代表的信息技术正在推动人类社会朝着全面数字化、网络化和智能化的方向发展,一个人、机、物融合的新时代正在开启,人类文明开始进入信息社会。

随着大数据、人工智能、物联网、5G通信以及生物工程等新技术融入人类社会经济活动的方方面面,数据成为新的生产要素,围绕数据处理分析尤其是大数据处理分析的计算成为新的生产力。新时代对计算的需求也呈现出一些新的特征。

首先,需要超强的算力。统计计算本身就是一种极限计算,高度依赖于算力。例如,为了让计算机识别出一只猫,就需要数百万图片的训练,这对算力是一个非常大的消耗。面对未来的人、机、物融合时代,面向自动驾驶、天文探索、气象预测等更复杂场景,对超强算力的需求将会是常态。

其次,计算将无处不在。人、机、物融合场景下泛在计算模式成为新形态。从体系结构角度来看,云侧的极限计算、边缘侧的专业计算、端侧的个性计算互相协同,“端-边-云”一起构成未来计算新体系。

其三,降耗节能成为行业共识。计算行业正在成为未来的能耗大户。例如2018年中国数据中心耗电量已超过三峡电站全年发电量,约占全国能耗的2.3%,预计到2030年将占全国能耗的4.2%。计算行业降低能耗成为刚需。

无论是超强的算力、泛在的计算,还是降耗节能,都需要围绕各种处理器进行,以处理器为核心构建计算体系、工具链条和应用生态。应用场景的多样化和数据类型的多元化,使得传统单一的计算架构越来越难以满足数据处理和用户体验的要求,多样性发展既是趋势,也是挑战。不同架构的处理器有不同的特点,适合不同的领域。最早为个人计算机设计的x86架构处理器目前在传统桌面和服务器领域占有优势; ; ARM架构处理器在移动计算领域优势明显,并正在向服务器和物联网等领域延伸; RISC-V架构处理器由于完全开源的特点在万物互联时代开始获得广泛关注。

华为鲲鹏系列处理器基于ARM架构,既继承了ARM的生态优势,又结合实际的场景和上层基础软硬件进行了创新,通过“硬件开放、软件开源”来推动计算产业共同发展,以满足未来智能世界对多样性计算的需求。如何吸引更多开发人员,帮助他们在鲲鹏处理器上更容易地编写和优化软件,在并发、性能、效率和安全等方面做得更好,是鲲鹏生态环境建设的关键问题。要有效解决该问题,提供各种高质量的教材无疑是一个重要的起点。

我很高兴看到《鲲鹏处理器架构与编程》的出版,为促进鲲鹏生态的构建迈出了坚实的一步。本书有助于高校学生、开发者学习和掌握先进实用的ARM计算架构,不仅可以用于解决各种应用问题,更可为个人职业发展开辟新路。我也希望通过此序,寄语广大青年学子和从业人员,把握住数字经济发展带来的历史机遇,努力学习,深入实践,锤炼能力,不负韶华,不负时代。



梅宏教授

中国科学院院士

中国计算机学会理事长

绿色计算产业联盟理事长

2020年8月于北京





FOREWORD 序二


得知《鲲鹏处理器架构与编程》即将出版,让我回想起20世纪80年代初从海外回国,投入研制我国第一台大型计算机的岁月。当时,我们已有的成果,比如汉字激光照排、联想式汉卡,都是计算机的扩展功能,不是计算机主体。那时候我就觉得中国要做计算机,就一定要做芯片。几十年过去了,我们自己的企业就已经能生产出比肩国际,甚至在某些方面还犹有过之的芯片。作为一名一直从事计算机研究与开发的从业者,我深感欣慰。

我们都知道芯片的研发很难,不是一朝一夕就能够出成果的,需要长时间的投入以及丰富的经验积累,但是华为坚持下来了。

当下我们的计算产业正在经历种种困难,芯片事件给人的教育挺深刻的,比我们讲一百遍都有用,让全社会感受到芯片的重要性,小小的芯片是真正的“大国重器”。作为一个见证了中国计算产业从无到有的亲历者,我想给大家打打气,这些当前的困难放到中国计算机发展史中来看,只是一个可以迈过去的小坎而已。

首先,全社会都很重视计算产业的发展,国家支持力度很大,加大政策支持和资金投入。我们也有一批像华为这样处在国际领先地位的企业做投入。

其次,中国市场体量巨大。计算产业包含的数据中心、人工智能等本身就是一个万亿级的市场。更重要的是,计算作为一种通用技术可以和其他产业集群数字化相结合,带来效率的提升和产业空间的拓展,其所创造的体量是不可估量的。

第三,经过一代代计算人的传承,我们的人才体系已经逐步完善,有大量掌握先进技术的基础架构研究人员和应用开发人员。

我们有人、有市场、有资金、有技术,没有理由搞不好计算产业。当前主要的问题在于如何在使用中让生态丰富起来,从某些相对容易的领域逐步推进到企业,最后进入更广泛的领域。今天,很高兴看到《鲲鹏处理器架构与编程》由清华大学出版社出版,本书系统而深入地介绍了鲲鹏处理器的硬件架构、软件架构、系统编程、生态移植等核心内容,能有效指导广大青年学生和从业者进行研究开发,他们将是未来计算生态蓬勃发展的生力军。今天的火种,明天将处处燎原。

成功通常需要经历很长的过程,不一定要自己成功,我做一段,大家接着做。目前是适宜创新的时期,希望年轻人勤奋工作,努力创新,实现“两个一百年”的奋斗目标,自己也能获得更多的成就感。



中国工程院院士

2020年8月





PREFACE 前言


“北冥有鱼,其名为鲲。鲲之大,不知其几千里也。化而为鸟,其名为鹏。鹏之背,不知其几千里也;怒而飞,其翼若垂天之云。是鸟也,海运则将徙于南冥。南冥者,天池也。”

上面这段是《庄子·逍遥游》中记载的一段“列子仙话”。华为公司选择用“鲲”和“鹏”这两种传说中奇大无比的大鱼和大鸟合体而成的华夏上古神兽“鲲鹏”作为其芯片产品的名称,足以看出其中“鲲鹏展翅”的宏图大志。

广义而言,鲲鹏芯片是华为海思自研芯片家族的总称。其中除了鲲鹏系列处理器芯片外,还有昇腾(Ascend)人工智能(Artificial Intelligence,AI)芯片、固态硬盘(Solid State Drive,SSD)控制芯片、智能融合网络芯片及智能管理芯片等,形成一个强大的支持计算、存储、传输、管理和人工智能的芯片家族。从其命名方式就可以看出来,鲲鹏920处理器片上系统是这个芯片家族的核心之一。

从万物互联到大数据,再到云计算和人工智能,现代信息技术的核心都归结到“算力”这个关键点上,而处理器正是支撑算力的最关键的部件。鲲鹏920处理器片上系统系列就是华为公司打造的通用计算平台的核心。作者在高校讲授“计算机组成原理”“嵌入式系统”“软硬件协同设计”等课程多年,并与相关企业合作开发应用产品,其间接触到x86、PowerPC、ARM、MIPS等多种处理器体系结构,也亲眼看见了这些年来处理器架构的变化与纷争。最近三四十年,计算机系统的核心应用场景经历了从2000年之前的桌面互联到2000年之后的移动互联的变换,正在向万物互联演进。当前应用的创新速度越来越快,应用的种类和数量越来越多,移动终端配合边缘计算与云计算的“端-边-云”协同方式逐渐成为主流的计算模式,智能创新对计算平台提出了新挑战。正是在这一背景下,自2018年开始,全球众多的处理器厂商推出了基于ARM架构的服务器处理器,向占据统治地位的英特尔处理器架构发起了第三次冲锋。在移动计算和嵌入式环境中占据主导地位的ARM架构处理器可以高效实现“端-边-云”全场景同构互联与协同,并有效降低数据中心的综合运营成本,对基于ARM架构处理器的服务器也提供了更高的并发处理效率和更开放的生态系统与多元化的市场供应,完全可以在运算密集的服务器市场上成为特定应用领域的合理选择。

本书是一本专门介绍华为鲲鹏920处理器片上系统的参考书。由于ARM架构在嵌入式计算与移动计算领域的强大影响力,许多不熟悉华为鲲鹏的人会误以为这是又一款高性能的移动计算处理器。事实上,鲲鹏920处理器片上系统不仅是通用计算机的处理器,而且其主要应用领域是面向服务器市场的。由于华为海思完全自主设计的鲲鹏920处理器片上系统与高性能64位处理器的ARMv8-A架构完全兼容,因而可以充分利用成熟的ARM生态环境,同时向用户提供华为的创新技术。也正是因为保持与主流处理器架构的兼容性,鲲鹏920处理器片上系统的用户可以很方便地利用通用的软件解决方案,并通过软件调优最大限度地优化其应用程序。期望本书能够为读者全面了解和应用鲲鹏920处理器片上系统提供帮助。

本书按照逐级深入的方式组织内容。不太熟悉现代处理器和服务器的读者可以通过第1章了解现代高性能处理器的并行架构,也可以对服务器的体系结构与核心技术有基本认知。第2章总结了ARMv8-A处理器架构的逻辑组成及其关键特性,以便为读者深入理解鲲鹏920处理器片上系统打下基础。第3章是本书的核心内容之一,向读者全面展示鲲鹏920处理器片上系统的组织结构、处理器内核架构及基于鲲鹏920处理器片上系统的TaiShan服务器的整体优势。第4章介绍鲲鹏的软件生态和构架,是基于鲲鹏920处理器片上系统的应用工程师和调优工程师需要重点关注的内容。为帮助读者尽快实现向鲲鹏架构的迁移,本书最后一章给出了鲲鹏920处理器片上系统软件安装、配置与加速器设计的应用实例。期望更进一步了解和应用鲲鹏920处理器片上系统的读者可以从本书附录A中了解鲲鹏社区、鲲鹏开发套件、鲲鹏开发者系列课程和鲲鹏应用开发者认证计划等相关信息。

ARMv8-A架构是高性能的处理器架构,基于该架构的鲲鹏920处理器片上系统也具备众多高级特性。本书不能替代ARM公司和华为公司的架构规范文档或用户手册,也不可能涵盖ARMv8-A架构和鲲鹏920处理器片上系统的全部细节,只能为读者深入理解高性能服务器处理器的整体结构提供一点帮助。有需要的读者可以参阅ARM开发者网站和华为公司的网站获取丰富的参考材料和电子资源。

本书第1、2、3章由戴志涛编写,第4章和第5章由刘健培编写,全书由戴志涛负责内容组织与统稿。华为公司为本书的编撰和出版提供了大量资源和支持。华为公司的有关专家和工程技术人员对全书的整体结构和内容选择提出了宝贵意见,并审阅了全书的初稿。清华大学出版社首席策划盛东亮老师提出了诸多有益的建议,编辑钟志芳老师花费大量心血仔细校阅了全书稿件。在此,作者表示衷心感谢。

本书在编写过程中参考了许多相关资料,特别是参考了ARM公司和华为公司相关网站提供的丰富信息,作者对这些文献和参考资料的作者和相关机构表示感谢。

限于作者能力所限,书中难免存在疏漏,恳请读者谅解并指正。

2020年注定不是一个普通的年份。对于全球近两百个国家的75亿人而言,这场突如其来的疫情改变了多少人的生活与工作方式,又让多少人感受到无助与迷茫?而在中国的信息通信领域里,“华为”无疑成了焦点。无论是普通的手机用户还是信息通信技术的专业人士,似乎都在思考着同样的一个问题:在被极端打压的环境下,华为还能够“化鲲为鹏”,展翅高飞吗?2020年上半年,在被疫情困在家中的日子里,作者在网上授课之余匆匆完成本书的编写,也期望为华为出一点点微薄之力。毫无疑问,鲲鹏并不是完美的作品,也许存在bug,也面临着强大的对手。它需要经历市场的不断打磨,也需要不断修补漏洞和升级改进。我们需要给它一点点宽容,也留下期待。在这二十年中,我们见证了很多品牌的起起落落,那么多国际知名企业倒下去了,华为也经历了风风雨雨,我们期待鲲鹏展翅,期待华为凤凰涅槃。

作者

2020年6月于北京





目 录


第1章 服务器与处理器

1.1 服务器体系结构

1.1.1 服务器的分类

1.1.2 服务器的性能评价

1.1.3 服务器的可靠性与管理

1.2 服务器处理器

1.2.1 高性能处理器的并行组织结构

1.2.2 英特尔处理器体系结构

1.2.3 ARM处理器体系结构

1.3 服务器技术基础

1.3.1 高性能处理器的存储器组织与片上互连

1.3.2 内存顺序模型与内存屏障

1.3.3 服务器虚拟化技术

1.3.4 PCI Express总线

第2章 ARMv8-A体系结构

2.1 ARMv8-A处理单元的核心架构

2.1.1 ARMv8-A架构的处理器运行模式

2.1.2 ARMv8-A架构的寄存器

2.1.3 ARMv8-A架构的异常与中断

2.2 ARMv8-A处理单元的存储系统架构

2.2.1 ARMv8-A架构的内存模型

2.2.2 ARM架构的系统存储管理单元

2.3 ARMv8-A架构的服务器特性

2.3.1 ARMv8-A的服务器架构标准化

2.3.2 ARMv8-A的RAS扩展与PMU扩展

第3章 鲲鹏处理器片上系统架构

3.1 鲲鹏处理器片上系统与TaiShan处理器内核架构

3.1.1 鲲鹏处理器片上系统概况

3.1.2 TaiShan V110处理器内核微架构

3.1.3 鲲鹏920处理器片上系统的逻辑结构

3.1.4 鲲鹏920处理器片上系统的内存储系统

3.2 鲲鹏920处理器片上系统的组织与管理

3.2.1 鲲鹏920处理器片上系统的配置

3.2.2 鲲鹏处理器多芯片系统

3.2.3 鲲鹏920处理器片上系统的管理与安全架构

3.2.4 鲲鹏920处理器片上系统的PMU

3.3 鲲鹏920处理器片上系统的设备与输入/输出

3.3.1 鲲鹏920处理器片上系统的输入/输出概述

3.3.2 鲲鹏920处理器片上系统的PCIExpress控制器

3.3.3 鲲鹏920处理器片上系统的平台设备

3.3.4 鲲鹏920处理器片上系统的附加设备

3.4 基于鲲鹏920处理器片上系统的TaiShan服务器

3.4.1 TaiShan 200服务器的组成与逻辑结构

3.4.2 TaiShan 200服务器的RAS技术

3.4.3 TaiShan 200服务器的鲲鹏加速引擎

第4章 鲲鹏软件生态和构架

4.1 鲲鹏软件生态与云服务

4.1.1 ARM授权机制

4.1.2 ARM服务器生态

4.1.3 鲲鹏服务器软件生态

4.1.4 鲲鹏云服务及解决方案

4.2 鲲鹏软件构成

4.2.1 硬件特定软件

4.2.2 操作系统内核

4.2.3 基础库

4.2.4 开发工具、中间件和应用程序

4.2.5 云基础软件

4.3 鲲鹏软件开发模式

4.3.1 原生开发模式

4.3.2 交叉开发模式

4.3.3 云端开发模式

4.4 鲲鹏软件移植

4.4.1 鲲鹏软件移植流程

4.4.2 编译工具的选择

4.4.3 编译参数移植类案例

4.4.4 源码修改类案例

4.4.5 鲲鹏分析扫描工具Dependency Advisor

4.4.6 鲲鹏代码迁移工具PortingAdvisor

4.5 鲲鹏软件性能调优

4.5.1 鲲鹏软件性能调优流程

4.5.2 CPU与内存子系统性能调优

4.5.3 网络子系统性能调优

4.5.4 磁盘I/O子系统性能调优

4.5.5 应用程序性能调优

4.5.6 基础软件性能调优

4.5.7 鲲鹏性能优化工具TuningKit

第5章 鲲鹏软件实战案例

5.1 云服务器源码移植和编译

5.1.1 配置云服务器

5.1.2 Porting Advisor代码移植

5.1.3 搭建交叉编译环境

5.1.4 x86云服务器交叉编译OpenSSL

5.1.5 鲲鹏云服务器上编译OpenSSL

5.2 Docker的安装与应用

5.2.1 安装Docker

5.2.2 运行和验证

5.2.3 Docker常用命令

5.2.4 卸载Docker

5.2.5 制作适配鲲鹏架构的Docker镜像

5.3 KVM的安装与应用

5.3.1 安装KVM

5.3.2 创建虚拟机

5.3.3 配置虚拟机

5.3.4 克隆与修改虚拟机

5.3.5 启动与关闭虚拟机具体操作步骤如下:

5.3.6 常用命令

5.4 QEMU的安装与应用

5.5 Android模拟器的安装与使用

5.6 鲲鹏加速引擎的安装与使用

5.6.1 鲲鹏加速引擎的安装与测试

5.6.2 鲲鹏加速引擎的应用案例

参考文献

附录A 鲲鹏开发者资源

A.1 鲲鹏社区

A.2 鲲鹏教学资源

1. 鲲鹏开发者系列课程

2. 云端鲲鹏沙箱实验

3. 鲲鹏系列微认证

4. 华为云职业认证鲲鹏项目

A.3 鲲鹏技术论坛





第1章 服务器与处理器


本章首先简要介绍服务器的相关概念、分类及特征,然后重点总结在服务器领域主流的英特尔系列处理器以及新兴的ARM架构服务器处理器的历史演变。为方便读者了解现代服务器相关的技术背景,本章还将简要介绍在高性能服务器中普遍采用的一些主要技术。





1.1 服务器体系结构


服务器(Server)是一个使用非常广泛的技术用语。一般意义的服务器是指通用计算机硬件的一个类别或形态,也即在网络环境下运行相应的应用软件为网上用户提供信息资源共享和网络、Web应用、数据库、文件、打印等各种服务的一种高性能计算机。广义而言,任何计算机都可以安装网络操作系统并连接到网络上对外提供服务,因而都能够在一定程度上承担某些特定的服务器功能。但是通常所说的服务器一般被当作网络数据的节点和枢纽,负责为网络中的多个客户端或用户同时提供信息服务,因而对其功能和性能的要求远比只服务于少数人并承担个人业务的个人计算机(Personal Computer,PC)高出许多。

作为一种特定的计算机,服务器与一般计算机系统的整体组成结构并无不同,同样包含CPU(Central Processing Unit,中央处理器)、内存储器、硬盘、总线和各种外部扩展部件等。特别之处在于,服务器硬件需要承担大量服务,必须要有足够的系统处理能力,因而服务器通常具备高速运算能力和强大的外部数据吞吐能力等。此外,服务器通常需要长时间连续提供服务,因而又必须具备高可靠性、高可用性、高可扩展性、高安全性和可管理性等特征,以避免因故障停机、网络中断、数据丢失等意外引起服务失效,造成巨大损失。因此,服务器硬件一方面会使用专门设计的高性能、高可靠性的中央处理器、系统总线和存储系统部件以提升系统配置,另一方面又会采用对称多处理器(Symmetric Multi-Processor,SMP)技术、冗余备份技术、在线诊断技术、故障诊断告警技术、传输存储加密与检错纠错技术、热插拔技术和远程诊断技术等,尽最大可能提升系统持续、可靠地提供高性能服务的能力。





1.1.1 服务器的分类


服务器有各种不同种类,其分类没有统一的标准,可以从多个维度对服务器分类。例如,按照应用场景可以把服务器分为文件服务器、Web应用服务、FTP(文件传输协议)服务器、光盘镜像服务器、数据库服务器、流媒体服务器、电子邮件服务器等;也可以按用途把服务器划分为通用型服务器和专用型服务器两类,后者是为某一种或某几种功能专门设计的服务器。

在设计和选配服务器时比较重要的分类方式通常是按照其应用层次、机械结构、用途和处理器架构分类。





1. 按应用层次分类


按应用层次划分,服务器大致分为入门级服务器、工作组级服务器、部门级服务器和企业级服务器四类。这几类服务器之间的界限并不严格,只是服务器等级的粗略划分。

1)入门级服务器

显然,入门级服务器是一种满足最基本的服务器功能和性能要求的低端设备。入门级服务器通常只使用少量CPU,并根据需要配置相应的内存储器和大容量硬盘,必要时也会采用RAID(Redundant Arrays of Independent Disks,独立磁盘冗余阵列)技术进行数据冗余保护。入门级服务器主要满足办公室的中小型网络用户的文件共享、打印服务、简单数据库应用、互联网接入及小型网络范围内的电子邮件、万维网(Web)服务等应用需求。由于服务业务量不大,因而对硬件配置的要求相对较低,也不需要特别专业的维护管理工作支持。

2)工作组级服务器

工作组级服务器大致的服务范围为50台左右的个人计算机组成的网络工作组,其性能较入门级服务器有所提高,功能也有所增强,并且可以支持一定程度的可扩展性要求。这类服务器一般会支持对称多处理器结构、热插拔硬盘和热插拔电源等功能,易于管理和维护,具有高可用性。工作组级服务器可以满足中小型网络用户的数据处理、文件共享、互联网接入及简单数据库应用的需求。

3)部门级服务器

部门级服务器属于中档服务器,一般具备比较完备的硬件配置,具有全面的服务器管理能力,集成了大量的监测及管理电路,可监测温度、电压、风扇和机箱工作状态等状态参数。大多数部门级服务器能够满足用户在业务量迅速增大时所需的系统可扩展性要求,能够及时在线升级系统。

部门级服务器是企业网络中在分散的各基层数据采集单位与最高层数据中心之间保持顺利连通的必要环节,适合中型企业用于数据中心、Web服务器等应用场景。

4)企业级服务器

企业级服务器属于高档服务器,其功能和性能能满足大业务量、长时间稳定服务的需求。企业级服务器普遍支持较多的处理器配置,拥有高性能的内存和扩展总线设计,配置大容量热插拔硬盘和热插拔电源,具有超强的数据处理能力。

除了具有部门级服务器的全部特性外,企业级服务器最大的特点就是在可靠性工程方面做了大量优化,具有高度的容错能力、优良的可扩展性能,支持故障预报警功能、在线诊断和部件热插拔功能,可满足极长的系统连续运行时间要求。

企业级服务器主要适用于金融、证券、交通、通信、电子商务和信息服务等需要高速处理大量高并发业务数据并对可靠性要求极高的大型企业和重要行业,可用于支撑企业资源管理、电子商务、办公自动化和大型企业级数据库服务等应用需求。





2. 按机械结构分类


按服务器的机械结构和外观划分,服务器可以分为塔式(台式)服务器、机架式/机柜式服务器和刀片服务器。

1)塔式(台式)服务器

塔式服务器(Tower Server)也称为台式服务器,如图1.1所示,其外观与结构类似于普通台式个人计算机,塔式服务器是一种最常见的服务器。由于该服务器的扩展性较强,配置通常也较高,所以塔式服务器的主机机箱通常比标准的个人计算机的机箱要大,一般都会预留足够的内部空间以便进行硬盘和电源等部件的扩展。

图1.1 塔式服务器示意图



塔式服务器更多地应用在入门级和工作组级服务器上。其优点是成本较低,无须搭配额外设备,对放置空间的要求较低,并且具有良好的可扩展性,可以满足大部分中小企业用户常见的应用需求。但是塔式服务器也有不少缺点,例如体积较大,占用空间多,密度低,不方便管理,不适合用在需要采用多台服务器协同工作以满足更高的应用需求的场景。

2)机架式/机柜式服务器

机架式服务器(Rack Server)也称为机架安装服务器(Rack-mounted Server),是服务器的主流机械结构之一。机架(Rack)结构是传统电信机房的设备结构标准,机架内包含很多安装槽,每个安装槽内都可以用螺丝或免螺丝刀固定装置把硬件设备固定在适当位置上。因而机架式服务器的外观更像是网络通信设备,安装在标准的19英寸(1)机架内。服务器的宽度为19英寸,高度以1U为基准单位,1U等于1.75英寸(4.445cm)高度,通常有1U、2U、4U和8U等规格,以1U和2U最为常见。

与安装在垂直、独立机箱中的塔式服务器相比,机架式服务器的机箱高度有限。一个机架上可以安装层层堆叠的多台标准设备,因而可以在有限的空间内部署更多的机架式服务器,这有助于降低整体服务成本。机架式服务器因其配置方式简化了网络组件的布线,尤其在信息服务类企业的数据中心机房中应用最为普遍。在大型专用机房可以通过标准化的方式统一部署和管理大量的机架式服务器,并综合考虑服务器的体积、功耗、发热量等物理参数,在机房中配置严密的保安措施、良好的冷却系统和多重备份的供电系统。

在高档服务器应用场景中,还会采用机柜式服务器。机架一般为敞开式结构,而机柜采用全封闭式或半封闭式结构,因而使用机柜更方便进行热管理,并具有增强电磁屏蔽效果、降低设备工作噪声以及过滤空气等功能。

图1.2为华为TaiShan200机架式服务器的前视图和后视图。

图1.2 华为TaiShan200机架式服务器



3)刀片服务器

随着用户对系统总体运营成本和系统管理维护成本关注度的日益提升,刀片服务器(Blade Server)已经成为高性能计算机群的主流。

刀片服务器是一种单板形态的服务器结构,也是机群系统的一种常见实现方式。刀片服务器将传统的机架式服务器的所有功能集中在一块高度压缩的电路板中,然后再插入机柜或机架内。多台刀片服务器能够重叠在一起,方便地插入一个机架或机柜的平面中,充分节省空间。每一块“刀片”实际上就是一块单独的很薄的服务器系统主板,集成了一个完整的计算机系统,包括处理器、内存、硬盘、网络连接和相关的电子器件,并独立安装自己的操作系统,但网络等I/O(Input/Output,输入/输出)接口及供电、散热和管理等功能则全部由机柜统一提供。刀片服务器之间共享公用高速总线,共用机架或机柜基础设施,并支持冗余特性,又由于设备的发热量降低,因而采用刀片服务器降低了能源消耗。

因此,刀片服务器是为高密度计算环境专门设计的一种实现高可用、高密度的低成本服务器。刀片服务器属于高密度服务器,可以构成完成某一特定任务的服务器机群。大型数据中心或互联网服务提供商(Internet Service Provider,ISP)的网站服务器主机一般都采用刀片服务器。

图1.3显示了华为刀片服务器的机箱与计算节点。

图1.3 华为刀片服务器机箱与计算节点





3. 按用途分类


根据服务器主要提供的服务,可以将其大致分为以下几类。

1)业务服务器

业务服务器用于支撑某类特定业务的服务,例如Web应用服务器、数据库应用服务器、大数据分析服务器等。

2)存储服务器

存储服务器专注于提供数据存储功能,通常这类服务器会包含大量的磁盘等外存储器设备。

3)其他专用服务器

为了提供高性能的专业服务,有些数据中心会把部分专用的功能汇聚在一起,这些专用服务器会被独立管理,专门用于解决特定的问题,通常也会配置专用的硬件和软件。

例如人工智能的训练通常需要借助异构计算架构提供算力,这类机器往往需要配置大量的GPU(Graphics Processing Unit,图形处理器)或FPGA(Field Programmable Gate Array,现场可编程门阵列)实现CPU加速,而专用于安全服务的设备可以配置专用的加密/解密硬件加速器。





4. 按处理器架构分类


对任何计算机系统而言,处理器都是核心,服务器也不例外。在某种程度上,服务器使用的处理器体系结构(架构)对服务器的功能、性能、成本、功耗及其生态环境的影响巨大。

通常可以根据处理器在其设计时遵循的原则将计算机划分为CISC(Complex Instruction Set Computer,复杂指令集计算机)和RISC(Reduced Instruction Set Computer,精简指令集计算机)。相应地,处理器体系结构也被划分为CISC架构和RISC架构。虽然从处理器的设计思想看,CISC架构和RISC架构各有各的明显特征,但是现代处理器设计都会尽可能吸收利用RISC处理器设计思想中的精华。因而现代处理器结构中已经很难找到完全符合CISC架构特征的实例了。尽管如此,人们习惯上仍会把从早期的CISC架构延续下来并与之保持指令集兼容的处理器称为CISC架构处理器。

按照所使用的处理器的体系结构划分,服务器可以分为CISC架构服务器、RISC架构服务器和EPIC架构服务器。其中,EPIC架构是一种特殊的RISC架构。

1) CISC架构服务器

CISC架构服务器主要是指采用英特尔(Intel)公司的Intel64架构、超威半导体(AMD)公司的AMD64架构处理器及早期的32位IA-32架构处理器的服务器。由于这种架构的服务器是从个人计算机发展而来的,和PC采用的处理器体系结构相似,因此也被称为PC服务器或x86服务器。

CISC架构服务器是当前服务器市场的主流,据统计其出货量占到服务器总出货量的90%以上。

当前使用的x86架构的服务器处理器主要有英特尔公司的至强(Xeon)系列和AMD公司的皓龙(Opteron)系列、霄龙(EPYC)系列等。其中,英特尔公司在服务器处理器市场上占据着相当大的份额。

2) RISC架构服务器

RISC架构服务器一般是指采用非英特尔架构的服务器,例如IBM的Power系列、惠普公司的Alpha系列和PA-RISC系列、SUN/Oracle公司的SPARC系列、MIPS公司的MIPS处理器等采用RISC架构处理器的服务器,也包括最近几年迅速进入市场的ARM架构服务器。

RISC架构的服务器基于不同体系结构的RISC处理器,一般而言其价格昂贵、体系封闭,主要采用UNIX和其他专用操作系统,但是稳定性好、性能强大,在金融、电信等大型企业和关键应用领域中居于非常重要的地位。

早期进入市场的RISC架构服务器,由于用途单一、生产规模太小,因而其处理器价格居高不下,目前大部分产品已经停止销售了。当前,除了新兴的ARM架构服务器之外,在中高档服务器市场上销售的RISC架构服务器处理器中,IBM公司的Power架构是主流,占据了最大的UNIX服务器市场份额。

Power架构是由苹果公司、IBM公司和摩托罗拉公司共同开发的微处理器架构,Power的含义是“性能优化的增强RISC处理器(Performance Optimized With Enhanced RISC)”。Power架构性能强大,但价格高昂,其在硬件上的最大特点是采用对称多处理器(SMP)技术,可以保障任何一个CPU访问内存的速度都相同。在国内,IBM公司与浪潮电子信息产业股份有限公司共同建立的合资企业———浪潮商用机器有限公司(IPS)负责运营Power服务器业务。IBM公司于2019年发布了Power指令集架构的开放标准,芯片设计人员能够在无须支付许可费的情况下将OpenPower功能加入自己的处理器中,甚至可以针对特定的应用场景扩展和定制指令集。

最新的Power9处理器采用全新的构架,其指令流水线支持8条指令取指、6条指令分发和9条指令发射,执行单元位宽达128位,共可以实现256位数据执行位宽以及独立的存储器访问(Load和Store)队列。Power9支持SMT8或SMT4处理器内核两种配置,图1.4显示了IBMPower9 SMT8处理器内核的核心架构。从图1.4中可以看出,Power9处理器的核心由VSU(Vector Scalar Unit,向量标量单元)流水线、LSU(Load Store Unit,加载存储单元)和BRU(BRanch Unit,分支单元)等部件构成,处理器针对性能和效率进行了精准优化。

早期由SUN公司开发、目前由Oracle(甲骨文)公司继承的SPARC(可扩展处理器架构,Scalable Processor ARChitecture)也曾在高性能服务器领域占据优势地位。Oracle公司和富士通公司仍在生产基于SPARC架构的服务器。SPARC架构以可扩展性见长,因与Oracle软件一体化设计,可以更好地支持业务关键型环境的数据库和企业应用。

图1.4 IBM Power9 SMT8处理器内核的核心架构



最近几年,ARM架构的处理器进军服务器市场,多家企业推出的ARM架构服务器正在收复RISC架构服务器的阵地。

3) EPIC架构服务器

EPIC即显式并行指令计算(Explicitly Parallel Instruction Computing),采用这一架构的处理器就是英特尔公司和惠普等公司联合开发的基于IA-64架构的安腾(Itanium)处理器。虽然安腾处理器也被认为是RISC处理器,但其体系结构却与其他RISC处理器有显著的不同,其最突出的特色即显式并行指令计算技术与超长指令字技术的结合。

安腾处理器的指令字中设计了属性字段,用于指明哪些指令可以并行执行。这些属性信息并不是在指令执行过程中由处理器判定后获得的,而是由编译程序在编译时通过对源代码的分析获取指令级并行性信息并填写到执行代码中。这就是所谓的“显式并行”的概念。

传统的超标量RISC体系结构虽然同样支持指令级并行,但并没有充分利用编译程序产生的许多有用信息去调整程序的运行路线,因而RISC处理器必须设计非常复杂的并行调度电路。EPIC技术则充分利用现代编译程序强大的对程序执行过程的调度能力,由专用的EPIC编译器首先分析源代码,根据指令之间的依赖关系最大限度地挖掘指令级的并行性,从而确定哪些指令可以并行执行,然后把可并行执行的指令组合在一起并重新排序,提取并调度其指令级的并行性,并将这种并行性通过属性字段“显式”地告知指令执行部件。与RISC处理器在指令执行的很短的时间内对数十条指令的可执行代码进行扫描和并行性优化相比,EPIC编译器有足够多的时间扫描足够长的源代码,从而获得全局性的并行编译优化效果,并使处理器硬件变得简单而高速。从这个意义上说,安腾体系结构中处理器的功能是由处理器硬件和软件编译器两部分协同完成的。处理器硬件只需按序高速并行处理指令和数据,EPIC编译器从某种意义上等价于协调并行工作必需的一部分控制电路。这一方面降低了处理器的复杂度,简化了处理器的结构,大大缩短了处理器在程序执行时所消耗的时间;另一方面又打破了传统体系结构顺序执行的限制,使处理器的并行计算能力达到了更高的水平。

VLIW(Very Long Instruction Word,超长指令字)技术也是提高计算机系统并行性的有效手段。VLIW系统中指令字长可多达几百位,由编译器在编译时找出指令间潜在的并行性,进行适当的调度安排,把多个能够并行执行的操作组合在一起合并成一条具有多个操作码的超长指令,控制处理器中的多个相互独立的功能部件,相当于同时执行多条指令,从而提高处理器的并行性。

而EPIC正是基于超长指令字的设计。编译器生成的可执行代码并不是串行指令,而是一系列长度固定为128位的“指令束”(Instruction Bundle),每个“指令束”包含了3条各为41位长的指令和5位长的指令模板。处理器在执行指令时每次取得一个指令束,并向各执行单元同时发送3条指令,这使得单个芯片内的并行能力达到了新的高度。通过将多条指令放入一个超长指令字,能有效提高处理器内各个执行部件的利用率。

虽然EPIC处理器的设计思想有其独到之处,但由于生态环境等原因,生产EPIC架构服务器的惠普(HP)公司已经宣布将于2025年前停止对基于安腾处理器的服务器的支持,届时EPIC架构将完全退出市场。





1.1.2 服务器的性能评价


服务器的处理能力和稳健、连续、可靠的工作能力是其区别于个人计算机的最重要的两个方面。在评价服务器的处理能力时,测试基准(Benchmark)是最常见的工具。当企业或客户无法通过建立接近真实业务应用的操作环境进行各种压力测试时,借助各类测试基准测算出不同应用环境下服务器系统的响应时间、吞吐量等指标有助于相对客观地对服务器的性能做出接近真实状况的评估。

基准测试程序集成了某一类用户的典型负载,是进行程序性能度量的有力工具。基准测试程序针对特定的应用环境,通过一组有代表性的程序评估系统的性能,比单个程序更能代表用户的负载状况。测试程序以程序运行时间长度为度量,或是以单位时间内完成的操作数量为度量,两者存在对应关系。测试程序会给出某个系统的分数,通常是程序运行时间的函数。

在服务器的工业标准基准测试体系中存在众多的性能测试基准,包括TPC、SPEC、SAP SD、Linpack和HPCC等,可以从处理器性能、服务器系统性能、商业应用性能,乃至高性能计算机系统的性能等不同层面给出量化的参考评价指标。不同的测试基准的侧重点不同,例如:Linpack基准侧重于系统浮点峰值运算能力的测试,成为全球超级计算机500强(TOP 500)的评测基准;而STREAM测试基准关注对系统的数据访问能力的定量评价;SPEC CPU测试基准和SPECWeb测试基准分别针对单CPU性能及作业吞吐能力和应用于Web服务器时的性能。这些测试基准中,最常用的是TPC和SPEC两大基准。





1. TPC测试基准


TPC代表事务处理性能委员会(Transaction processing Performance Council),是由以计算机软硬件厂家为主的数十家会员企业联合创建的非营利性组织,总部设在美国。该组织的主要工作是制定商务应用基准测试程序的测试基准,以及评估和检测这些测试基准的完整流程。TPC定义了一系列基准测试程序的标准规范,以及能耗、性能和价格度量标准,并在其网站(http://www.tpc.org)发布测试源码(早期的版本不提供测试源码)和TPC测试结果。

从TPC的名称可以看出,TPC的测试体系侧重在线处理能力和数据库查询能力。TPC推出的测试基准有很多种,分别针对不同的应用场景或者使用不同的评测手段。例如,目前针对在线事务处理(On-Line Transaction Processing,OLTP)的测试基准有两个:TPC-C和TPC-E。TPC-C(TPC测试基准C,TPC Benchmark C)的最新规范版本为2010年发布的5.11版。TPC-C从系统的角度反映数据库应用的性能,其测试包含处理器、内存储器和输入/输出设备在内的系统整机,因此该基准推出后被广泛用于评估服务器的性能。而2007年推出的TPC-E测试基准比TPC-C更能反映当前的技术现实,测试成本也更低,其最新版本为2015年发布的1.14.0版。

TPC测试基准中比较常用的还有用于决策支持和大数据的测试标准TPC-H和TPC-DS,以及用于服务器虚拟化测试的基准TPC-VMS等。早期的TPC-A、TPC-B、TPC-D等标准已经停止使用,并被新的标准取代。





2. SPEC测试基准


SPEC指的是标准性能评估机构(Standard Performance Evaluation Corporation),是由超过60家世界知名计算机厂商支持的全球性的、非营利性的第三方应用性能基准测试组织,旨在确立和认定一系列服务器应用性能评估的标准。SPEC组织的成员包括IBM、AT&T、DG、DEC、富士通、HP、英特尔、MIPS、摩托罗拉、SUN、Unisys等知名企业。

相对而言,SPEC测试基准能够更全面反映机器的性能,具有很高的参考价值。SPEC同样会根据应用领域的不同设置不同的测试基准。

SPEC针对云计算场景推出的测试基准为SPECCloud IaaS,是面向基础架构即服务(Infrastructure-as-a-Service,IaaS)的云计算SPEC基准。该基准侧重于拥有多种多实例工作负载(Multi-instance Workloads)的IaaS公有云平台和私有云平台的配置、计算、存储和网络资源。最新的版本为SPECCloud IaaS 2018。

针对图形和工作站性能,SPEC除了推出面向专业应用的图形性能测试基准———SPECviewperf和SPECviewperf Linux Edition,面向工作站的测试基准———SPECworkstation外,还针对Autodesk3ds Max、Maya、Solidworks等常用软件专门推出了相应版本的SPECapc测试基准。

针对高性能计算和OpenMP、MPI、OpenACC及OpenCL等异构与并行计算场景,SPEC推出了SPECACCEL、SPEC MPI、SPEC OMP测试基准。

针对Java的客户机/服务器体系,SPECjbb测试基准面向JVM虚拟机厂商、硬件设计师和Java应用程序员以及研究人员,用于评估Java服务器性能; SPECjEnterprise基准及其WebProfile版本则是度量Java企业版(Java EE)应用服务器、数据库及其支撑架构全系统性能的工具。SPECjvm基准则用于Java运行环境(Java Runtime Environment,JRE)的测试。

SPEC基准也有专门面向文件服务器存储应用、功耗评估和虚拟化应用的SPECSFS、SPECpower_ssj和SPECVIRT_SC等版本。

上述这些SPEC测试基准通常面向特定应用领域和特定应用场景,甚至面向特定应用软件,而其覆盖范围一般会涉及处理器和存储器在内的运行环境。由于这些基准通常能够体现软、硬件平台的性能和成本指标,因而被金融、电信、证券等关键行业用户作为选择信息系统的权威基准指标。SPEC测试基准规范中历史最悠久、应用最普遍的应该就是SPECCPU基准了。

SPEC CPU测试基准体系针对支撑运算密集的工作负载的计算机系统的性能度量,并支持在众多计算机系统之间进行比较。该基准重点关注计算机系统的处理器、存储子系统和编译器,不涉及硬盘、输入/输出和网络等部件。SPEC CPU测试基准经历了SPECCPU 92、SPEC CPU 95、SPEC CPU 2000、SPEC CPU 2006和SPECCPU 2017等多个版本。

在2006年版的SPECCPU测试基准中,包含针对定点数运算的SPECint测试和针对浮点数运算的SPECfp测试。前者共有12个不同的基准测试项,使用C语言或者C++语言,不使用CPU的浮点运算单元;后者共有19个不同的基准测试项,使用FORTRAN77/90语言和C语言。

更进一步地讲,SPEC CPU测试基准通过不同方式度量处理器性能:测量计算机完成单一任务时间的方式为SPEC速度测量(SPECspeed Metrics),并通过SPECint2006 benchmark指标呈现,用于比较不同计算机完成单一任务的能力;而衡量在特定时间长度内能够完成多少任务的方式称为吞吐率(Throughput)测量、容量(Capacity)测量或者速度(Rate)测量,并通过SPECint_rate 2006 benchmark指标呈现,评价机器承载大量任务的能力,通常用于多CPU系统的评价。

SPEC在其网站(http://spec.org)上发布了CPU测试基准的测试程序源代码,由用户编译生成可执行代码后完成测试,以保证该测试基准能够实现跨平台测试。SPEC CPU测试基准中的大部分源代码来源于真实应用场景,包括各类开源项目。由于源代码到可执行代码的映射并不唯一,因而编译器的效率就显得十分重要。SPEC CPU 2006给出的测试结果有“基础(Base)”和“峰值(Peak)”两种。在基础测试时需要限制编译时的优化参数,以保证测试的公平,而对峰值测试的限制则比较宽松。

最新的SPECCPU 2017版本包含多达43项工业标准的基准测试,划分成4个测试组(Suite):针对整数计算的SPECspeed 2017 Integer和SPECrate2017 Integer测试组,以及针对浮点数运算的SPECspeed 2017 Floating Point和SPECrate2017 Floating Point测试组。SPEC CPU还包含测试能源消耗的选项。其中,SPECspeed 2017 Integer和SPECspeed 2017 Floating Point测试组用于比较完整的单一任务在计算机系统上的执行时间的测试,而SPECrate2017 Integer和SPECrate2017 Floating Point测试组用于吞吐率度量,也即测试单位时间的工作任务量。





1.1.3 服务器的可靠性与管理


IBM公司为了衡量其大型机的稳健性,曾提出可靠性(Reliability)、可用性(Availability)和可服务性(Serviceability)的概念,这三个特性被统称为RAS特性,并且被用作描述计算机与信息系统硬件工程可靠性的一个术语,广泛应用于信息技术相关的各个领域。可服务性也称作可维护性(Maintainability),故RAS有时也被称为RAM。此外,在评价系统稳健性时通常还会考虑可扩展性(Scalability)、易用性(Usability)和可管理性(Manageability)等属性。





1. 服务器的RASUM特性


很多文献把评价服务器或系统是否满足其可靠性工程设计目标的五个特性统称为RASUM,即可靠性、可用性、可扩展性或可服务性、易用性和可管理性。

1)可靠性

可靠性用于描述系统是否能够正确工作,或者说系统是否具有提供持续正确服务的能力,也即软件或硬件是否能够按照其规范持续提供服务。具体而言,可靠性指的是系统能够正确产生输出结果达到一个给定时限的能力。增强可靠性有助于避免、检测和修复故障。这意味着高可靠性的系统必须能够检测某些错误并能够满足下面几个条件之一:

(1)能够自修复错误;

(2)对于无法自修复的错误能够进行隔离并上报给更高层次的自恢复机制处理;

(3)能够停止系统受损部分的运行,并保障系统其余部分正常运转;

(4)能够停止整个系统的工作并报告相应的错误。

可靠性通常用故障率(Failure in Time,FIT)或平均失效间隔时间(Mean Time Between Failure,或称平均无故障时间,MTBF)来度量。1FIT等于每十亿(Billion)小时内产生一个错误,MTBF大约等于11.4万年。

2)可用性

可用性用于描述系统能够正确工作的时间,指的是系统能够在给定的时间内确保可以运行的能力。一般而言,一个高可用性的系统即使出现一些小的问题也不会影响整个系统的正常运行,在某些情况下甚至可以进行热插拔操作,以替换有问题的组件,从而严格地将系统的宕机(停机)或无法正常服务的时间限定在一定范围内。

可用性通常可以用多种方式度量:一定时间内的宕机或不能提供服务的平均时间长度,给定时间内系统宕机或不能提供服务的总时间长度,或者系统实际运行时间中可用时间所占的百分比。可用性可以使用下面的公式计算:

可用性=正常运行时间(up time)/总时间(total time)

也可以等价表示为:

可用性=[总时间(total time)-停机时间(down time)]/总时间(total time)

高可用性的系统一般在一年中可能只有数小时甚至数分钟的停机时间。例如,5个9的可用性是指可用时间占到99.999%,系统连续运行一年时间最长的服务中断时间是:

(1-99.999%)×365天×24小时×60分钟=5.26分钟

在运营商的通信服务器、电子商务网站服务器、银行和证券的交易系统等需要持续稳定服务的场景中,系统的高可用性能产生巨大价值。

3)可服务性

可服务性(可维护性)用于描述系统的容错能力,也即在出现错误之后通过维护或维修恢复服务的难易程度。因此,尽早发现潜在问题是提高可服务性的关键,可服务性高的系统甚至能够在严重故障出现之前实现自动修复。

具体而言,可服务性指的是系统是否能够提供便利的诊断功能,如系统日志、动态检测等,方便管理人员进行系统诊断和维护操作,从而及早地发现错误并修复错误。例如:某些企业级应用系统在发生故障时可在无须人工干预的情况自动启动服务机制,告知设备厂商故障情况并进行诊断、分析和处理操作。

4)易用性

易用性是指用户对系统的易学和易用程度。服务器的功能相对于个人计算机而言更复杂,其硬件配置和软件系统配置更丰富。要让服务器充分发挥其功能和性能优势,必须要解决如何让用户更好地使用服务器的问题。易用性设计的重点在于让系统设计更能够符合使用者的习惯与需求。

对服务器硬件设计而言,常见的免工具拆卸设计、可热插拔的电源模块及硬盘模块设计、清晰直观的前端面板系统状态标识灯等机箱设计人性化手段都是服务器在易用性方面的设计实现。

对于服务器而言,其用户主要是系统管理员,服务器软件易用性主要体现在服务器是否容易操作,用户导航系统是否完善,是否有关键恢复功能及操作系统备份功能等。软件的易用性通常包含可学习性,效率,可记忆性,很少出现严重错误和满意度高等方面。

5)可管理性

可管理性(易管理性)描述的是系统在运行过程中便于管理的程度,也即一个系统能够满足管理需求的能力及管理该系统的便利程度。大多数系统管理任务由系统管理员通过使用一系列管理工具来完成,少数管理任务需要领域专家的参与,另外一些任务则可由管理系统自动完成。对于与服务器相关的种类繁多的硬件设备,每个设备都要有相应的工具提供全面的管理支持,例如网络流量监控、数据库软件的参数配置、服务器所处环境的温度监测等,设备本身为管理功能的实现提供支持。

服务器的可管理性通常通过智能管理系统实现。服务器硬件通常配置键盘(Keyboard)、视频(Video)、鼠标(Mouse)端口,能够直接连接外部人-机交互设备,实现访问和控制。服务器也通过管理网口实现服务器的远程管理,例如通过IPMI(Intelligent Platform Management Interface,智能平台管理接口)2.0来实现远程对服务器的物理健康特征的监控,包括温度、电压与风扇工作状态、电源状态等。

良好的易管理性可以有效减少系统的管理和维护成本。

6)可扩展性

服务器的可扩展性(可伸缩性)是指服务器的硬件配置可以根据需要灵活改变。例如,服务器的内存容量、适配器和硬盘数量及处理器参数等可以随着不同的需要而改变配置。

通常在机架上要为硬盘和电源的增加留有充分余地,主机板上的扩展插槽不但应种类齐全,而且保证有一定数量。





2. RAS技术


对于承载关键业务而又要提供连续服务的服务器系统而言,处理能力越高,承载的业务越多,服务器计划外宕机对用户的影响就越大。据调查,计划外宕机造成的业务成本往往高达每小时数十万甚至上百万美元。除了金钱之外,意外宕机的损失还包括对企业声誉的负面影响、客户不自觉流失及员工无法按计划工作等。

RAS技术可以通过以下方式有效减少故障出现的概率:在造成系统失效之前检测并修正瞬时错误;定位和替换失效部件;提前预测失效,以便在计划的维护时间内更换系统或部件。

1)高可靠性技术

一个高可靠性系统在发生故障时应能自动检测错误,甚至能修复错误。提升可靠性有多种方式:减少系统中的组件数量或系统中的连接器的数量有助于延长系统的平均无故障间隔时间;通过纠错码、数据校验以及指令级重试等手段修复间歇性错误,确保数据完整性也能够提高可靠性;针对无法修正的错误,可以采用隔离故障部件并上报给高级系统恢复机制或切换至冗余部件等方式。

2)高可用性技术

高可用性系统可以在发生故障后继续运行,其实现方式可以是禁用发生故障的部件,此时虽然系统性能有可能会有一定程度的降低,但保证了整个系统的可用性。

高可用性还可以通过下面的方式实现:

(1)部件冗余配置。如果系统停机造成的损失高于冗余部件本身的成本,对部件进行冗余配置就是一种合理的解决方案。

(2)采用在部件或子系统内部提升数据可用性的技术,例如具有热备份功能的内存条或支持镜像的磁盘驱动器等。

(3)在采用集群架构的系统中,持续监视服务器、存储部件、网络子系统和应用程序的运行状况有助于维持服务的高可用性。

3)高可服务性技术

高可服务性系统一般要支持部件的热插拔(Hot Plug)或热切换(Hot Swap)功能,以便在系统带电工作的情况下进行维护。热切换操作不需要主机操作系统和服务器提供协助或提前做好准备;可以在系统运行过程中更换部件,也无须任何设置工作;而热插拔操作需要操作系统和服务器在移除或插入部件之前做好准备,热插拔之后可能还需要执行一些额外的设置命令才能令部件正常工作。

提升系统的RAS特性需要多种技术协同,并统筹考虑处理器、内存储器、输入/输出设备、供电子系统、散热子系统及操作系统、集群软件等多种要素。各种RAS特性之间通常相互依存,有些特性之间还存在相互制约关系,即一种特性的提升会以另一种特性的降低为代价。

例如,提高系统中各个部件的集成度能减少系统中芯片或电路板的数量,从而降低芯片间互连或板间互连引入的干扰,提高系统可靠性。但是这种方案有可能加大系统维护的难度或延长系统维修所需的时间,导致可用性和可服务性的降低。类似地,热插拔或热切换功能要求在系统中增加更多的连接器,因而热插拔或热切换技术在提升了可用性的同时却降低了可靠性。

因此,在设计高可靠性、高可用性及高可服务性系统时需要在各个特性之间取得平衡,还要兼顾系统成本等其他因素,才能有效提升整个系统的RAS性能。





3. 服务器管理规范


IPMI(Intelligent Platform Management Interface,智能平台管理接口)是管理服务器系统中所使用的设备的规范,支持用户利用IPMI技术监视服务器的物理健康特征,如温度、电压与风扇工作状态、电源状态等。IPMI规范最早用于管理基于英特尔架构的企业系统中所使用的外围设备上,现已经成为服务器行业的工业标准。

服务器对运行环境的要求通常比个人计算机严格,需要高标准的供电、冷却等技术的支持,而且风扇噪声更大,多数情况下服务器都会放置于单独的服务器机房。因此,服务器一般不会长期借助显示器、键盘、鼠标等部件进行近端操作与管理,通常通过网络远程连接的方式实现访问与管理。IPMI规范能够覆盖硬件平台、固件和操作系统,可以通过智能的方式监视、控制并自动回报大量服务器的运行状态,以降低服务器系统的运维成本。IPMI是与操作系统无关的,Windows、Linux、Solaris及MacOS等不同的操作系统都可以与之协同。IPMI可以实现带外管理,其管理任务不占用业务传输的数据带宽。

IPMI规范的核心是专用的BMC(Baseboard Management Controller,主板管理控制器)芯片。BMC芯片独立于服务器的处理器、固件和操作系统,通常配置于服务器主板上的独立板卡内,或集成在服务器主板之上。BMC芯片上运行的软件系统可以看作是一个独立于服务器系统的小型操作系统,可以与BIOS和操作系统下的系统管理软件交互,协同完成系统管理任务。BMC规范描述了内置到主板上的管理功能,如本地和远程诊断、控制台操作支持、配置管理、硬件管理和故障排除等。

使用IPMI规范中定义的指令可以向BMC发送命令,完成相应的IPMI功能。BMC通过主板上的不同传感器监视系统状态,并在系统事件日志中记录事件消息,维护传感器数据记录。BMC提供了各种各样的接口供上层网管查询。系统管理员可以通过Web方式、命令行方式直接查询系统状态,上层管理软件也可以通过SNMP(Simple Network Management Protocol,简单网络管理协议)、IPMI等接口实现自动查询。当检测到有异常或故障发生时,BMC可以通过SNMPtrap(陷阱)消息、SMTP(Simple Mail Transfer Protocol,简单邮件传输协议)邮件消息、http json报文等手段主动向上层网管软件的服务端报告,以便运维人员及时识别并处理故障。





1.2 服务器处理器


1.2.1 高性能处理器的并行组织结构


日益复杂的大数据、云计算与人工智能应用领域要求现代处理器不断地为软件提供更为强大的计算能力。但由于物理规律对半导体器件的限制,传统单处理器通过提高主频提升性能的方法受到制约,不可能再沿着摩尔定律预测的轨迹持续提升。随着晶体管越来越小,芯片内部互连线的延迟造成的影响越来越大,无法满足不断提高的主频对数据交换速度提高的要求。高频率导致的过高功耗不仅使能源消耗剧增,而且无法良好散热会对系统稳定性造成恶劣影响。主存访问速度的增长也难以跟上处理器主频的增长速度,计算、存储和输入/输出的速度越来越难以匹配。

因此,计算机系统硬件设计者不得不放弃简单地提高处理器主频的传统方法,转向尽可能多地实现并行处理。计算机系统可以在不同的层次引入并行机制。





1. 指令流水线


从执行程序的角度看,并行性等级从低到高可分为多个层次:一条指令执行时各微操作之间的并行,这是指令内部的并行;并行执行两条或多条指令,也即指令级并行(Instruction-Level Parallelism,ILP);并行执行两个或两个以上的任务(程序段)属于任务级并行;最高层次的作业或程序级并行则是指并行执行两个或两个以上的作业或程序。并行处理着重挖掘计算过程中的并行事件,使并行性达到较高的级别。因此,并行处理是体系结构、硬件、软件、算法、编程语言等多方面综合的领域。

就单个处理器而言,在性能提升过程中起着主导作用的是时间并行技术,也即指令流水线。指令流水线将指令执行的完整过程按功能分割为若干相互联系的子任务,将每一个子任务指定给一个专门的部件完成;然后按时间重叠原理把各部分执行过程在时间上重叠起来,使所有部件依次分工完成一组同样的工作。例如,某个处理器将指令执行的5个子过程分配给5个专用部件,即取指令部件(IF)、指令译码部件(ID)、指令执行部件(EX)、访问存储器部件(M)、结果写回部件(WB)。将各个部件按流水方式连接起来,就满足时间重叠原理,从而使得处理器内部能同时处理多条指令,提高了处理器的速度。时间并行技术实现了计算机系统中的指令级并行。

当前常见的高性能处理器,无论是CISC架构还是RISC架构,无一不采用指令流水线,流水级数从几级到三十多级不等。

在计算机系统的最底层,流水技术将时间并行性引入处理器,而多发射处理器则把空间并行性引入处理器。超标量(Superscalar)设计采用多发射技术,在处理器内部设置多条并行执行的指令流水线,通过在每个时钟周期内向执行单元发射多条指令实现指令级并行。





2. 多处理器系统和多计算机系统


在单个处理器性能一定的情况下,进一步提高计算机系统处理能力的简单方法就是让多个处理器协同工作,共同完成任务。广义而言,使用多台计算机协同工作来完成所要求任务的计算机系统称为多处理器(Multi-processor)系统。具体而言,多处理器系统由多个独立的处理器组成,每个处理器都能够独立执行自己的程序和指令流,相互之间通过专门的网络连接,实现数据的交换和通信,共同完成某项大的计算或处理任务。多处理器系统中的各个处理器由操作系统管理,实现作业级或任务级并行。

与广义多处理器系统不同,狭义多处理器系统仅指在同一计算机内处理器之间通过共享存储器(Shared Memory)方式通信的并行计算机系统。运行在狭义多处理器上的所有进程能够共享映射到公共内存的单一虚拟地址空间。任何进程都能通过执行加载(Load)或存储(Store)指令来读写一个内存字。

与狭义多处理器相对应,由不共享公共内存的多个处理器系统构成的并行系统又称为多计算机(Multi-Computers)系统。每个系统都有自己的私有内存,通过消息传递的方式进行互相通信。

多计算机系统有各种不同的形态和规模。集群(Cluster,也称机群)系统就是一种常见的多计算机系统。集群系统是由一组完整的计算机通过高性能的网络或局域网互连而成的系统,这组计算机作为统一的计算机资源一起工作,并能产生一台机器的印象。术语“完整计算机”意指一台计算机离开集群系统仍能运行自己的任务。集群系统中的每台计算机一般称为节点。

多处理器系统也遵循时间重叠、资源重复、资源共享原理,向不同体系结构的多处理器方向发展。但在采取的技术措施上与单处理器系统有些差别。

为了反映多处理器系统各机器之间物理连接的紧密程度与交互作用能力的强弱,通常使用耦合度这一术语。多处理器系统可以根据耦合度分为紧耦合系统和松耦合系统两大类。紧耦合系统又称为直接耦合系统,指处理器之间物理连接的频带较高,一般通过总线或高速开关实现互连,可以共享主存。由于具有较高的信息传输率,因而可以快速并行处理作业或任务。松耦合系统又称为间接耦合系统,一般是通过通道或通信线路实现处理器之间的互连,可以共享外存设备(磁盘、磁带等),机器之间的相互作用是在文件或数据集一级上进行的。松耦合系统表现为两种形式:一种是多台计算机和共享的外存设备连接,不同机器之间实现功能上的分工,机器处理的结果以文件或数据集的形式送到共享外存设备,供其他机器继续处理;另一种是计算机网,机器通过通信线路连接,以求得更大范围的资源共享。





3. 多线程处理器


除了用多台计算机完成任务级并行之外,处理器厂商还设计了许多处理器片内并行技术,以应对通过简单提高处理器主频的方法提升单处理器的性能的传统方法受到的制约。除了传统的指令级并行技术之外,多线程技术和多核技术也是提高单芯片处理能力的片内并行技术。

由于现代处理器广泛采用指令流水线,因而处理器必须面对一个固有的问题:如果处理器访存时Cache(高速缓冲存储器)缺失(Miss,不命中),则必须访问主存,这会导致执行部件长时间的等待,直到相关的Cache块被加载到Cache中。解决指令流水线必须暂停的一种方法就是片上多线程(On-chip Multi-threading)技术。

在处理器设计中引入硬件多线程(Hardware Multi-threading)的概念,其原理与操作系统中的软件多线程并行技术相似。硬件多线程用来描述一个独立的指令流,而多个指令流能共享同一个支持多线程的处理器。当一个指令流因故暂时不能执行时,可以转向执行另一个线程的指令流。由于各个线程相互独立,从而大大降低了因单线程指令流中各条指令之间的相互依赖导致的指令流水线冲突现象,有效提高处理器执行单元的利用率。因此,并行的概念就从指令级并行扩展至线程级并行(Thread-Level Parallelism)。

多线程处理器通常为每个硬件线程维护独立的程序计数器和数据寄存器。处理器硬件能够快速实现线程间的切换。由于多个相互独立的线程共享执行单元的处理器时间,并且能够进行快速的线程切换,因而多线程处理器能够有效地减少垂直浪费情况,从而利用线程级并行来提高处理器资源的利用率。

为了最大限度地利用处理器资源,同时多线程(Simultaneous Multi-Threading,SMT)技术被引入现代处理器中。同时多线程技术结合了超标量技术和细粒度多线程技术的优点,允许在一个时钟周期内发送来自不同线程的多条指令,因而可以同时减少水平浪费和垂直浪费。

设想一个支持两个线程的同时多线程处理器。在一个时钟周期内,处理器可以执行来自不同线程的多条指令。当其中某个线程由于长延迟操作或资源冲突而没有指令可以执行时,另一个线程甚至能够使用所有的指令发送时间。因此,同时多线程技术既能够利用线程级并行减少垂直浪费,又能够在一个时钟周期内同时利用线程级并行和指令级并行来减少水平浪费,从而大大提高处理器的整体性能。

同时多线程技术是一种简单、低成本的并行技术。与单线程处理器相比,同时多线程处理器只花费很小的代价,而性能得到很大改善。在原有的单线程处理器内部为多个线程提供各自的程序计数器、相关寄存器以及其他运行状态信息,一个“物理”处理器被模拟成多个“逻辑”处理器,以便多个线程同步执行并共享处理器的执行资源。应用程序无须做任何修改就可以使用多个逻辑处理器。

由于多个逻辑处理器共享处理器内核的执行单元、高速缓存和系统总线接口等资源,因而在实现多线程时多个逻辑处理器需要交替工作。如果多个线程同时需要某一个共享资源,则只有一个线程能够使用该资源,其他线程要暂停并等待资源空闲时才能继续执行。因此,同时多线程技术就性能提升而言远不能等同于多个相同时钟频率处理器内核组合而成的多核处理器,但从性价比的角度看,同时多线程技术是一种对单线程处理器执行资源的有效而经济的优化手段。

为了实现同时多线程,处理器需要解决一系列问题。例如,处理器内需要设置大量寄存器保存每个线程的现场信息,需要保证由于并发执行多个线程带来的Cache冲突不会导致显著的性能下降,确保线程切换的开销尽可能小。

在英特尔系列处理器产品中采用的超线程(Hyper Threading,HT)技术就是同时多线程技术的具体实现。英特尔公司的至强处理器等产品就使用了超线程技术。

多线程技术只对传统的单线程超标量处理器结构做了很少改动,但却获得很大的性能提升。启用超线程技术的内核比禁用超线程技术的内核吞吐率要高出30%左右。当然,超线程技术需要解决一系列复杂的技术问题。例如,作业调度策略、取指和发送策略、寄存器回收机制、存储系统层次设计等比单线程处理器复杂许多。





4. 多核处理器(片上多处理器)


在传统的多处理器结构中,分布于不同芯片上的多个处理器通过片外系统总线连接,因此需要占用更大的芯片尺寸,消耗更多的热量,并需要额外的软件支持。多个处理器可以分布于不同的主板上,也可以构建在同一块电路板上,处理器之间通过高速通信接口连接;而多核(Multi-Core)技术则是多处理器结构的升级版本。

多线程技术能够屏蔽线程的存储器访问延迟,增加系统吞吐率,但并未提高单个单线程的执行速度;而多核技术通过开发程序内的线程级或进程级并行性提高性能。多核处理器是指在一颗处理器芯片内集成两个或两个以上完整且并行工作的计算引擎(核),也称为片上多处理器(Chip Multi-Processor,CMP)。核(Core,又称内核或核心)通常是指包含指令部件、算术/逻辑运算部件、寄存器堆和一级或两级Cache的处理单元,这些核通过某种方式互连后,能够相互交换数据,对外呈现为一个统一的多核处理器。

多核技术的兴起一方面是由于单核技术面临继续发展的瓶颈,另一方面也是由于大规模集成电路技术的发展使单芯片容量增长到足够大,能够把原来大规模并行处理器结构中的多处理器和多计算机节点集成到同一芯片内,让各个处理器内核实现片内并行运行。因此,多核处理器是一种特殊的多处理器架构。所有的处理器都在同一块芯片上,不同的核执行不同的线程,在内存的不同部分操作。多核也是一个共享内存的多处理器:所有的核共享同一个内存空间。多个核在一个芯片内直接连接,多线程和多进程可以并行运行。

对于现代服务器处理器而言,多核是必不可少的架构。与传统的单核技术相比,多核技术是应对芯片物理规律限制的相对简单的办法。与早期通过简单提高处理器主频提升计算性能的方式相比,在一个芯片内集成多个相对简单而主频稍低的处理器内核既可以充分利用摩尔定律带来的芯片面积提升,又可以更容易地解决功耗、芯片内部互连延迟和设计复杂度等问题。多核处理器由于在一个芯片内集成多个核心,核间耦合度高,核间互连延迟更小,功耗更低,故可以在任务级、线程级和指令级等多个层次充分提升程序的并行性,灵活度高。

为了满足人类社会对计算性能的无止境需求,处理器内部的核心数量不断增加。当处理器内的核心的数量超过32个时,一般称为众核(Many-Core)处理器。2012年,英特尔公司发布了基于英特尔集成众核(Many Integrated Core,MIC)架构的至强融核(Xeon Phi)产品。而当前各个厂商推出的ARM架构多核服务器处理器的核心数普遍超过32个,都属于众核架构。





5. 同构多核处理器与异构多核处理器


按多核处理器内的计算内核的地位对等与否划分,多核处理器可以分为同构多核处理器和异构多核处理器两种类型。

同构多核(Homogenous Multi-Core)处理器内的所有计算核心结构相同,地位对等。同构多核处理器大多由通用的处理器内核构成,每个处理器内核可以独立地执行任务,其结构与通用单核处理器结构相近。同构多核处理器的各个核心之间可以通过共享总线Cache结构互连,也可以通过交叉开关结构互连和片上网络结构互连。

同构多核结构原理简单,硬件实现复杂度低,因而个人计算机和服务器等通用计算机上的多核处理器通常主要采用同构多核结构。但在实际的应用场景中,并不总是能够把计算任务均匀分配到同构的多个核心上,多核处理器必须面对如何平衡若干处理器的负载并进行任务协调等难题。即使能够不断增加同类型的处理器内核的数量以加强并行处理能力,整个系统的处理性能仍然会受到软件中必须串行执行的代码的制约。

异构多核(Heterogeneous Multi-Core)处理器则通过配置不同特点的核心来优化处理器内部结构,实现处理器性能的最佳化,并能有效地降低系统功耗。异构多核处理器内的各个计算内核结构不同,地位不对等。异构多核处理器根据不同的应用需求配置不同的处理器内核,一般多采用“主处理核+协处理核”的主从架构。采用异构多核处理器方式的好处是可以同时发挥不同类型的处理器各自的优势来满足不同种类的应用的性能和功耗需求。异构多核处理器将结构、功能、功耗、运算性能各不相同的多个核心集成在芯片上,并通过任务分工和划分将不同的任务分配给不同的核心,让每个核心处理自己擅长的任务。

异构多核架构的一个典型实例就是在通用计算机上将通用GPU与通用CPU集成在一颗芯片上构成的异构多核处理器。在这样的架构下,系统中必须串行执行的代码能在一个强大的CPU核上加速,而可以并行的部分则通过很多很小的GPU核来提速。除了通用处理器外,目前的异构多核处理器还可以集成DSP(Digital Signal Processor,数字信号处理器)、FPGA以及媒体处理器、网络处理器、人工智能处理器等多种类型的处理器内核,并针对不同需求配置应用其计算性能。其中,通用处理器内核常作为处理器控制主核,并用于通用计算;而其他处理器内核则作为从核用于加速特定的应用。例如,多核异构网络处理器配有负责管理调度的主核和负责网络处理功能的从核,经常用于科学计算的异构多核处理器在主核之外可以配置用于定点运算和浮点运算等计算功能的专用核心。

研究表明,异构组织方式比同构的多核处理器执行任务更有效率,实现了资源的最佳化配置,而且降低了系统的整体功耗。但异构多核结构也存在着一些难点,如选择哪几种不同的核相互搭配,核间任务如何分工,如何实现良好的可扩展性等,必须在性能、成本、功耗等方面仔细平衡,并通过软硬件相互配合使任务的并行性最大化。





6. 多核处理器的对称性


同构多核和异构多核处理器是对处理器内核硬件结构和地位是否一致的划分。如果再考虑各个核之上的操作系统,从用户的角度看,可以把多核处理器的运行模式划分为对称多处理(Symmetric Multi-Processing,SMP)和非对称多处理(Asymmetric Multi-Processing,AMP)两种不同类型。

多核处理器中的对称多处理结构是指处理器片内包含相同结构的核,多个核紧密耦合并运行一个统一的操作系统。每个核的地位是对等的,共同处理操作系统的所有任务。对称多处理结构由多个同构的处理器内核和共享存储器构成,由一个操作系统的实例同时管理所有处理器内核,并将应用程序分配至各个核上运行。对称多处理结构下的集群中的每个处理器内核地位相同,存储器和共享硬件也都是相同的。而每个处理器内核的角色都是动态确定的,任何应用程序、进程或任务都可以运行在任意处理器内核之上。只要有一个内核空闲可用,操作系统就可以在线程等待队列中分配下一个线程给这个空闲内核来运行。操作系统的调度程序也可以在处理器内核之间迁移任务,以便平衡系统负载。应用程序本身可以不关心有多少个核在运行,由操作系统自动协调运行,并管理共享资源。

同构多核处理器也可以构成非对称多处理结构。若处理器芯片内部是同构多核,但每个核运行一个独立的操作系统或同一操作系统的独立实例,那就变成非对称多核。非对称多处理结构的多核系统也可以采用异构多核和共享存储器构成。





1.2.2 英特尔处理器体系结构


当前,在通用处理器领域广泛使用的最普遍的一种处理器就是兼容英特尔公司x86指令集的IA-32(Intel Architecture 32,英特尔32位体系结构)及其后继64位兼容版本的处理器。无论是在个人计算机市场还是在服务器市场,由英特尔公司和AMD公司等少数处理器厂商生产的x86/x86-64(x64)处理器产品都有广泛的应用。





1. IA-32处理器及其发展


IA-32处理器最早应用于桌面个人计算机。几十年来,基于英特尔公司IA-32处理器的通用计算机系统一直是最常见的、应用最广的计算机系统之一。英特尔公司1978年推出16位的Intel8086和准16位的Intel8088微处理器,这是个人计算机发展历史上的一个重要事件。当时的处理器芯片含有上万只晶体管,处理器每次只执行一条指令,并没有采用流水技术。而1985年推出的Intel386处理器则是IA-32处理器家族中的第一款32位微处理器。此时处理器芯片上的晶体管数已增加到数十万只,流水技术被引入微处理器中。1995年英特尔公司发布了专门针对服务器和工作站应用领域的32位高能奔腾(Pentium Pro)处理器,可以应用在高速计算机辅助设计和科学计算等领域,英特尔架构开始成为服务器处理器的选项之一。

由于所有的基于IA-32的微处理器都需要保持与x86指令系统的兼容,因而从整体上看,IA-32仍是基于CISC架构的处理器。但RISC处理器的性能优势非常明显,因而从1993年推出奔腾(Pentium)处理器开始,RISC处理器的设计思想逐渐被引入新的IA-32中。奔腾处理器开始采用超标量流水技术,允许两条指令同时执行。从高能奔腾处理器开始,英特尔甚至将处理器体系结构设计成CISC外壳加RISC内核的结构,CISC指令在执行时被翻译成一条或多条RISC指令执行,从而有效提高了系统性能。

计算机的应用领域越来越广,而对处理器计算能力的需求仍在不断提高,在服务器等高性能计算机市场上尤其如此。随着电子技术的飞速发展和处理器体系结构的演变,处理器字长也在不断增加。从20世纪70年代末到90年代中期,16位计算大行其道;1995年以后的十年则是从16位计算到32位计算的过渡阶段;而当前的通用处理器无论是在个人计算机市场还是高性能工作站和服务器市场上,64位计算的应用都是主流。

为了进一步提升处理器的总体性能,越来越多的处理器通过提高并行性来加快指令的执行速度。传统的IA-32微处理器架构存在一些基本的性能限制,而64位计算不仅仅是扩展运算器字长,更主要的是体系结构的改进和提高。

直观地看,64位字长至少可以带来两点好处:一是参加整数运算的操作数的范围扩大了,二是计算机系统的寻址空间大大扩展。16位的Intel8086处理器最多只能访问1兆字节的物理内存空间,32位的80386处理器则支持4吉字节的物理内存。而64位系统以太字节计算的内存寻址空间容量使其在未来很长一段时间内都能够满足高速互联网和多媒体等高端应用环境对内存寻址的需求。

伴随着处理器字长增长的不仅仅是内存寻址空间,而是包括计算性能、体系结构和应用模式在内的完整改变。





2. 安腾架构与Intel 64架构


早在1994年,英特尔公司和惠普(HP)公司即开始合作,为服务器和工作站市场共同开发全新的基于64位处理器体系结构IA-64(Intel Architecture 64)的处理器。这一体系结构吸取了英特尔数十年x86处理器设计的经验,又结合了惠普在64位PA-RISC处理器上积累的技术成果。2001年5月,基于显式并行指令计算(EPIC)技术的第一代处理器上市,标志着IA-64体系结构进入实用化阶段。此后的几年时间里,IA-64体系结构的处理器不断推陈出新,性能不断提高,英特尔将这些处理器统称为安腾处理器家族(Itanium Processor Family,IPF)。

2005年9月,英特尔联合惠普、富士通、日立、NEC、SGI、SAP、微软与优利公司在内的业界领导厂商成立了一个推动安腾发展的全球性组织———安腾解决方案联盟(Itanium Solutions Alliance,ISA),以图加速安腾处理器在64位服务器计算平台上的推广。

基于EPIC技术的IA-64以实现持续高性能为设计目标。为此,英特尔并不是简单地把x86架构由32位扩展到64位,而是设计了全新的架构,甚至在IA-64中放弃了与IA-32指令系统的兼容性。IA-64处理器结合了RISC处理器和VLIW技术的优势,显著提高了微处理器的性能。

但是,市场上数十年积累下来的基于IA-32指令系统的x86体系结构的计算机系统仍然在运行,众多的用户和应用软件无法直接从IA-32平滑过渡到不兼容的IA-64。新的体系结构是否保留对旧体系结构的兼容性,这对处理器制造商、众多的计算机用户和软硬件外围厂商而言都是一个两难的选择:继续保持兼容性意味着新的处理器必须背负一个沉重的包袱,将严重制约处理器性能的提高;但放弃兼容性会让新产品与旧有的体系结构完全决裂,厂商和用户原有的投资无法得到保护。

面对市场的压力,英特尔也曾左右摇摆。由于IA-32的广泛应用,众多基于x86指令集的软件仍然需要继续使用,而新设计的指令系统无法直接兼容低效率的IA-32指令系统。为了让IA-64处理器能够支持两种体系结构的软件,英特尔在IA-64架构中引入了32位兼容模式,在执行32位代码时通过x86-to-IA-64解码器把IA-32的二进制代码翻译为IA-64指令,以便在IA-64处理器上仿真运行。但这个解码器的效率并不高,因此安腾处理器在运行x86应用程序时的性能非常糟糕。2004年,英特尔推出了名为IA-32 EL(IA-32 Execution Layer,IA-32执行层)的仿真软件,用于在IA-64架构的计算机上执行IA-32应用程序,而新的安腾处理器中将不再包含支持x86的硬件电路。

英特尔将安腾处理器定位在高端服务器市场,期望缺少对现有的x86体系结构的直接支持也不会对安腾处理器造成非常大的影响。但是,中低端的个人和中小企业市场则必须保持与x86体系结构的直接兼容。为此,英特尔将原有的IA-32扩展至64位,称为EM64T(64位内存扩展技术)或IA-32e,并保持与IA-32的完全兼容。

2006年,英特尔将EM64T更名为Intel64(英特尔64)。而IA-64则被称为安腾体系结构。因此,英特尔公司目前支持两种不同的64位处理器体系结构:英特尔64体系结构和安腾体系结构。

在英特尔公司当时的处理器路线图中,这两种64位的体系结构曾经各有其侧重的应用领域:安腾体系结构用于数据密集的商业应用,以保证性能、可用性、可伸缩性和安全性为首要目标,主要市场为大型多处理器服务器平台;而英特尔64体系结构则适用于中小型企业主流应用基础架构和多服务器分布式计算环境,能够保持与32位应用的兼容性,并支持从32位到64位计算的平滑过渡。

从英特尔最早将其安腾体系结构命名为IA-64可以看出,英特尔当初是期望安腾作为IA-32架构的后继者承担64位计算大任的。安腾处理器集成了支持并行计算的诸多先进特性,引入了EPIC技术、VLIW技术、分支推断(Predication)技术、推测(Speculation)技术、软件流水技术和寄存器堆栈技术等,并且完全放弃了既有的CISC架构而转向RISC架构。应当说,安腾架构在技术上是有不少创新的,但是也存在过度依赖编译器、技术复杂度过高以及处理器与其他部件不匹配等问题,导致其性能并没有预期的高。而最重要的是,安腾处理器既无法利用原有的IA-32生态环境,也无法吸引众多软硬件厂商转向该架构而构建新的生态环境。

2017年,英特尔发布了最后一代安腾处理器:安腾9700系列处理器。2019年1月,安腾系列处理器开始进入寿命终结(End-Of-Life,EOL)周期,并将于2021年7月终止出货。在经过二十年的市场打磨之后,安腾体系结构即将终结,基于EPIC架构的服务器处理器也将完成其历史使命,英特尔公司的处理器架构将回归统一,也即通常所说的x86/IA-32/x86-64/Intel 64兼容架构。





3. 英特尔至强系列服务器处理器


为了明确区分服务器处理器市场和个人计算机处理器市场,英特尔又引入了专门针对服务器市场的子品牌至强(Xeon)。1998年英特尔发布其全新研制的服务器处理器时,使用奔腾Ⅱ至强(Pentium Ⅱ Xeon)的命名取代之前所使用的高能奔腾品牌。2001年,英特尔发布了独立品牌的至强处理器,其市场定位也更清晰地瞄准支持高性能、均衡负载和多路对称处理等特性的服务器市场。

英特尔至强处理器将性能、能效和计算密度融合,能够提供对虚拟化、云计算、内存计算、大数据分析等计算应用的支持。最新的英特尔至强处理器支持从1~256路的服务器(服务器中“路”是指服务器内的物理CPU数量,也即服务器主板上CPU插槽的数量),处理器频率可动态适应工作负载,并优化了所有操作点的性能功耗比。对于计算受限的工作负载,可将频率增加至额定值以上,而且几乎完全削减了芯片空闲部分的功耗。至强处理器还具备硬件辅助加密、高级启动时间与运行时间保护等硬件增强型管理功能。

当前,英特尔至强服务器处理器家族由至强可扩展(Xeon Scalable)处理器系列和至强D系列、至强W系列组成。英特尔至强D系列处理器用于空间和电源受限的环境中,能够支持从数据中心到智能边缘的广泛应用,并提供工作负载优化的性能。英特尔至强W系列处理器专为专业的创意工作者设计,适用于图形工作站,在保证超凡性能及安全和可靠性的同时,提供专门面向3D渲染、复杂3D CAD工程和人工智能开发的优化支持。英特尔的至强可扩展处理器系列则分为铂金、金牌、银牌、铜牌四个等级,支持不同等级的业务需求,从最高性能和最苛刻的工作环境,到为小企业和基本存储服务提供经济实惠的解决方案。

图1.5显示了英特尔至强可扩展处理器家族4路交叉矩阵配置实例。基于Purley平台的英特尔至强可扩展处理器家族提供最多28个处理器内核,系统配置2666MHz频率的DDR4(第4代双数据率)内存,每个处理器配置6个内存通道。至强处理器还集成了支持互联网广域高速传输的以太网RDMA协议。最新的第二代英特尔至强可扩展处理器家族采用英特尔超级通道互连(Ultra Path Interconnect,UPI)技术实现处理器内核可扩展系统的一致性互连,可在统一共享地址空间内集成多个处理器。

图1.5 英特尔至强可扩展处理器家族4路交叉矩阵配置





1.2.3 ARM处理器体系结构


1. ARM公司的历史与发展


众所周知,ARM体系结构在移动计算领域占有统治地位,并被广泛应用于从嵌入式控制系统、消费类电子产品到智能终端在内的众多应用场景。ARM这三个字母首先是指先进RISC机器有限公司(Advanced RISC Machines Limited),同时也代表ARM公司设计的ARM体系结构及ARM处理器产品。

ARM公司是在1990年由英国剑桥的Acorn公司、苹果公司和处理器制造商超大规模集成电路(Very Large Scale Integration Circuit,VLSI)公司合资成立的一家独立的处理器公司,但ARM的第一款产品在ARM公司正式独立之前就已经成型。自1985年4月全球第一款商业RISC处理器ARM1的原型在英国剑桥的Acorn公司诞生以来,ARM公司提供了一系列ARM处理器内核、ARM体系结构扩展以及ARM微处理器和片上系统设计方案,也提供基于ARM架构的开发设计技术。

20世纪90年代,ARM快速进入世界市场。ARM公司设计的处理器完美地将低功耗、低成本和高性能相结合,因而在嵌入式处理器应用领域逐渐进入公众视野,并在嵌入式控制、消费与教育类多媒体、DSP和移动应用领域发展壮大,最终成为市场主流。

由于早期缺乏足够的资金支持,ARM公司不得不采用IP(Intellectual Property,知识产权)授权这种商业模式,以避开芯片生产线的高昂成本。但这种独特的商业模式却意外使ARM公司和世界上众多的半导体厂商构成了合作关系,也助力ARM体系结构具备特有的低成本和充足的供货渠道这些优势。特别是ARM公司能把其特有的低功耗技术应用于RISC处理器,让ARM架构兼具了出色的高性能和低功耗特性。这最终使ARM公司和ARM架构在移动计算爆发式增长的年代逐渐占据了市场主导地位,最终成就其辉煌。

ARM公司设计的产品包括处理器内核IP、处理器物理IP、系统级IP、无线IP、ARM安全解决方案、ARM Mali图形和多媒体IP、物联网解决方案及软件开发工具等。





2. ARM体系结构、指令集与ARM处理器


“ARM”除了代表设计处理器的ARM公司外,还代表着与ARM公司相关的ARM体系结构、指令集、处理器内核、处理器和处理器片上系统等不同含义术语。一般而言,这些术语有一定相关性,也有特定的含义。

1) ARM体系结构(Architecture)

ARM公司定义了8种主要的ARM体系结构版本,以版本号v1~v8表示,即ARMv1~ARMv8。处理器体系结构(又称架构)是处理器的功能规范,指示着遵从该规范的硬件如何向其上的软件提供相应的功能。处理器架构定义了“抽象机器”的行为特征。在ARM体系结构中,这一“抽象机器”一般被称为处理单元(Processing Element),或者简称为PE。

ARM架构规范了处理器的指令集(指令系统)、寄存器集、异常模型、内存模型以及调试、跟踪等功能特性。

2) ARM体系结构的指令集(Instruction Set)

一般而言,每种处理器架构都定义了与其相符的指令集,符合相应版本的体系结构规范。而ARM在其体系结构中定义了多种高效的指令集,各种ARM处理器内核可以执行的指令集不一定相同,许多版本的处理器内核还可以在两种甚至更多种不同的指令集之间动态切换。

在ARMv8架构之前的32位ARM体系结构中,ARM定义了三种指令集:ARM指令集、Thumb指令集和Thumb-2指令集。

标准的ARM指令集的指令长度固定为32位,每条指令相对于16位长度的指令承载更多的信息,因此可以使用最少的指令完成相应的功能。相对于另外两种指令集,ARM指令集在同等条件下指令的执行速度也最快,但代价是每条指令占用较多的存储空间,程序所需总存储空间较大。

Thumb指令集是在ARMv4T架构之后增加的一种16位长度的指令集。在Thumb模式下,指令字编码更短,指令的功能也更简单,较短的指令字编码提供整体更佳的编码密度。虽然需要使用更多的指令才能完成相应的功能,但使用Thumb指令集只需要占用较少的程序存储空间,能更有效地使用有限的内存带宽,适合于存储系统数据总线宽度为8位或16位的应用系统。

Thumb指令集并不是一个完备的指令集,类似开关中断或异常处理等功能只能在ARM状态下完成。因此使用Thumb指令集的处理器可能需要在ARM指令集和Thumb指令集之间反复切换。为此,ARM公司在推出其ARMv6-T2和ARMv7-M体系结构时定义了Thumb-2指令集。Thumb-2指令集是Thumb指令集的功能扩展版本,兼有ARM指令集和Thumb指令集的优势。

Thumb-2指令集是16位和32位混合指令集,在Thumb指令集的基础上增加了一些新的16位Thumb指令以改进程序的执行流程,又增加了一些新的32位指令以实现ARM指令集某些专有的功能,解决了Thumb指令集不能访问协处理器、不能执行特权指令和特殊功能指令的问题。因此,Thumb-2指令集提供的功能几乎与ARM指令集完全相同,不再需要在ARM状态和Thumb状态之间反复切换。Thumb-2指令集可以实现低功耗、高性能的最优设计,从而更好地平衡代码性能和系统成本。

此外,32位版本的ARM架构还有一种被称为ThumbEE(Thumb Execution Environment,Thumb运行环境)或Thumb-2EE的技术,在ARMv7-A和ARMv7-R体系结构中定义。ThumbEE是专为一些诸如Java、C#、Perl和Python的语言所做的优化,能让实时编译器输出更小的编译码却不会影响其性能。ThumbEE技术支持的指令在Thumb的基础上有少量增加和修改,因而被称为ThumbEE指令集。

ARMv8架构发布以后,ARM引入了新的64位指令集,并重新命名了原有的指令集。在64位ARM体系结构执行状态下支持A64指令集,在32位ARM体系结构执行状态下则支持T32和A32指令集。其中,T32指令集就是ARMv8架构之前的32位和16位长度混合的Thumb-2指令集。

3) ARM的微体系结构(Micro-Architecture)

体系结构定义了抽象处理器的外部特征,但是并没有给出处理器如何设计及如何运行的信息。处理器的构造与设计被定义在微体系结构(微架构)中。微架构给出处理器如何工作的描述,一般包括指令流水线(Pipeline)的组织与级数、Cache的大小与数量、每条指令的执行周期数,以及架构中可选功能的实现等。

举例而言,ARM Cortex-A53和华为海思自研的TaiShanV110处理器内核都实现了ARMv8-A体系结构,这意味着兼容ARMv8-A体系结构的软件不需要做任何修改就能够在这两个处理器内核上运行。但这二者的微体系结构却有很大差别,因为二者的设计目标和应用场景完全不同。

4) ARM处理器内核(Processor Core)

ARM处理器内核特指实现某种版本ARM指令体系结构并具有取指令和执行指令功能的组件,即一般所说的“运算器+控制器”构成的CPU。例如ARM7TDMI、ARM9TDMI、ARM9E-S等。

5) ARM处理器(Processor)

ARM处理器是以ARM处理器内核为中心,再集成存储管理单元(Memory Management Unit,MMU)、中断控制器、浮点运算器、总线接口等组件构成的处理单元,例如ARM710T、ARM720T、ARM920T等。

由于单纯的处理器内核可以作为处理器使用,因而“处理器内核”和“处理器”这两个术语也经常被混合使用。

6)基于ARM架构处理器的片上系统(SoC)

作为ARM处理器生态王国的核心,ARM公司采用授权方式建立与各个生态厂商的纽带。ARM公司有多种授权方式。例如,按被授权对象的不同,可以采用面向教育、科研机构的学术授权和用于内部研究的设计入门(DesignStart)授权,还有适合大企业的订购授权和多用途授权等方式。2020年升级的ARM起始灵活接入计划(ARM Flexible Access for Startups)甚至允许拥有不超过500万美元资金的芯片初创公司免费访问各种ARMIP,并可以在整个产品开发周期内使用各种ARM解决方案进行验证和原型设计。

ARM公司是处理器体系结构和处理器的设计者,按使用这些ARM知识产权的不同方式,可以把授权方式分为多种。最简单地使用ARM处理器的方式是直接从ARM公司采购ARM已经设计好的完整处理器设计方案,获得ARM知识产权的使用权授权。在这种方式中,被授权人基本上没有多少可以自由发挥的空间。

而众多半导体公司本身就具备很强的设计能力,并且在各自擅长的领域有所积累,可以购买ARM公司设计好的处理器IP核,必要时对Cache和输入/输出控制部件等进行修改,再增加自身的外围部件,构成完整的“基于ARM处理器的片上系统(System on Chip,SoC)”。这种授权方式通常被称为内核授权,是ARM公司提供的最广泛的授权方式。高通、三星、华为、德州仪器(TI)、恩智浦(NXP)、富士通等公司都取得过这种授权。华为海思公司在鲲鹏920处理器推出之前的鲲鹏916等通用处理器产品即属于“基于ARM处理器的片上系统”。

而那些具备超强实力的公司则可以只采用ARM体系结构定义的指令集,自行设计处理器内核和处理器。相对而言,架构/指令集授权是ARM公司提供的最大限度的授权。被授权方可以在兼容ARM架构和特定ARM指令集的基础上充分展现其自身的创新性,设计出符合其设计目标的处理器,同时可以充分利用ARM的生态环境。这些处理器通常也会集成外围部件,构成“基于ARM架构处理器的片上系统”或者“兼容ARM指令集的处理器片上系统”。有的被授权方甚至可以对ARM架构进行大幅度改造,对ARM指令集进行扩展或缩减,从而得到自己的处理器架构版本。

例如,华为海思设计的鲲鹏920系列处理器即是“兼容ARM指令集的处理器片上系统”,有时简称为“鲲鹏920处理器”或“鲲鹏处理器”。鲲鹏920系列处理器片上系统片内集成了华为自研的兼容ARMv8.2指令集的TaiShanV110处理器内核,组织架构灵活,可以把多个芯片组合成结构更复杂、算力更强的多片系统。本书一般将华为海思设计的鲲鹏920系列处理器称为“鲲鹏920处理器片上系统”,或简称为“鲲鹏920系统”。





3. ARM处理器的分类


ARM处理器家族经历数十年发展,成员众多。按其发展历史与应用场景,ARM公司把ARM处理器家族的产品划分为ARM经典处理器(Classic Processors)、ARM Cortex应用处理器、ARM Cortex嵌入式处理器和ARM专业处理器等不同类别。

1) ARM经典处理器(Classic Processors)

ARM经典处理器是对ARM11及其之前发布的处理器的统称。从ARM7处理器开始,ARM CPU内核被普遍认可和广泛使用,基于ARMv1、ARMv2和ARMv3架构的处理器已经被淘汰。经典ARM处理器中应用较为广泛的是ARM7、ARM9和ARM11系列处理器。

经典ARM处理器提供丰富的功能和卓越的性能,适用于成本敏感型解决方案及希望在新应用中使用经过市场验证技术的产品。经典ARM处理器每年都有数十亿颗的发货量,可以确保设计者获得最广泛的生态系统和资源,最大限度地减少集成过程中出现的问题并缩短上市时间。

2) ARM Cortex应用处理器

ARM处理器的应用越来越广泛,适用场景不断拓展,需要从架构上提出对不同应用场景更有针对性的解决方案。因此,从ARMv7架构开始,ARM处理器的内核架构从单一结构变为面向不同应用场景的结构,此后的处理器大都以ARMCortex处理器命名。

ARM Cortex系列处理器被划分为三大分工明确的子系列:面向复杂操作系统和用户应用的Cortex-A(Applications,应用)系列应用处理器,针对实时处理和控制应用的Cortex-R(Real-time,实时)系列实时嵌入式处理器和针对微控制器与低功耗应用优化的Cortex-M(Microcontroller,微控制器)系列嵌入式微控制器。这三大系列的代表字母A、R和M组合起来就是ARM。

ARM Cortex A系列属于Cortex应用处理器,面向复杂操作系统和用户应用。这类处理器集成了存储管理单元(MMU)以管理复杂操作系统的内存需求,支持虚拟地址,因而能运行Linux、Android/Chrome、Windows CE/embedded等复杂操作系统,并支持复杂图形用户界面。

在ARM的分类体系中,ARM Cortex-A系列应用处理器不属于嵌入式处理器的范畴,其典型的应用场景为高性能智能手机、平板电脑、笔记本电脑、电子书阅读器、个人导航地图终端、数字电视、机顶盒和卫星接收器等移动终端类产品,近年来也被越来越广泛地用作各类台式个人计算机甚至高性能服务器的处理器。

3) ARM Cortex嵌入式处理器

ARM Cortex嵌入式处理器着重于在功耗敏感型应用中提供具有高确定性的实时性。这类处理器通常运行实时操作系统(Real Time Operating System,RTOS)和用户开发的应用程序代码,只需存储保护单元(Memory Protection Unit,MPU),而不需要存储管理单元。ARM Cortex-R系列和Cortex-M系列都属于ARMCortex嵌入式处理器。

ARM Cortex-R系列处理器面向深层嵌入式实时应用,追求低功耗、卓越性能及与现有平台高兼容性这三个特性之间的平衡。

Cortex-M系列处理器用于成本敏感型解决方案。这类处理器主要针对微控制器(单片机)领域,其应用场景通常既需要进行快速且具有高确定性的中断处理,又需超小尺寸和低功耗。

4) ARM专业处理器

ARM专业处理器是不属于上述A、R和M三个类别的旨在满足特定市场需求的处理器。这类处理器主要包括两类:

(1)面向高安全性应用的SecurCore处理器。这类处理器在安全市场中用于手机SIM(Subscriber Identity Module,用户身份识别模块)卡和证件应用,集成了多种既可为用户提供卓越性能,又能检测和避免安全攻击的技术。具体的应用场景涉及SIM卡、智能卡、高级支付系统、电子护照、电子票务和运输系统等。

(2)面向FPGA的FPGA处理器。这类处理器是专门为适应与FPGA协同配合实现异构计算而优化的,在保持与传统ARM设备兼容的同时,向开发人员提供系统可编程性,使产品能快速上市。FPGA处理器适合应用在灵活的硬件加速与可配置应用需求的场景,赛灵思和英特尔等主流的可编程逻辑器件厂商都有基于ARM硬核的FPGA器件发售。





4. ARM架构的发展历史


表1.1总结了自1985年第一颗ARM处理器诞生以来ARM公司发布的8个处理器架构的主要特征、ARM自行研制的部分处理器型号以及第三方设计的部分有代表性的基于ARM架构处理器的片上系统或者兼容ARM指令集处理器的片上系统。

表1.1 ARM处理器架构比较



续表





5. ARM服务器处理器的优势


服务器行业的市场容量超过800亿美元。多年以来,英特尔公司借助其与微软公司的Wintel联盟在个人计算机处理器市场上独霸天下,进而依靠其强大的生态环境和超强的处理器性能在服务器处理器市场上逐渐抢占了各个RISC处理器的市场份额,甚至连其与惠普公司联合研制的安腾处理器最终也被自己的Intel64架构打败。而ARM公司多年在移动计算领域不断耕耘,借助ARM/Android(安卓)联盟和其精湛的低功耗技术与开放的生态环境统治移动计算处理器市场,也在嵌入式控制领域大行其道。英特尔和ARM在巩固自身阵地的同时都在尝试占领对方的市场。英特尔杀入移动计算领域的努力应该说没有取得预期效果,而ARM公司于2011年底发布的ARMv8-A架构则是其在保持移动计算领域优势的同时向包括服务器在内的通用计算机处理器市场发起进攻的利器。美国厂商Calxeda在2011年发布的业界第一款基于ARM架构、专门面向服务器应用的处理器EnrgyCore ECX-1000开启了ARM架构服务器处理器的先河。此后的数年间,ARM阵营持续发力,特别是到最近一两年出现了ARM架构服务器的热潮,众多半导体厂商和服务器厂商先后发布多款产品,向英特尔架构发起了集团冲锋。

分析英特尔架构逐渐进入服务器处理器市场并最终占据垄断地位的原因,首先是英特尔架构处理器被广泛应用带来的规模优势,将英特尔处理器在个人用户市场积累的生态系统优势扩展到服务器领域,与英特尔生产工艺上领先的制程相叠加,逐渐积累了垄断优势。而几乎被英特尔架构打败的早期进入市场的RISC架构虽然性能强大、可靠性高,但是由于架构不统一、用途单一,每种处理器架构通常只有一两家服务器厂商支持,因而处理器应用规模太小,导致其单价居高不下,生态系统又相对封闭,最终难于与英特尔架构竞争,逐渐走入没落。

而ARM公司长期以来专注于设计高性能、廉价、低功耗的RISC处理器及其相关技术与软件,从整体上看,ARM公司基本上具备英特尔公司或相对于传统RISC公司所具有的优势,从长远看也具备与英特尔架构一争高下的潜力。

基于ARM架构的服务器的优势可以总结为以下几点:

(1)更低的综合运营成本。

整体而言,服务器市场除了关注系统配置的灵活性和优化能力、服务器标准化等要素外,还需要重点解决如何在性能、功耗和成本之间找到平衡点的问题。通常提到的一个术语就是TCO,即总体拥有成本(Total Cost of Ownership),意指从购买服务器产品开始,直到停止使用该产品为止,期间的所有与该商品相关的投入成本的总和。服务器的TCO主要包括服务器整个生命周期产生的采购成本、安装配置成本、技术支持运行维护成本和优化应用升级成本等。这其中,除了硬件采购成本、软件采购成本、服务器机房的建设成本(房屋、机架、供电、冷却、空调、机房监控等硬件设施)、运维成本(运维人员成本、软硬件升级成本、电力与网络接入带宽支出、硬件损耗维修维护成本、系统调优与安全加固成本等)这些看得见的支出外,也包括安装服务器的时间成本、软件配置和远程管理的时间成本、发现和解决故障与重新配置成本、升级服务器以适应新需求的时间成本等“看不见”的支出,还包括系统宕机或供电中断等服务被迫中止造成的损失以及技术人员维护与培训成本等隐性支出成本。

基于环保理念,当前的市场主流技术在持续向高效率、低成本、低能耗的绿色计算产业靠拢。而服务器产业正是一个高能耗的领域。大数据、人工智能和云计算等应用爆发式的增长要求配置成百上千台服务器,机房所需的能源供应和冷却需求往往成为大型超级计算中心和数据处理中心建设的难题,也是运维成本居高不下的原因之一。而ARM多年来在移动计算领域积累的低功耗技术可以为基于ARM架构的服务器提供远低于英特尔架构的能源消耗量水准,从而提升服务器配置密度,降低运营成本。据估算,在相同性能的前提下,ARM架构的服务器的功耗要低20%左右,性能/功耗比更优,大量节约运维成本。这尤其对大规模数据中心会有较大的吸引力。

除了ARM多年来的低功耗优势外,处理器芯片的成本也是ARM架构的优势之一。相比英特尔阵营只有英特尔公司和超威半导体公司等少数几家供应商的现状,ARM开放和完善的生态系统吸引了众多厂商支持,可以形成良好的竞争格局,避免一家独大。ARM架构产品更高的出货量也使其有能力保持更低的价格。因此,ARM架构的处理器芯片在成本、集成度方面同样有较大的优势。当年,英特尔架构依靠规模效应带来的低廉价格最终打败了传统RISC架构的服务器处理器,而如今的ARM架构处理器也具备了这种优势。

遍布全球的服务器的保有量以百万计,即使其采购和运维成本降低一点点,每年节省的开支数量也是个天文数字。

(2)端-边-云全场景同构互联与协同。

近年来,传统PC(个人计算机)的保有量在持续下降,并向移动智能终端大量转移。以5G、人工智能和物联网为代表的新兴技术正在推动人类社会的智能化进程。以虚拟现实、自动驾驶等技术为代表的智能化应用的兴起和物联网应用的持续普及助推世界迈入万物互联的时代,2018年全球云数据中心连接设备数超过230亿。未来,将有超过70%的数据和应用在边缘产生和处理。而边缘和移动终端受限的处理能力又反过来提出了端-边-云互联与协同的需求。幸运的是,正在进行中的5G网络大规模部署给端-边-云协同提供了理想的基础互联架构支撑。技术的演进需要适宜的环境与恰当的时机,虽然从2011年开始直到几年之前的这段时间内,ARM架构向服务器市场的冲锋并没有取得预期的效果,但5G的大规模商用令ARM架构迎来了转机。

当前在用的绝大多数移动终端都采用ARM架构的处理器,移动应用主要基于ARM指令集开发、测试和运行。ARM架构在边缘计算设备中同样占据着重要地位,而云端开发环境则以英特尔架构为主。因此,端-边-云三个层次的主流计算架构和开发模式之间存在着较大的差异,端-边-云全场景协同应用必须在异构环境下经过多次开发和部署,除了重复开发增加的直接成本外,还可能造成性能损失和潜在安全漏洞等风险。随着海量的移动应用向云上扩展和迁移,端-边-云协同将成为主流,需要在不同架构之间进行整合,相互影响渗透。ARM架构在移动应用场景中的主流地位在短期内几乎是不可能改变的,在云端传统的单一英特尔架构很难满足多样化的计算场景需求。

以近年来主流的手机游戏应用为例,游戏开发商如果在非ARM架构上运行支持ARM架构移动终端的应用,需要在服务器上运行ARM虚拟机来解决兼容性问题,不仅开发和维护工作量增加,而且服务器可以支持的有效工作负载只有30%,导致服务器成本和维护费用大大增加。

因此,在云端实现从单一架构向多种计算架构组合的演进是提升计算效率的最优解决路径,在这一点上ARM架构具有优势。ARM架构支持16位、32位和64位多种指令集,能很好地兼容从物联网边缘计算、终端应用到云端服务的各类应用场景。ARM在生态系统上的优势也正在逐渐向云端延伸。

(3)更高的并发处理效率。

按照以往人们的常规认知,英特尔架构在性能方面优势明显,而ARM架构在功耗方面遥遥领先。但是,基于RISC技术的轻量化的ARM架构也比英特尔架构更高效,同样功能和性能占用的芯片面积更小、功耗更低,集成度也更高。随着数据中心规模的不断扩展,用户的关注点已经从单纯关注处理器单线程性能转变到同时强调单线程性能和并行处理能力,以应对传统业务模式向高并发业务模式的转移。

近年来,ARM公司靠着灵活的互联架构和更高的并发处理能力在一个处理器中集成数十乃至数百个处理器内核,具备更好的并发性能。随着ARM架构的半导体厂商的工艺技术的成熟,ARM处理器在制程上的短板也在不断改善,其性能完全可以达到甚至超越英特尔架构。华为海思发布的ARM架构鲲鹏920处理器片上系统通过技术创新已经令其性能超越了业界主流通用处理器25%以上。

在大量的分布式数据库、大数据、电子商务和人工智能等需要高并发的应用场景中,集成更多处理器内核的ARM服务器处理器比传统英特尔架构的处理器拥有更高的并发处理效率,可以以较低的成本和更高的效率处理大量的分布式计算工作负载。

(4)开放的生态系统与多元化的市场供应。

英特尔架构长时间在服务器市场占据垄断地位,服务器产品价格高昂。过度的垄断不利于市场竞争,也难以促进技术创新。而ARM的开放生态系统及以合作为主轴的商业模式吸引众多厂商进入ARM架构服务器领域,处理器厂商和服务器厂商可以借助ARM的开放授权方式进入利润丰厚的市场,众多厂商之间的竞争促进了创新,加快了技术进步的脚步。ARM生态系统中没有一家独大的企业,众多的用户也期望通过多元化的市场供应获取更多的选择自由和差异化的服务,而不是绑在仅有一两家供货商支持的架构上。针对安全可靠性和保密要求高的政府部门和军工生产等特殊用户,实现关键芯片产品的自主可控势在必行,ARM的架构授权模式和独立于英特尔的技术架构有利于处理器厂商在充分利用ARM生态环境的前提下构造具有自主知识产权的产品,在当前复杂多变的国际大环境下确保供应安全与信息安全。

因此,支持多种计算架构并存的组合不仅是技术路线的选择,也是市场的最佳选择。

当然,要想在英特尔架构占据90%份额的市场上抢占一席之地并非易事,ARM架构仍然面临巨大的挑战。但是凭借更高的功耗效率、更高的核心密度、更低的成本、更开放的架构和一体化的生态系统,ARM架构有望在运算密集的服务器市场上成为特定应用领域的合理选择。





6. ARM服务器处理器的兴起


近两年来,众多的国际知名半导体厂商和国内新兴的芯片厂商转战到ARM市场,密集推出ARM架构的服务器产品。这反映出业界对ARM架构持续看好,ARM生态向服务器市场的扩展步伐也在大幅度加快,ARM服务器市场呈现一片繁荣景象。虽然有些厂商基于各种原因退出,更多的产品却在加入进来。除了华为公司的鲲鹏920系列ARM处理器外,亚马逊、Marvell、富士通、Nvidia等厂商都在发力进入ARM架构的服务器处理器市场,ARM服务器迎来了第三次浪潮。

1)亚马逊公司的Graviton服务器处理器与EC2(弹性计算云)

2018年11月,电子商务和公有云服务国际巨头亚马逊公司宣布为其云计算IaaS和PaaS平台亚马逊Web服务(Amazon Web Services,AWS)推出了自研的基于ARM架构的云服务器处理器芯片Graviton以及基于该芯片的亚马逊弹性计算云(Amazon Elastic Compute Cloud,Amazon EC2)A1虚拟服务器。Amazon EC2是一种Web服务,可以为云服务提供可调的计算容量,令开发人员能更轻松地进行网络级规模的计算。

亚马逊是第一家发布基于ARM架构的定制服务器的主流云服务提供商。Graviton服务器处理器由以色列芯片开发商Annapurna实验室开发,2015年亚马逊收购了这家企业,开始为AWS开发服务器芯片。

AWS Graviton处理器包括16个Cortex-A72内核,网络带宽高达10Gb/s,主要面向微服务、Web服务器和开发环境等可扩展应用。亚马逊宣称,相比英特尔和AMD公司的处理器,Graviton处理器在运行Web服务器等特定工作负载时能耗可降低45%,从而大幅度降低运营成本。

2) Marvell/Cavium公司的ThunderX系列服务器处理器

2014年,Cavium公司推出了基于ARM架构的48核心服务器处理器芯片ThunderX,成为全球首款英特尔至强E5级别的ARM服务器芯片,也是当时业界唯一能支持双路架构的ARM服务器处理器。

在著名的ARM处理器厂商Marvell以60亿美元的价格收购Cavium公司后,新一代ARM服务器处理器ThunderX2也于2018年7月正式量产。ThunderX2采用16nm工艺打造,芯片集成了32个ARMv8.1乱序执行核心,每个芯片拥有四个线程,也支持高达56条PCIExpress 3.0通道扩展。ThunderX2自2018年推出以来,得到了诸多服务器生态厂商的支持。微软公司为其云计算操作系统Azure部署了基于ThunderX2的Olympus服务器,最终目标是让ARM服务器承担50%的业务负载。隶属于美国能源部的劳伦斯·利弗莫尔(Lawrence Livermore)、桑迪亚(Sandia)和橡树岭(Oak Ridge)等国家实验室及英国莱斯特大学(University of Leicester)等机构都采用了ThunderX2处理器。

2020年5月,Marvell推出了新一代的ARM服务器芯片ThunderX3。ThunderX3处理器采用台积电(TSMC)7nm制程工艺制造,拥有高达96个核,每个核心有4个线程,支持8通道DDR4-3200内存接口和64个PCIExpress 4.0通道。

3) Ampere公司的eMAG/Altra系列服务器处理器

Ampere(安晟培)半导体科技公司(简称Ampere公司)是专注于ARM服务器处理器芯片的初创公司,2017年从原来的AppliedMicro公司业务重组而成。2018年9月,Ampere公司发布了首款基于ARMv8架构的16nm制程AmpereeMAG系列处理器,含32个核心,主频为3.3GHz。据称,Ampere eMAG的价格仅为英特尔至强金牌处理器的一半,而功耗为AMDRYPC的一半。

2020年3月,Ampere发布了其Altra处理器,拥有80个64位ARMv8处理器内核,主频为3.0GHz。该处理器采用单核单线程,以保证最佳性能及安全性。Ampere Altra处理器可为数据分析、人工智能、数据库、数据存储、电信堆栈、边缘计算、Web主机与云原生应用等带来能效提升。

4)飞腾公司FT2000+系列服务器处理器

总部位于天津滨海高新技术产业开发区的天津飞腾信息技术有限公司(简称飞腾公司)是一家快速成长的中国芯片设计企业,其FT2000+系列是飞腾公司自主研发的国产处理器。FT2000+系列的第一代产品于2016年发布,第二代产品于2017年量产并应用于国产高性能计算机。

飞腾公司的服务器处理器旗舰产品FT2000+/64集成了64个飞腾公司自主研发的ARMv8指令集的FTC662处理器内核、8个DDR4内存通道和33路PCIExpress3.0 I/O接口。联想、浪潮、紫光等多家国内顶尖服务器厂商都发布了基于FT2000+处理器的国产高性能服务器产品。阿里云和腾讯云也发布了基于飞腾硬件平台的云计算平台产品。





1.3 服务器技术基础


1.3.1 高性能处理器的存储器组织与片上互连


1. 多核系统的存储结构


为了使处理器的处理能力得到充分发挥,存储系统必须能够提供与处理器性能相匹配的存储器带宽。因此,处理器与主存储器之间的速度差距一直是处理器结构设计中必须考虑的问题。由于处理器内的核心数目增多,并且各核心采用共享存储器结构进行信息交互,对主存的访问需求进一步增加,在单处理器时代面临的存储墙问题依然存在,而且问题更加严重。因此必须针对多核处理器进行相应的存储结构设计,并解决好存储系统的效率问题。

目前存储系统设计仍然采用存储器分级的方式解决存储速度问题,高性能的处理器采用二级甚至三级Cache提高存储系统的等效访问速度,并且处理器片内的Cache容量尽可能增大。但多核系统中的存储系统设计必须平衡系统整体性能、功耗、成本、运行效率等诸多因素。

因此,在多核处理器设计时,必须评估共享Cache和私有Cache孰优孰劣,需要在芯片内设置几级Cache等因素,Cache的大小也是需要考虑的重要问题。

根据多核处理器内的Cache配置情况,可以把多核处理器的存储结构分成以下四种,如图1.6所示。

(1)片内私有L1 Cache结构:如图1.6(a)所示,简单的多核计算机的Cache结构由L1和L2两级组成。处理器片内的多个核各自有自己私有的L1 Cache,一般被划分为L1 I Cache(L1指令Cache)和L1 D Cache(L1数据Cache)。而多核共享的L2 Cache则存在于处理器芯片之外。

(2)片内私有L2 Cache结构:如图1.6(b)所示,处理器片内的多个核仍然保留自己私有的L1 I Cache和L1 D Cache,但L2 Cache被移至处理器片内,且L2 Cache为各个核私有。多核共享处理器芯片之外的主存。

(3)片内共享L2 Cache结构:如图1.6(c)所示的结构与片内私有L2 Cache的多核结构相似,都是片上两级Cache结构。不同之处在于处理器片内的私有L2 Cache变为多核共享L2 Cache。多核仍然共享处理器芯片之外的主存。对处理器的每个核而言,片内私有L2 Cache的访问速度更高。在处理器片内使用共享的L2 Cache取代各个核私有的L2 Cache能够获得系统整体性能的提升。

(4)片内共享L3 Cache结构:随着处理器芯片上的可用存储资源的增长,高性能的处理器甚至把L3 Cache也从处理器片外移至片内。在片内私有L2 Cache结构的基础上增加片内多核共享L3 Cache使存储系统的性能有了较大提高。图1.6(d)给出了这种结构的示意图。

图1.6 多核处理器的存储结构





2. 多核处理器的Cache一致性


在多核系统设计时必须考虑多级Cache的一致性(Cache Coherency)问题。

对内存的基本操作包括读操作和写操作。Cache一致性问题产生的原因是:在一个处理器系统中,不同的Cache和主存空间中可能存放着同一个数据的多个副本,在写操作时,这些副本存在着潜在的不一致的可能性。

在单处理器系统中,Cache一致性问题主要表现为在内存写操作过程中如何保持各级Cache中的数据副本和主存内容的一致,即使有输入/输出通道共享Cache,也可以通过全写法较好地解决Cache一致性问题。

而在多核系统中,多个核都能够对内存进行写操作,而Cache级数更多,同一数据的多个副本可能同时存放在多个Cache存储器中,某个核的私有Cache又只能被该核自身访问。即使采用全写法,也只能维持一个Cache和主存之间的一致性,不能自动更新其他处理器内核的私有Cache中的相同副本。这些因素无疑加大了Cache一致性问题的复杂度,同时又影响着多核系统的存储系统整体设计。

维护Cache一致性的关键在于跟踪每一个Cache块的状态,并根据处理器的读写操作及总线上的相应事件及时更新Cache块的状态。

一般来说,导致多核处理器系统中Cache内容不一致的原因如下:

(1)可写数据的共享:某个处理器采用全写法或写回法修改某一个数据块时,会引起其他处理器的Cache中同一副本的不一致。

(2)输入/输出活动:如果输入/输出设备直接连接在系统总线上,输入/输出活动也会导致Cache不一致。

(3)核间线程迁移:核间线程迁移就是把一个尚未执行完的线程调度到另一个空闲的处理器内核中去执行。为提高整个系统的效率,有的系统允许线程核间迁移,使系统负载平衡。但这有可能引起Cache的不一致。

对于输入/输出活动和核间线程迁移而导致的Cache不一致,可以分别通过禁止输入/输出通道与处理器共享Cache以及禁止核间线程迁移简单解决。因而多处理器中的Cache一致性问题主要是针对可写数据的共享。

在多核系统中,Cache一致性可以使用软件或者硬件维护。

软件方法采取的手段是“预防”。在使用软件方式维护Cache一致性时,处理器需要提供专门的显式Cache操作指令,如Cache块拷贝、Cache回收和使Cache失效等指令,让程序员或编译器分析源程序的逻辑结构和数据相关性,判断可能出现的Cache一致性问题,利用这些指令维护Cache一致性。软件维护Cache一致性的优点是硬件开销小,缺点是在多数情况下对系统性能有较大影响,而且需要程序员的介入。

由于引入Cache的主要目的是提升存储器的等效访问速度,故多数情况下Cache一致性由硬件维护。硬件方法采取的手段是“通过硬件发现和解决所发生的Cache一致性问题”。不同的处理器系统使用不同的Cache一致性协议维护Cache一致性。Cache一致性协议维护一个有限状态机,并根据存储器读写指令或者总线上的操作进行状态转移并完成相应Cache块的操作,以维护Cache一致性。

目前,大多数多核处理器采用总线侦听(Bus Snooping)协议,也有系统采用目录(Directory)协议解决多级Cache的一致性问题。目录协议在全局的角度统一监管不同Cache的状态;而在总线侦听方式中,每个Cache分别管理自身Cache块的状态,并通过广播操作实现不同Cache间的状态同步。





3. UMA架构与NUMA架构


可以根据处理器对内存储器的访问方式将共享存储器方式的计算机系统分为两大类,即UMA(Uniform Memory Access,统一内存访问)架构和NUMA(Non UniformMemory Access,非统一内存访问)架构。

UMA是对称多处理器计算机采用的存储器架构,因此对称多处理器系统有时也被称为UMA架构系统。如图1.7所示,在对称多处理器架构下,系统中的每个处理器内核地位相同,其看到的存储器和共享硬件也都是相同的。在UMA架构的多处理器系统中,所有的处理器都访问一个统一的存储器空间,这些存储器往往以多通道的方式组织。在UMA架构下,所有的内存访问都被传递到相同的共享内存总线上,不同的处理器访问存储器的延迟时间相同,任何一个进程或线程都可以被分配到任何一个处理器上运行。每个处理器还可以配备私有的Cache,外围设备也可以通过某种形式共享。因而UMA架构可以在操作系统的支持下达到非常好的负载均衡效果,让整个系统的性能、吞吐量有较大提升。

图1.7 对称多处理器的UMA组织示意图



但从存储器访问的角度看,对称多处理器架构的缺点是可伸缩性较差。这是因为多个核使用相同的总线访问内存,随着处理器内核数的增加,总线将成为系统性能提升的瓶颈。因而UMA架构只适用于处理器内核数量相对较少的情况,不适用于系统中配置数十个甚至数百个处理器内核的情况。

而NUMA架构则属于分布式共享存储(Distributed Shared Memory,DSM)架构,存储器分布在不同节点上。NUMA架构通过限制任何一条内存总线上的处理器内核数量并依靠高速互连通道连接各个节点,从而缓解了各个处理器内核竞争共享内存总线造成的访问瓶颈的影响。

在NUMA架构中,每个处理器与本地存储器单元(Local Memory Unit)距离更短,而与远程存储器(Remote Memory,其他处理器所属的本地存储器)距离更长。因此,处理器访问本地存储器的存储器延迟(Memory Latency)比访问远程存储器更短,即NUMA架构的系统中存储器访问周期是不固定的,取决于被访问存储器的物理位置。

从图1.8所示的NUMA架构中可以看到,不同NUMA域内的处理器内核访问同一个物理位置的存储器的延迟时间不同。系统内的存储器访问延时从高到低依次为:跨CPU访存、不跨CPU但跨NUMA域访存、NUMA域内访存。因此,在应用程序运行时应尽可能避免跨NUMA域访问存储器,这可以通过设置线程的CPU亲和性(Affinity)来实现。

图1.8 NUMA架构示意图



NUMA架构既可以保持对称多处理器架构的单一操作系统、简便的应用程序编程模式及易于管理的特点,又可以有效地扩充系统的规模。NUMA架构能够为处理器访问本地存储器单元提供高速互连机制,同时为处理器访问远程存储器单元提供较为经济但延迟时间更高的连接通道,因而NUMA架构的系统通常比UMA架构的系统更加经济且性能更强大。

在NUMA架构中,有一种类型应用特别普遍,即CC-NUMA(Cache Coherent Non-Uniform Memory Access,缓存一致性非统一内存访问)系统。缓存一致性问题是由于多个处理器共享同一个存储空间而引起的,而CC-NUMA是指通过专门的硬件保持Cache中的数据和共享内存中的数据的一致性,不需要软件来保持多个数据副本之间的一致性。当某个存储单元的内容被某个处理器改写后,系统可以很快地通过专用硬件部件发现并通知其他各个处理器。因此。在CC-NUMA系统中,分布式内存储器被连接为单一内存空间,多个处理器可以在单一操作系统下使用与对称多处理器架构中一样的方式完全在硬件层次实现管理。无论CC-NUMA计算机内部有多少个处理器,对用户而言系统都可以被看作是一台计算机。





4. 多核处理器的核间通信机制


多核处理器片内的多个处理器内核虽然各自执行各自的代码,但是处理器内核之间需要进行数据的共享和同步,因此多核处理器硬件结构必须支持高效的核间通信,片上通信结构的性能也将直接影响处理器的性能。

当前主流的片上通信方式有三种:总线共享Cache结构、交叉开关互连结构和片上网络结构。

1)总线共享Cache结构

总线共享Cache结构是指多核处理器内核共享L2 Cache或L3 Cache,片上处理器内核、输入/输出接口以及主存储器接口通过连接各处理器内核的总线进行通信。

这种方式的优点是结构简单、易于设计实现、通信速度高,但缺点是总线结构的可扩展性较差,只适用于处理器核心数较少的情况。

斯坦福大学研制的Hydra处理器、英特尔公司开发的酷睿(CORE)处理器、IBM公司开发的Power4处理器和Power5处理器等早期的多核处理器很多采用总线共享结构。

2)交叉开关互连结构

传统的总线结构采用分时复用的工作模式,因而在同一总线上同时只能进行一个相互通信的过程。而交叉开关(Crossbar Switch)互连结构则能够有效提高数据交换的带宽。

交叉开关是在传统电话交换机中沿用数十年的经典技术,它可以按照任意的次序把输入线路和输出线路连接起来。图1.9为连接8个处理器内核和8个内存模块的交叉开关互连结构。

图1.9左侧的每条水平线和每条垂直线的交点都是可控的交叉节点,可以根据控制信号的状态打开或闭合。闭合状态的交叉节点使其连接的垂直线和水平线处于连通状态。图1.9中黑色实心节点处于闭合状态,空心节点处于打开状态,图右侧显示了放大的节点示意图。图1.9中显示三个开关处于闭合状态,这意味着同时可以有三个处理器内核分别与不同的存储器模块进行信息交互。

图1.9 连接8个处理器内核和8个内存模块的交叉开关互连结构



交叉开关网络是一种无阻塞的网络,因而这种架构不会因为网络本身的限制导致处理器内核无法与内存模块建立连接。只要不存在存储器模块本身的冲突,图1.9所示的8×8交叉开关互连结构最多可以同时支持8个连接。

与总线结构相比,交叉开关的优势是数据通道多、访问带宽更大,但缺点是交叉开关互连结构占用的片上面积也较大,因为n×n的交叉开关需要n2 个交叉节点。而且随着核心数的增加,交叉开关互连结构的性能也会下降。因此这种方式也只适用中等规模的系统。

AMD公司的速龙(Athlon)X2双核处理器就是采用交叉开关来控制核心与外部通信的典型实例。

3)片上网络结构

片上网络(Network on a Chip,NoC; On-chip Network)技术借鉴了并行计算机的互连网络结构,在单芯片上集成大量的计算资源以及连接这些资源的片上通信网络。每个处理器内核具有独立的处理单元及其私有的Cache,并通过片上通信网络连接在一起,处理器内核之间采用消息通信机制,用路由和分组交换技术替代传统的片上总线来完成通信任务,从而解决由总线互连所带来的各种瓶颈问题。

片上网络与传统分布式计算机网络有很多相似之处,但限于片上资源有限,设计时要考虑更多的开销限制,针对延时、功耗、面积等性能指标进行优化设计,为实现高性能片上系统提供高效的通信支持。

片上网络可以采用多种拓扑结构,如环形拓扑、网状拓扑、树状拓扑等。图1.10显示了一种常用的二维网状网络(2D Mesh)片上网络结构。片上网络包括计算子系统和通信子系统两部分。计算子系统由PE(Processing Element,处理单元)构成,完成计算任务,PE可以是处理器内核,也可以是各种专用功能的硬件部件或存储器阵列等。通信子系统由交换(Switch)节点(图中缩写为S)及节点间的互连线路组成,负责连接PE,实现计算资源之间的高速通信。通信节点及其间的互连线路所构成的网络就是片上通信网络。在图1.10所示的二维网状网络结构中,每个PE与一个交换节点相连,而每个交换节点则与四个相邻的交换节点和一个PE相连,交换节点实现路由功能,并作为每个相邻的PE的网络接口。

图1.10 二维网状网络片上网络结构



与总线共享Cache结构和交叉开关互连结构相比,片上网络结构可以连接更多的计算节点,可靠性高,可扩展性强,功耗也更低。因此片上网络被认为是更加理想的大规模多核处理器内核间互连技术。这种结构的缺点是硬件结构复杂,且软件改动较大。

这三种互连结构还可以相互融合,例如在整体结构上采用片上网络结构,而在局部选择总线共享Cache或交叉开关互连结构,以实现性能与复杂度的平衡。





1.3.2 内存顺序模型与内存屏障


1. 访存重排序


在一个并行多核系统中,程序在运行时对内存的实际访问顺序和程序代码逻辑中呈现的访问顺序并不一定是一致的。这是因为,为了提升多核系统中程序运行时的性能,编译器或者硬件往往会对指令序列进行重排序(Reordering),从而引入乱序执行(Out-of-Order Execution)机制。

一般而言,重排序会改变指令的执行顺序。各种类型的重排序出现的机会并不均等,这与处理器的体系结构和编译器的行为有关。指令序列重排序主要分3种类型:

(1)编译器优化导致的指令序列重排序。编译器在不改变某个处理器上运行的程序的语义的前提下,可以对指令序列重新安排语义。

(2)指令级并行导致的指令序列重排序。现代高性能处理器采用指令级并行处理技术增加每个时钟周期执行的指令条数,从而提高处理器性能。传统的超标量流水技术通过处理器动态执行机制实现指令级并行,超长指令字技术采用编译器软件静态调度实现指令级并行,而EPIC技术则通过软硬件相互协作方式提高系统性能。这些方法都可能修改相互之间不存在数据依赖性的若干指令的执行顺序。

(3)内存系统引起的指令序列重排序。除了指令执行顺序之外,通常在程序执行过程中还存在内存系统感知到的内存访问顺序。由于处理器通常会使用Cache和读/写缓冲区,使得程序运行时出现的多核间交互令访存的加载和存储指令看上去可能是在乱序执行。多个并行的存储体之间的访问顺序也可能会因某个存储体忙而被打乱。

从不同的视角可以看到三种不同的存储器访问顺序:

(1) 程序顺序(Program Order):程序顺序是程序代码在特定处理器上运行时由代码本身给出的访存顺序,代表程序员期望的访问存储器的时间顺序。

(2) 执行顺序(Execution Order):执行顺序是指在给定的处理器上运行时,特定的访存指令的执行顺序。由于上面提到的编译器优化和处理器优化等原因,执行顺序未必与程序顺序一致。

(3) 感知顺序(Perceived Order,或称观察顺序):感知顺序是特定处理器感知到的自身以及其他处理器的访存操作的顺序。由于Cache访问、存储系统优化和系统互连操作本身的原因,感知顺序和执行顺序同样不一定相同,而且不同架构的处理器对同样的访存操作可能会感知到不同的顺序。感知顺序并不是内存正被访问的顺序,而是所有的“观察者”看到的存储器发生访问的顺序。举例而言,某个处理器A按照“写存储单元1”“写存储单元2”的顺序执行,但另一个处理器B可能首先“感知”到存储单元2的改变,然后才“感知”到存储单元1的改变。

显然,在某些情况下,程序逻辑的正确性必须依赖于内存访问顺序,此时内存乱序访问就会带来逻辑上的错误,必须通过内存一致性模型加以规范。





2. 内存一致性模型


在共享存储器的多核系统上运行的程序必须要面对并行编程的问题。其中,内存访问顺序一致性是需要软件和硬件配合协同的问题,也即软件与存储器之间的协约问题。内存一致性模型(Memory Consistency Model)有时也简称为内存模型(Memory Model),描述的是程序在执行过程中内存操作顺序的正确性问题。如果软件遵守约定的规则,存储器就能正常工作;反之,存储器就不能保证操作的正确性。

从计算机系统的层次结构看,计算机系统逻辑上是由裸机和不同层次的虚拟机构成的,理论上在不同层次的机器上都可以看到内存模型。一般而言,可以把内存模型分为软件内存模型(Software Memory Model)和硬件内存模型(Hardware Memory Model)。

软件内存模型就是程序员和编程语言及其运行环境之间的一套协议,编程语言会规定一套规则来说明什么情况下会对代码进行重排序,并且提供一些机制能够让程序员对这些与指令执行顺序相关的操作进行控制。例如C++语言和Java语言的规范中分别定义了各自的内存模型。

下面要重点讨论的是硬件内存模型。硬件内存模型是处理器架构层次的内存一致性模型,可以理解为硬件与软件之间的一套协议。此处的硬件主要是指处理器。每个处理器体系架构都有其内存重排序的规则。硬件内存模型可以确定性地指出,一段给定的程序源代码在经过特定的编译器工具链处理后在特定的处理器上运行时,处理器会对机器代码序列进行何种内存操作重排序。

由于内存模型的多样性和多层次性,不同语境下的某种内存一致性模型的含义未必完全相同。广义上,内存一致性可以根据其对访存顺序重排序容忍的程度分类为强一致性和弱一致性。相对而言,能够保证所有处理器或进程对数据的读写顺序都保持一致的一致性内存模型属于强一致性内存模型(Strong Consistency Memory Model),而不能保证这一点的一致性内存模型则属于弱一致性内存模型(Weak Consistency Memory Model)。

1)顺序一致性内存模型(Sequential Consistency Memory Model)

顺序一致性内存模型能够保证任何程序的执行结果与所有处理器按照某种顺序依次执行相同,并且单独看其中的某个处理器,其执行顺序是依赖于其程序顺序的。也就是说,遵从顺序一致性模型的系统可以确保每个处理器的执行顺序是按照执行时的二进制机器指令的顺序来执行的,而所有其他处理器看到的该处理器的执行顺序跟其实际执行的顺序相同。换言之,处理器会按照程序流中出现的指令顺序来执行所有的load(加载)和store(存储)操作,从主存储器和处理器的角度来看,load和store指令严格按顺序对主存储器进行访问。

可见,这种顺序一致性内存模型让所有程序能够依照一种有序的执行顺序执行,程序员并不需要特别关心内存重排序问题,而是由处理器保证执行顺序,是非常直观简单的强一致性内存模型,有时也称为强排序模型。但是,这种模型的效率低下,因为该模型不允许处理器为了提升并行性而乱序执行程序。因此,在现代高性能处理器架构中,硬件实现的顺序一致性内存模型通常并不适用。

因此,通常在设计处理器的内存模型时会把顺序一致性内存模型作为一个理论参考模型,对顺序一致性内存模型做某种程度的放宽,以便给处理器和编译器优化提供一定空间。

最典型的放宽是对不同的加载和存储操作组合顺序的重排序操作的放宽,即当两个操作之间不存在数据依赖关系时,是否允许对以下操作组合重排序:加载之后的加载重排序(Loads Reordered After Loads)、存储之后的加载重排序(Loads Reordered After Stores)、存储之后的存储重排序(Stores Reordered After Stores)和加载之后的存储重排序(Stores Reordered After Loads)。由于现代存储系统的多层次特性,从同一个处理器发出的多次读、写操作指令的实际执行时间是不同的,因而乱序执行的地址不相关指令的执行顺序与感知顺序可能不同。

2)全存储排序内存模型

如果在顺序一致性模型的基础上放宽程序中的写-读操作的顺序,也即允许对先写后读操作进行乱序执行,使写操作的实际完成时间晚于后续的读操作,就称为全存储排序(Total Store Ordering,TSO)内存模型。这种情况一般出现在处理器中增加了写缓冲区(Write Buffer,或称StoreBuffer)的情况下。

如图1.11所示的多核系统多级存储器架构,写缓冲区是加在每个处理器与其Cache之间的store指令缓冲,其作用是临时保存写入的数据,使得处理器可以快速完成写操作而不用等待存储器的响应。写缓冲区可以降低处理器因写入数据而产生的延迟时间,保证指令流水线不因写操作延迟而断流。进一步,通过类似Cache写回(Copy-Back)方式以批处理模式刷新写缓冲区,并合并写缓冲区中对同一内存地址的多次写操作,可以减少对总线的占用。有了写缓冲区之后,某个处理器执行store指令时可以将其写操作简单记录在其写缓冲区中并继续执行后续指令,直到必要时才把写缓冲区中保存的数据真正写入Cache中。

但是,由于写缓冲区的存在,也使得处理器看到的写操作完成时间与数据真正被写入内存单元的时间存在差异,导致从处理器角度已经“执行完毕”(存入写缓冲区)的store指令并未马上取得写入的效果,从而与后续可能存在的load指令之间产生乱序执行。而且,每个处理器上的写缓冲区是私有的,仅对该处理器可见,有可能造成多核之间的一致性问题。

在图1.11所示的架构中,如果处理器采用顺序一致性内存模型,只要在CPU0和CPU1这两个处理器上运行的程序本身的顺序是合理的,就不会因为处理器乱序执行造成数据不一致。但在全存储排序模型中,如果CPU0的程序顺序是首先执行一条写指令再执行读操作,并假设被写入的内存单元Cache缺失,而被读出的内存单元Cache命中,则可能导致数据不一致。这是因为,对处理器CPU0而言,写操作在写入缓冲区之后就已经执行完了,但实际上在读出操作已经执行完成并取得结果时,写入操作的结果可能还没有被存入主存。

图1.11 多核系统多级存储器架构



由于全存储排序模型的处理器只放宽了写-读操作的顺序,但能够保证所有的store指令之间的执行顺序与指令代码顺序一致,故这种内存模型称为全存储排序内存模型。

3)部分存储排序内存模型

在全存储排序内存模型的基础上进一步放宽写-写操作的顺序,就变为部分存储排序(Partial Store Order,PSO)内存模型。在这种模型中,向存储缓冲区中写入的指令如果存在地址相关性,仍然能够保证顺序执行,但不存在相关性的写-写操作指令则允许乱序执行。

仍以图1.11为例,如果在某个处理器上连续执行两次地址不相关的写操作,第一次的写操作Cache缺失而第二次写操作Cache命中,则在部分存储排序内存模型中,两次写操作都会首先把数据存入写缓冲区,但第二次写操作指令会先执行完毕,而第一次写操作指令会等到Cache被填充数据后才会执行完毕,因而存在数据不一致的风险。

4)宽松内存顺序内存模型

如果把读-写和读-读操作的顺序也进一步放宽,就变为宽松内存顺序(Relaxed Memory Order,RMO)内存模型,即只要是地址无关的指令,无论是部分存储排序内存模型已经放宽的写-读(store-load)操作和写-写(store-store)操作,还是读-读(load-load)操作和读-写(load-store)操作,都允许乱序执行。

由此可见,顺序一致性、全存储排序、部分存储排序和宽松内存顺序这几种内存模型的硬件在确保访存顺序一致性方面是由强至弱逐渐降低的。强一致性内存模型能更好地保证程序逻辑不被乱序执行造成的潜在风险破坏,但随之而来的是性能提升的限制,因为强行禁止乱序执行在大多数情况下是没有必要的。而弱一致性内存模型授予处理器更多的权限以通过乱序执行提升系统性能,但是处理器硬件本身无法保证的多核一致性责任就必须由程序员(特别是系统程序员)承担。

不同处理器体系结构所使用的内存模型或多或少可能不同,因此很难严格定义某种处理器属于强一致性内存模型还是弱一致性内存模型。按照处理器支持访存重排序的程度,可以对几种主流的处理器架构的内存模型进行大致分类:

(1)早期DEC公司的64位Alpha服务器处理器属于比较严格的硬件弱内存模型。

(2)类似PowerPC、ARM和安腾(Itanium)这样的处理器架构也被认为属于弱内存排序(Weak Memory Ordering,WMO)的内存模型。虽然这三者的内存模型不完全相同,但是都比Alpha处理器增加了维护数据依赖性顺序的支持,也即前者的处理器不会对存在数据依赖关系的指令重排序。

(3)在个人计算机和服务器领域应用广泛的Intel64(x86-x64)架构使用过程一致性(Process Consistency)内存模型。这种内存模型基本上属于强一致性顺序内存模型,当某个处理器执行一系列顺序的写操作时,其他所有的处理器看到存储器中数据改变的顺序都和数据写入的顺序一致。

(4)有些处理器架构支持多种内存一致性模型。例如RISC-V处理器默认的内存模型为弱内存排序模型,但可以选择使用全存储排序内存模型。





3. 内存屏障指令


遵循弱一致性内存模型的处理器打开了指令乱序执行的阀门,虽然乱序执行不一定造成数据一致性问题,但是处理器无法确切获知在何种情况下乱序执行会造成不良后果。因此,这类处理器通常会提供若干内存屏障指令(Memory-Barrier Instructions),支持程序员在指令序列中显式说明访存顺序的依赖关系。

内存屏障指令能够确保处理器在内存访问上遵循特定的顺序,也即一个内存屏障指令之前的访存操作必定比内存屏障指令之后的访存操作先完成。

下面以Power和PowerPC处理器包含的三条同步(Synchronization)指令为例说明如何利用内存屏障指令实现同步操作。下面的实例关注输入/输出同步控制场景,其原理也同样适用于多核处理器之间的同步。

(1)输入/输出控制指令eieio

eieio指令的指令助记符读起来朗朗上口,其含义是强制按顺序执行输入/输出操作(Enforce In-Order Execution of I/O),也即在前面的所有load和store指令执行完毕之后再开始执行后续的load和store指令。这条指令对访问输入/输出设备的load和store指令提供了排序功能。

看下面这段向外设发送两次数据的代码。其中,TDR代表处于内存空间的发送数据缓冲器;而TDRE表示映射到另一个内存地址的状态寄存器中的一个状态位,其取值为1表明发送缓冲器为空,取值为0表明发送缓冲器不空。



显然,这段代码实现了两次字符输出操作,即当发送缓冲器空时送出字符char1,然后等到发送缓冲器再次为空时送出字符char2。对处理器而言,第1行和第3行的读状态寄存器语句都需要使用load指令,而第2行和第4行的送出字符语句需要使用store指令。

为了提升程序运行效率,处理器可能会在必要时启动写后读乱序执行,也即把第2行的写操作和第3行的读操作顺序打乱,先于第2行执行第3行的指令。最后实际的效果是,处理器执行了连续两次读状态操作,紧跟着执行了两次写数据操作。这显然不是程序本身想要的结果。

而增加eieio指令则可以阻止这种乱序执行:



增加了eieio指令之后,处理器会被强制在执行完第2行的写指令之后再执行第4行的读指令,从而确保程序执行不会造成顺序错误。

(2)同步指令sync

sync指令的功能是等待所有前序操作执行完毕。

在PowerPC架构中定义了执行同步(Execution Synchronizing)的概念,其含义是:如果某条指令i导致指令分发暂停,并且只有当正在执行的所有指令都已经执行完成并报告了触发的异常时,指令i才算执行完毕。

而sync指令除了满足执行同步指令的条件外,还会等待所有被挂起的内存访问结束,并且发出一个地址广播周期。可见,执行这条指令的性能代价是很大的。

一个实际的例子是在让处理器进入低功耗模式时使用sync指令。让处理器进入低功耗模式需要通过向系统寄存器写入参数实现,并且会引起处理器状态的改变。而进入低功耗模式之前,应该让所有前序指令执行完毕,而且在这条写入指令执行完毕之前,后续的指令不应该开始执行,除非系统又脱离低功耗模式。

因此,在执行进入低功耗的写操作指令之前应该首先执行一条sync指令,并且在进入低功耗之后还应再次执行sync指令。这一操作的伪代码如下:



(3)同步指令isync

isync指令覆盖了sync指令的功能,并且在等待所有前序指令执行完毕的同时还清空指令队列,也即按照新的处理器上下文重新加载指令队列。处理器把这种指令的操作称为指令上下文同步(Instruction Context Synchronizing)。系统调用指令、中断返回指令都需要指令上下文同步。

举例而言,当使用写操作指令激活指令Cache时,指令队列中可能已经存在若干指令了,此时先执行isync指令就会让后续指令进入指令Cache。

此外,Power处理器还有两条专用于多处理器间共享资源同步指令lwarx和stwcx。

每种处理器架构都有其自身定义的内存屏障指令,以支持其内存一致性模型。这对需要在不同平台之间迁移程序是个挑战。而且类似Java语言这样的软件开发环境往往限制程序员直接使用内存屏障,而是要求程序员使用互斥原语实现同步访问。





1.3.3 服务器虚拟化技术


1. 虚拟化的概念


虚拟化(Virtualization)是近年来随着云计算等应用场景的普及而发展起来的提高信息系统效率的一项关键技术。虚拟化的本质是把资源抽象化,从逻辑角度对资源进行配置,通过隐藏特定计算平台的物理特性为用户提供抽象、统一、虚拟的计算环境,使其不受物理限制的约束。对用户而言,虚拟化技术实现了软件与硬件资源的分离:用户不需要考虑具体硬件实现,而只需要在虚拟环境中运行其系统和软件;而运行在虚拟环境中的系统和软件也并不需要关心真实的物理平台,从而实现计算机系统的不同层次之间的透明。例如,一台支持虚拟化的计算机可以向上层软件虚拟出多台相互独立的计算机,对上层软件和用户而言,每台计算机看似都有其独有的处理器、存储系统和外部设备等物理资源。

因此,虚拟化技术的实质是一种资源管理技术,通过对硬件设备的抽象创建虚拟的计算机资源,将物理资源抽象为逻辑上可以管理的资源,以打破物理结构间的壁垒。计算机系统的下层软硬件模块向上层模块提供与其所期待的运行环境完全一致的接口和方法,从而抽象出虚拟的运行环境,使上层软件可以直接运行在虚拟机环境上,而不需要关心实际的物理资源配置。

在虚拟化系统中,物理资源通常被称为宿主(Host),而虚拟出来的资源被称为客户(Guest)。

虚拟化的核心就是虚拟机(Virtual Machine,VM)。在虚拟化技术中,虚拟机是一个严密隔离的软件容器,容器中容纳了一个操作系统和多个应用。同一系统中的每个虚拟机都是相互独立和完全隔离的,因此一台计算机上可以有很多虚拟机同时运行。

虚拟化软件提供的虚拟化层处于硬件平台和客户操作系统之间,这一实现虚拟化的软件层一般被称为虚拟机管理器(Virtual Machine Manager,VMM)、虚拟机监视器(Virtual Machine Monitor,VMM)或虚拟机软件(Virtual Machine Software,VMS),负责将虚拟机与物理主机分离开来,对虚拟机提供硬件资源抽象,为客户操作系统提供运行环境,并根据需要为每个虚拟机动态分配计算资源。在很多系统中,具备VMM功能的软件被称为Hypervisor(虚拟机管理器或虚拟化平台),实现对硬件资源的抽象与资源的分配、调度和管理,以及虚拟机与宿主操作系统及多个虚拟机之间的隔离功能等。

按应用领域的不同,虚拟化技术可以实现服务器虚拟化、存储虚拟化、平台虚拟化、桌面虚拟化、网络虚拟化、CPU虚拟化、文件虚拟化等,从而抽象出虚拟化桌面、虚拟化服务器、虚拟化存储和虚拟化操作系统等各类资源。而所有这些通过虚拟化技术抽象出的虚拟化资源都能和物理资源一样被有效地应用于业务运营。

按实现层次划分,可以把虚拟化技术划分为硬件虚拟化、操作系统虚拟化和指令集虚拟化等不同层次。

1)硬件虚拟化

硬件虚拟化是指用软件虚拟出标准计算机的硬件资源,例如CPU、内存储器、硬盘和外部设备等,即通过硬件抽象层实现虚拟机,虚拟裸机向客户操作系统呈现和物理硬件相似的硬件接口。

2)操作系统虚拟化

操作系统虚拟化是指操作系统的内核向上提供多个相互隔离的用户态实例,各个实例各自有自己独立的文件系统、网络系统和系统设置、库函数等,又称为容器虚拟化。操作系统虚拟化可以以一个系统为母体克隆出多个系统实例。

3)指令集虚拟化

指令集虚拟化是指由虚拟机的运行时(Runtime)系统将某种处理器的执行代码或者某种中间代码动态翻译成其他处理器或架构上的机器语言代码执行,从而在不同硬件和操作系统上运行程序的技术。这种技术最常见的应用方式就是Java语言的运行环境———Java虚拟机(Java Virtual Machine,JVM)。

可以看出,这种通过纯软件模拟实现各种不同处理器架构的指令集的虚拟化技术类似于在交叉调试时使用的指令集模拟器技术,其优点是可以完全模拟出所需要的硬件架构的功能特性,但其缺点是实现复杂、性能差。





2. 服务器虚拟化技术的优势


服务器虚拟化架构能够在特定的物理服务器宿主上以客户身份运行多个服务器操作系统。在虚拟化后的计算机系统中,服务器软件与物理计算机被隔离开,用户看到的服务器实际上是与物理资源分离的虚拟机。从服务器客户操作系统和用户的角度看,服务器运行于专属的计算机资源之上,而真实的场景是服务器运行在服务器硬件的虚拟机上。服务器虚拟化技术为虚拟机上运行的服务器提供能够支持其运行的虚拟BIOS、处理器、内存、输入/输出设备等抽象资源。

服务器虚拟化是云计算的基础,其最大好处是能够更充分地利用信息技术资源。在不采用服务器虚拟化技术的场景中,同一数据中心内的硬件资源利用不足和过度利用的情况都会普遍出现。传统的运行模式是为每一项业务应用部署一台单独的服务器,服务器的配置通常是针对业务的峰值需求而不是平均工作负载确定的,因而服务器在大部分时间内处于空闲或利用率不足状态。而采用虚拟化技术之后,同一台物理服务器可以运行多个服务器操作系统和配置,数据中心也可以根据负载情况在不同虚拟机之间迁移工作负载,从而进一步提高硬件资源的利用效率。

更进一步,现代的虚拟化技术会将众多的物理资源组织成一个庞大的、计算能力强大的资源池,再将这个资源池虚拟成多个独立的共享资源的计算机系统,并动态调度资源,从而最大限度地平衡不同业务的资源需求,减小物理服务器规模,达到资源利用率的最大化。

服务器虚拟化也给服务器管理提供了便捷的平台。借助服务器虚拟化厂商提供的功能强大的虚拟化环境管理工具,管理员可以通过复制等方式轻松地将封装好的操作系统和应用程序部署到虚拟机上,显著提高了应用部署效率。相应地,系统备份也可以通过复制虚拟机镜像文件的方式进行,并在需要时方便地恢复或迁移虚拟机,减少故障宕机时间,提高业务服务水平,使系统可用性明显提高。由于实现了虚拟机与物理机的隔离,应用程序与底层物理硬件不直接打交道,应用的兼容性也得以提高。

服务器虚拟化也有助于降低运营成本。在虚拟化服务器上,应用程序的管理员不再需要和物理服务器直接打交道,只需关注对应用程序的管理,管理工作分工更明确,应用管理工作大大简化。服务器虚拟化可以根据业务需要,弹性提供资源,物理机的管理员则可以根据服务器的工作负载状况动态调整物理机配置,关闭不必要的物理服务器,降低机房的整体功耗。





3. 服务器虚拟化的特征


服务器虚拟化的特征可以概括为以下几点。

(1)封装:服务器虚拟化按虚拟机的颗粒度封装虚拟机的运行环境,将整个系统中的硬件配置、操作系统以及应用等完整的虚拟机环境封装保存在文件中,保存、部署、备份、复制和恢复都非常方便和迅速。为应用程序提供的标准化虚拟硬件也可以保证兼容性。

(2)隔离:虚拟化的服务器上的每个虚拟机都与宿主机和同一个服务器上的其他虚拟机完全隔离。某一个虚拟机受到攻击或出现故障不会影响其他虚拟机,各个虚拟机之间也不会出现数据泄露等安全性问题。运行在不同虚拟机上的应用程序只能通过网络连接进行通信。与运行在同一操作系统中的多任务方式相比,虚拟机上的每个应用程序可以在自己的客户操作系统中独立运行,不会影响其他应用程序。而且,应用执行环境简单,系统可以快速从备份中恢复,大大提高了工作效率,降低了总体投资成本。

(3)硬件无关性:通过虚拟化技术在真实硬件之上模拟出应用程序所需的硬件资源,使得应用和具体硬件的关联性大大降低。通过动态迁移技术更可以将处于运行状态的虚拟机无缝地迁移到其他服务器上运行。

(4)可控和高效:由于虚拟机完全兼容标准的操作系统及其上的硬件驱动程序和应用程序,因而可以非常方便地在一个物理系统中运行多个操作系统实例,使得硬件资源的利用率更高。通过多态硬件服务器组成的集群资源池,可以将计算资源以可控的方式分配给虚拟机。例如可以根据负载动态启用或关闭服务器,或者在可扩展架构中将服务器整合到虚拟机中。由于虚拟化技术对系统资源进行了整合,给系统升级和管理提供了方便,无须像传统独立服务器那样对每个资源单独进行烦琐的安装、定制、升级和维护等操作,节省了大量的人力和物力。





4. 服务器虚拟化的实现方式


服务器的虚拟化可以通过以下方式实现。

1)完全虚拟化

完全虚拟化(Full Virtualization)是早期在没有硬件对虚拟化提供支持时基于纯软件实现的虚拟化,借助虚拟机管理器软件完整模拟物理硬件环境,在虚拟服务器和底层硬件之间建立一个抽象层。对宿主机而言,虚拟机管理器就是宿主操作系统,在由虚拟机管理器管理的虚拟服务器上运行的是客户操作系统(Guest Operating System)。

虚拟机管理器可以在客户操作系统和硬件之间捕捉和处理对虚拟化敏感的特权指令,并为访问硬件控制器和外设充当中介。因此,现有操作系统几乎无须改动就能安装到虚拟服务器上运行,并且客户操作系统完全察觉不到虚拟机的存在。

虽然软件实现的完全虚拟化方式的兼容性非常好,但由于完全依赖于软件,因而很难在架构上保证其完整性。软件实现的完全虚拟化方式的主要缺点在于虚拟机管理器模拟底层硬件系统的开销较大,导致虚拟机运行效率明显低于物理机,对系统性能的影响较大。

2)准虚拟化/半虚拟化/类虚拟化

为了解决依靠纯软件支持的完全虚拟化对物理处理器的负担,可以通过改动客户操作系统的方式在客户操作系统中集成虚拟化支持代码,令客户操作系统与虚拟机管理器协同工作,这种方法称为准虚拟化、半虚拟化或类虚拟化(Para-virtualization)。

准虚拟化技术也利用虚拟机管理器实现对底层硬件的共享访问,客户操作系统运行于虚拟机管理器之上。由于客户操作系统集成了与虚拟化有关的代码,因而可以更好地配合虚拟机管理器实现虚拟化。准虚拟化方式的虚拟机管理器软件只对底层硬件进行部分模拟,虚拟机在运行时可减少在用户模式和特权模式之间的切换次数,从而降低运行时的开销。因而准虚拟化方式的优点是性能较优异。

3)硬件辅助虚拟化

硬件辅助虚拟化技术并不是一个独立的类别,而是用于对完全虚拟化和准虚拟化技术的优化支撑。

基于软件与硬件的逻辑等价关系,硬件替代软件实现虚拟化的部分功能可以显著提升系统性能,引入硬件支持后的虚拟机可以更接近物理机的速度。硬件辅助虚拟化(Hardware-Assisted Virtualization)就是在处理器、内存储器控制部件以及输入/输出设备等硬件中加入专门针对虚拟化的支持,以简化虚拟化软件的实现,提高虚拟化的效率。在硬件辅助虚拟化方式中,硬件提供的虚拟化功能支持可以截获操作系统执行的虚拟化敏感指令或者对敏感资源的访问,并通过异常的方式报告给虚拟机管理器。

英特尔虚拟化技术(Intel Virtualization Technology,IVT)和AMD虚拟化(AMD Virtualization,AMD-V)是硬件辅助虚拟化技术在CISC架构上的实现。

在服务器虚拟化技术中,必须对处理器、内存储器和输入/输出设备这三类硬件资源进行虚拟化。因此硬件辅助虚拟化也需要提供对这三类硬件的虚拟化支持。支持虚拟化技术的处理器中会加入新的处理器运行模式和指令集,以实现处理器虚拟化的相关功能。内存虚拟化则由内存虚拟化管理部件统一管理物理内存单元,并实现逻辑内存与机器物理内存之间的映射。输入/输出设备虚拟化则把真实的物理设备包装成多个虚拟设备交付给多台虚拟机使用,由虚拟化管理器响应每个虚拟机的设备输入/输出请求。

4)操作系统层虚拟化

操作系统层虚拟化(Operating System-Level Virtualization)技术也被称为容器化(Containerization)技术,是指在操作系统层面增添虚拟服务器功能的方式。在这种技术中,一般要求所有虚拟服务器运行同一操作系统,宿主机的操作系统本身负责在多个虚拟服务器之间分配硬件资源,并在各个虚拟机之间实现隔离。

在操作系统层虚拟化架构中没有独立的虚拟机管理层软件,而是将操作系统内核虚拟化,允许用户空间的软件实例被分割成几个独立的单元在内核中运行。这些软件实例就是容器(Containers)。

操作系统层虚拟化之后,可以实现软件的动态迁移,允许一个软件容器中的实例即时迁移到另一个操作系统下运行。软件即时迁移只能在同样的操作系统下进行。容器的弹性也可以支持对资源需求的动态调整。

操作系统层虚拟化占用的服务器空间少,系统引导快。虽然操作系统层虚拟化的灵活性较差,但系统性能较高。而所有虚拟服务器使用单一、标准的操作系统也便于对整个系统进行管理。





5. 虚拟机管理器的典型架构


图1.12比较了虚拟机管理器的两种典型架构。

图1.12 虚拟机管理器的两种架构



图1.12(a)为类型1虚拟机管理器,一般称为原生虚拟机管理器(Native Hypervisor)或裸金属虚拟机管理器(Bare-metal Hypervisor)。这种架构的虚拟机管理器直接运行在宿主硬件上并直接控制宿主硬件,同时负责管理客户操作系统(Guest OS)。对宿主服务器而言,客户操作系统相当于在其上运行的进程。这种方式下,虚拟机管理器需要直接访问硬件资源,运行效率较高。

图1.12(b)为类型2虚拟机管理器,一般称为寄居/托管虚拟机管理器(Hosted Hypervisor)。类型2虚拟机管理器运行在宿主机上运行的具有虚拟化功能的操作系统之上,相当于操作系统之上的应用程序。这种方式的硬件兼容性更好,因为是操作系统而不是虚拟机管理器提供硬件驱动程序。但由于虚拟机管理器必须通过宿主操作系统才能访问硬件资源,故其运行效率一般较类型1更低。





1.3.4 PCI Express总线


在现代服务器中,广泛使用PCIExpress总线实现系统级互连,因而PCIExpress总线在服务器架构中占据着相当重要的地位。PCI Express总线简称为PCIe总线,是基于PCI(Peripheral Component Interconnect,外围部件互连)总线技术发展起来的总线标准,虽然总线的名称有所改变,但这两种总线有着非常密切的关系。相比早期的ISA和EISA等第一代总线,PCI总线的传输速度有明显提升。但是计算机系统对传输性能的要求仍在不断提升中,PCI总线逐渐难以满足高速显卡等高性能传输模块的性能要求。于是,第三代的PCIExpress总线逐渐取代了PCI总线。





1. PCI Express总线的特点


PCI Express总线对PCI总线有良好的继承性,在系统软件级和应用上兼容PCI总线。基于PCI总线的系统软件几乎可以不经修改直接移植到PCIExpress总线系统中。

与PCI总线相比,PCI Express总线的主要改进有如下几点。

1)高速差分传输

与PCI总线使用的单端信号对地传输方式不同,PCI Express总线改用差分信号进行数据传送,一个信号由D+和D-两根信号线传输,信号接收端通过比较这两个信号的差值判断发送端发送的是逻辑“1”还是逻辑“0”。由于外部干扰噪声将同时附加到D+和D-两根信号上,因而在理论上并不影响二者的差值,对外界的电磁干扰也比较小。因此差分信号抗干扰的能力更强,可以使用更高的总线频率。

PCI Express总线还引入了嵌入时钟技术,发送端不向接收端传输时钟信号,而是通过8b/10b或128b/130b编码将时钟信息嵌入数据信号中,接收端可以从数据中恢复出时钟。

2)串行传输

由于并行传输方式使用更多的信号线进行传输,因而理论上并行传输的速率比串行传输更高。但是并行总线通常需要在系统底板上进行复杂的走线,随着信号传输速度的提高,不同长度或在PCB板不同层布放的导线引起的定时偏差的影响和并行导线之间存在的相互干扰变得越来越严重,限制了信号传输的最高速率。而串行传输方式在每个方向只有一个差分信号,且时钟信息通常可以嵌入在数据信号中,故不会出现定时偏移。因此,串行信号在有些情况下传输速度反而更高。与USB总线和SATA接口类似,PCI Express总线也采用串行传输方式替代PCI总线的并行传输方式。

3)全双工端到端连接

与PCI的共享总线模式不同,PCI Express链路使用端到端的数据传送方式,每个通道(Lane)只能连接两个设备,设备之间通过双向的链路相连接,每个传输通道独享带宽。如图1.13所示,PCI Express总线的物理链路的一个通道由两组差分信号组成,发送端的发送器与接收端的接收器通过一对差分信号线连接,接收端的发送器与发送端的接收器通过另外一对差分信号线连接。PCI Express支持全双工通信,允许在同一时刻同时进行数据发送和接收。

图1.13 PCI Express总线通道的物理结构



4)基于多通道的数据传输方式

一个PCIExpress链路可以由多条通道组成,目前可支持×1、×2、×4、×8、×12、×16和×32宽度的PCIExpress链路。不同的PCIExpress总线规范所定义的总线频率和链路编码方式并不相同,例如在PCIExpress 1.0规范中,×1单通道单向传输带宽可达到250MB/s。多通道设计增加了灵活性,较慢的设备可以分配较少的通道。

5)基于数据包的传输

作为串行通信总线,PCI Express所有的数据都是以数据包为单位进行传输的。完整的PCIExpress体系结构由上到下包括应用层(软件层)、事务层(Transaction Layer)、数据链路层(Data Link Layer)和物理层(Physical Layer)等,通过对等层之间的通信协议实现数据包的传输。

此外,电源管理、服务质量(Quality of Service,QoS)、热插拔支持、数据完整性、错误处理机制等也是PCIExpress总线所支持的高级特征。

表1.2列出了常用的PCIExpress总线版本1.0~4.0的物理层主要差异。

表1.2 不同版本的PCI Express总线物理层差异





2. PCI Express总线的组成与拓扑结构


图1.14为PCIExpress总线的拓扑结构实例。可以看出,PCI Express总线上包括四类实体:根复合体、交换器、PCI Express桥和端点。

图1.14 PCI Express总线的拓扑结构实例



根复合体(Root Complex,RC)是PCIExpress总线的根控制器,负责将处理器/内存子系统连接至PCIExpress交换结构。一个根复合体可能包含多个PCIExpress端口(Port),可将多个交换器连接到根复合体或级联的端口。根复合体至少包含一个主桥(Host Bridge)、根端口(Root Port,RP)或者根复合体集成端点。其中,主桥是根复合体内负责处理器与PCIExpress总线树状拓扑连接的部件;根端口则是根复合体内负责将树状拓扑的一部分映射到相应的虚拟PCI到PCI桥的PCIExpress端口。

PCI Express总线采用基于交换的技术,交换器(Switch)是连接两个或者多个端口的部件,可以用于扩展PCIExpress总线,令分组在不同端口之间进行路由。标准交换器由1个上游端口(Upstream Port)和2个或多个下游端口(Downstream Port)组成,下游端口连接设备、PCI Express桥或者下一级交换器。PCI Express总线系统可以通过交换器连接多个PCIExpress设备。对软件而言,交换器可以被看作一组虚拟的PCI到PCI桥。

PCI Express桥(PCI Express Bridge)负责PCIExpress和其他总线之间的转换,PCI Express总线系统可以通过PCIExpress桥扩展出传统的PCI总线或PCI-X总线。

在PCI Express总线架构中,连接到PCIExpress总线上的设备被称为端点(Endpoint,EP),如PCIExpress接口网卡、串口卡、存储卡等。端点处于PCIExpress总线系统拓扑结构中的最末端,一般作为总线操作的发起者或者终结者。具体而言,端点是作为PCIExpress事务的请求者(Requester)或完成者(Completer)的一类功能单元(Function)。端点被分类为三种类型:老旧端点(Legacy Endpoint)、PCI Express端点和根复合体集成端点(Root Complex Integrated Endpoint,RCiEP)(2)。其中,老旧端点是指那些原本准备设计用于PCI-X总线但却被改为PCIExpress接口的设备。

功能单元是PCI Express设备中在配置空间内可寻址的实体,例如USB控制器、以太网控制器等。功能单元中的配置空间与某个单一功能单元编号相关联,每个功能单元也有其自己的配置地址空间,用于初始化与其相关联的资源。单功能单元设备(Single-Function Device)中只有一个功能单元,而多功能单元设备(Multi-Function Device)则集成了多个功能单元。输入/输出虚拟化规范中还定义了特殊类型的功能单元:物理功能单元(Physical Functions)和虚拟功能单元(Virtual Functions)。





3. PCI Express总线的层次结构


PCI Express总线的层次结构如图1.15所示。可以看出,PCI Express总线参考了互联网的分层模型。不同的是,除了应用层由软件实现外,PCI Express的下层实体都是用硬件实现的。

图1.15 PCI Express总线的层次结构



图1.15中,设备核心(Device Core)一般由根复合体核心逻辑或端点的核心逻辑构成,例如以太网控制器、SCSI控制器、USB控制器等。

从功能上看,PCI Express总线本身的层次架构由事务层、数据链路层和物理层构成,每层又被垂直分为两部分:处理外发流量的发送部分和处理到达流量的接收部分。

PCI Express总线按照层次结构定义了三种分组格式:TLP(Transaction Layer Packet,事务层分组)、DLLP(Data Link Layer Packet,数据链路层分组)、PLP(Physical Layer Packet,物理层分组)。

TLP由发送设备的事务层发起,并在接收设备的事务层终结。从设备核心和应用层获取的信息在事务层被封装到TLP中,TLP再被保存至缓冲区等待通过下层实体发送。在数据链路层和物理层,分组被附加上差错校验等必要的信息,然后在物理层经过编码后通过差分链路进行传输。由于PCIExpress采用端到端连接方式,故链路上传输的分组会被链路对端的接收设备接收。接收设备的物理层将分组译码后通过相反的流程上传信息至高层。数据链路层在检查到分组无差错后进一步转发至事务层。事务层缓冲输入TLP,并将信息转换为设备核心和应用层可以理解的形式。

DLLP的传输过程与TLP不同的是,分组在直接相连的同一链路的发送器的数据链路层和接收器的数据链路层之间传输,并且不通过交换器,因而DLLP不包含路由信息,分组也比TLP小。DLLP的功能是链路管理,包括与ACK/NAK(ACKnowledge/Negative ACKnowledge,确认/否定确认)协议相关的TLP响应、电源管理和流控信息交换等。类似地,PLP在物理层实体之间传输,也不经过交换器。





4. PCI Express总线的拓扑发现


与PCI总线相同,PCI Express总线上的每个功能单元都有一个唯一的标识,通称为BDF(Bus,Device and Function,总线-设备-功能单元)。该标识与该功能单元所属的设备以及该设备所连接的总线相关,反映了该功能单元在整个总线拓扑结构中的位置。配置软件负责在完整拓扑结构中发现所有的总线、设备和功能单元。

一个系统中的所有PCI总线都需分配一个唯一的总线编号。配置软件可以在一个系统中最多分配256个总线编号,0为最初始的总线编号。根复合体由硬件配置为总线0,总线0由一个集成了端点的虚拟PCI总线及若干虚拟PCI到PCI桥构成,硬件为PCI到PCI桥分配其设备编号和功能单元编号。而每个PCI到PCI桥都创建了一个新的总线,可以连接PCIExpress设备。

开始分配总线编号时,配置软件首先从总线0、设备0、功能单元0开始。每次发现一个总线桥之后,配置软件会为该总线桥扩展出来的总线分配一个后续递增的新总线编号。此后,配置软件先检索新总线上的总线桥,然后再回到当前总线继续检索总线桥。可以看出,这种枚举方式就是“深度优先搜索”方式。

PCI Express总线是兼容PCI总线的架构,单一PCI总线上可以挂接32个设备。但由于PCIExpress总线为点到点连接方式,故在PCIExpress总线上只能在每个链路上直接挂接一个设备,这个设备始终被编号为设备0。只有根复合体和交换器上的虚拟PCI总线才允许挂接多个设备。

单功能单元设备只有功能单元0。而多功能单元设备上最多可以集成8个功能单元。多功能单元设备也必须配置功能单元0,但其他功能单元编号并不需要连续。





5. PCI Express总线的总线事务


PCI Express总线以数据分组的形式完成设备之间的数据传输。根复合体和端点之间可以相互通信,两个端点之间也可以相互通信。通信通过事务层分组(TLP)进行。

在PCI Express总线中,事务(Transactions)是指一个或多个传输分组在请求者和完成者之间实现信息传输的操作。PCI Express的总线事务可以分为4类:存储器事务、I/O事务、配置事务和消息事务。前三种事务是从PCI和PCI-X体系结构继承下来的,而消息事务是PCIExpress总线新增的事务种类。

根据事务的交互特性,可以把事务分成公告事务(Posted Transaction)和非公告事务(Non-Posted Transaction)。

非公告事务的处理流程是分离的传输过程,请求者首先发送一个TLP请求分组至完成者,稍后完成者会返回一个TLP完成分组至请求者,指明完成者已经接收到请求TLP。如果是非公告写事务,请求TLP中会包含欲写入的数据;如果是非公告读事务,返回的完成TLP中包含读出的数据。

公告事务则是最佳传输性能优化的事务。对公告事务,请求者发送一个TLP请求分组至完成者,其中可以包含数据,也可以不包含数据,但完成者并不返回完成TLP至请求者。因此,请求者对完成者是否成功接收到请求并不知情。

在PCI Express总线事务中,请求者的总线编号、设备编号和功能单元编号组合起来可以唯一确定PCIExpress总线拓扑中的请求者身份,因而这三者的组合称为请求者标识(Requester ID)。

类似地,完成者的总线编号、设备编号和功能单元编号组合被称为完成者标识(Completer ID),能唯一标识PCIExpress总线拓扑中对某个请求的完成者。

表1.3给出了各种PCIExpress总线事务的类型及公告属性。

表1.3 PCI Express的总线事务类型及公告属性





6. PCI Express总线的地址空间


从表1.3中可以看出,PCI Express总线的地址空间仍然保留了存储器地址空间、I/O地址空间和配置地址空间三类,凸显出PCIExpress总线及PCI总线与采用独立I/O编址方式的英特尔处理器之间的渊源。为了与PCI总线保持兼容,PCI Express总线仍然支持I/O地址空间,但是建议新开发的软件采用MMIO(Memory Mapped I/O,存储器映射输入/输出)方式,也即把I/O设备中的寄存器和内部存储器都映射到统一的系统内存地址空间中。如果期望与早期的软件兼容,常见的做法是将设备内部寄存器和内部存储器占用的地址空间同时映射到存储器空间和I/O空间,新设计的软件使用MMIO空间,而老旧软件仍然在I/O地址空间工作。

PCI Express总线可以支持的存储器地址位数最多为64位,存储器空间的大小受处理器可寻址空间限制,而I/O地址空间大小则被限制到4GB,也即32位地址空间。

MMIO地址空间又可以分为两类:P-MMIO (Prefetchable MMIO,可预取MMIO)空间和NP-MMIO(Non-Prefetchable MMIO,不可预取MMIO)空间。由于对I/O空间的寄存器的每次访问可能存在副作用,例如读取某个地址可能导致该地址内容发生变化,因而MMIO应该是不允许缓存的。可预取MMIO空间是指不存在副作用且允许合并写操作的空间。如果把一个MMIO空间的区域定义为可预取属性,则在预期请求者可能会在最近读取更多数据的情况下,允许该区域的数据被提前推断预取,因为读操作并不会产生改变状态的副作用,预取操作有可能提升读操作的性能。PCI设备可以通过设定其配置空间寄存器的“内存可预取”状态位来指明某地址区域是否可预取。P-MMIO和NP-MMIO的划分主要是为了兼容PCI设备,因为PCIExpress请求中明确包含了每次的传输数据的大小。





7. PCI Express总线的中断机制


PCI Express总线支持的中断机制继承自PCI总线,并与其保持兼容。因此,PCI Express总线支持两种中断请求方式:INTx仿真(INTx Emulation)方式和消息信号中断(MSI/MSI-X)方式。

1) INTx仿真方式

早期的PCI总线采用的中断机制通常被称为传统中断信号线方式(INTx),是利用独立的中断请求信号线向中央中断控制器发送中断请求,每个PCI设备支持最多四个INTx#中断请求信号,即INTA#、INTB#、INTC#和INTD#。这种传统中断信号线方式简单实用,一般用于单处理器系统,但是存在较大局限性。

为了保持向后兼容,PCI Express总线仍支持这种方式,但为了减少引脚数量,INTx#信号不是通过独立信号线传输,而是由PCIExpress总线桥把INTx信号转换为带内INTx中断仿真消息分组,通过分组消息传递指明中断请求引脚的信号激活和失效状态。这种消息是发送给根复合体的,通常中断控制器就集成在根复合体内。

2)消息信号中断(MSI/MSI-X)方式

为了降低硬件设计复杂度并减小独立中断请求信号线的副作用,后续的PCI总线和PCI-X总线支持改进后的消息中断机制,也即消息信号中断MSI(Message Signaled Interrupts)方式及其扩展版本MSI-X(MSI eXtented)。

容易混淆的是,MSI/MSI-X中断机制使用所谓“消息(Message)”方式传递中断请求状态,但是这种消息是相对于传统INTx独立信号线的概念,与PCIExpress总线的TLP消息并不是相同的概念。这是因为MSI/MSI-X中断消息并不是一种PCIExpress总线消息事务,而是一种公告存储器写(Posted Memory Write)操作。MSI写操作的目标地址通常是系统保留给中断机制的,因而可以区分MSI消息写操作与其他存储器写操作。

图1.16给出了PCIExpress总线中断机制的一个实例。PCI Express总线必须至少支持MSI和MSI-X中的一种。如果系统中的软件不能支持MSI/MSI-X机制,仍可以使用INTx仿真方式。但一般情况下,不建议新设计的系统采用INTx仿真方式。

图1.16 PCI Express总线中断机制实例





8. PCI Express总线的差错处理与差错报告


作为一个高可靠性的总线系统,差错检测和报告机制是PCIExpress总线的重要组成部分。

由于PCIExpress总线向后兼容PCI总线,故而在PCI总线规范中定义的差错管理机制仍得以保留。PCI总线在每个传输阶段检查错误,并将检测到的错误记录在状态寄存器中,可以通过奇偶校验错误引脚PERR#(Parity Error)或系统错误引脚SERR#(System Error)报告错误。PERR#引脚通常用于报告数据传输过程中的可恢复奇偶校验错误。而SERR#引脚则用于报告较严重的不可恢复错误,例如地址、命令传输过程中的错误,或者多任务传输过程中的数据错误等。PCI Express总线同样保留了配置寄存器中的差错状态位。

PCI Express总线的差错报告(Error Reporting)机制允许向PCIExpress根复合体发送差错消息,根复合体会在收到差错消息后向处理器提出中断请求。PCI Express总线定义了两个等级的差错报告机制,即必备的基准能力和可选的扩展能力。

所有PCIExpress总线设备都需要支持的基准能力(Baseline Capability)包含传统的PCI总线差错报告机制及基本的PCIExpress差错报告能力。基准能力支持两组配置寄存器:PCI总线兼容的寄存器允许软件检查被映射为PCI总线差错的PCIExpress总线差错;而PCIExpress总线兼容的寄存器则可提供关于PCIExpress差错的详细信息。

PCI Express总线设备的功能单元还可以实现可选的支持高级差错控制与报告机制的扩展能力。在PCIExpress总线规范中定义了AER(Advanced Error Reporting,高级差错报告)扩展能力结构(Extended Capability Structure)。AER是PCIExpress总线引入的新特性,是一组配置寄存器,在PCIExpress总线上发生故障时可以通过中断报告故障的详细信息。AER寄存器可以在更细粒度上精准记录所发生的差错的种类,精确定义每种不可恢复差错的严重程度,识别PCIExpress拓扑中的差错源,还可以在需要时屏蔽特定类型的差错报告,甚至可以记录引起差错的数据分组的头部信息。这些详尽的信息有助于差错处理软件的差错诊断和差错恢复。

故障报告与处理需要硬件、固件和驱动程序的支持和协同配合。PCI Express总线AER差错处理流程通常采用固件优先(Firmware First)处理器制。典型的差错上报操作流程是:PCI Express总线设备在检测到差错后,通过AER机制发送差错上报消息;PCI Express根复合体提出错误处理中断请求;固件中包含的安全中断处理程序分析并上报差错。



* * *



(1) 1英寸=2.54厘米,即1in=2.54cm。

(2)根复合体集成端点已经集成在根复合体中。





第2章 ARMv8-A体系结构


华为海思的鲲鹏(Kunpeng)系列通用计算处理器采用ARMv8-A架构。2014年发布的第一颗64位CPU鲲鹏912处理器片上系统内置ARMCortex-A57处理器内核,2016年发布的鲲鹏916处理器片上系统内置ARMCortex-A72处理器内核。而2019年1月发布的第三代鲲鹏920处理器片上系统则采用华为自研的TaiShanV110处理器内核,兼容ARMv8-A架构。因此,要理解鲲鹏处理器的架构离不开ARMv8-A体系结构。在第3章详尽讨论鲲鹏920处理器片上系统的体系结构之前,本章先总结ARMv8-A架构的核心内容。





2.1 ARMv8-A处理单元的核心架构


2011年11月,ARM公司发布首个支持64位指令集的新一代ARMv8处理器架构,引入了一系列新特性,也成为ARM处理器进军服务器处理器市场的技术基础。

ARM公司从2013年起陆续发布了ARMv8-A架构的标准文档《ARM体系结构参考手册ARMv8:ARMv8-A架构概述(Arm®Architecture Reference Manual ARMv8,for ARMv8-A Architecture Profile)》,ARM公司简称该文档为ArmARM(以下简称为“ARMv8-A架构规范”),该文档的最新版本发布于2020年3月(Issue F.b)。在ARMv8-A架构规范及其补充文档中详尽定义了新一代ARM处理器的架构。

ARMv8-A架构属于64位处理器架构,向下兼容ARMv7架构。ARMv8-A架构增加的A64指令集是全新设计的64位指令集。虽然为保持向下兼容,ARMv8-A架构仍然支持ARMv7体系结构的32位A32指令集(之前被称为“ARM指令集”),并且保留或扩展了ARMv7架构的TrustZone技术、虚拟化技术及增强的SIMD(Neon)技术等所有特性,但A64指令集并非是直接在原有32位指令集基础上增加了64位扩展支持,因为这种简单的扩展方式将导致复杂性提高而且效率低下。当ARMv8-A架构的处理器通过全新的64位部件执行64位指令时,支持32位指令集的部件并不工作,因而可以保证处理器在低功耗状态下完成64位计算。

ARMv8-A架构引入了两种执行状态(Execution State):AArch64(64位ARM体系结构)执行状态支持A64指令集,可以在64位寄存器中保存地址,并允许指令使用64位寄存器进行计算;AArch32(32位ARM体系结构)执行状态则保留了与ARMv7-A体系结构的向下兼容性,使用32位寄存器保存地址,用32位寄存器进行计算。AArch32执行状态支持T32指令集和A32指令集,但可以支持AArch64状态中包含的某些功能。其中,T32指令集在ARMv8架构之前被称为Thumb/Thumb2指令集,是32位和16位长度混合的指令集,无对应的64位版本。T32指令集为设计人员提供了出色的代码密度,以降低对系统内存容量的要求并使成本最小化。

新引入的64位处理器架构AArch64支持64位通用寄存器、64位SP(堆栈指针)和64位PC(程序计数器),实现了64位数据处理和扩展的虚拟地址。不管是64位计算模式下的A64指令集还是32位计算模式下的A32指令集,指令长度依然保持32位(4字节)。从程序员角度看,两种类型指令集的本质区别是其工作寄存器的位数不同,A32指令集使用32位工作寄存器,而A64指令集则使用64位工作寄存器,并使用64位计算模式。

AArch64执行状态和AArch32执行状态均支持SIMD(Single Instruction Multiple Data,单指令流多数据流)和浮点运算指令。在AArch32执行状态或AArch64执行状态下,增强的SIMD指令可以在SIMD和浮点寄存器(SIMD&FP Register)文件上操作,浮点运算指令同样也可以在SIMD和浮点寄存器文件上操作。在AArch32执行状态下,基本指令集(Base Instruction Set,增强的SIMD指令和浮点运算指令之外的指令构成的集合)中的SIMD指令可以在32位通用寄存器上操作。





2.1.1 ARMv8-A架构的处理器运行模式


1. ARMv8-A的执行状态


在ARM架构中,执行状态定义了处理单元的执行环境,包括其所支持的寄存器宽度、支持的指令集,以及异常模型、虚拟存储系统体系结构和编程模型的主要特征等。

1) AArch64执行状态

AArch64为64位执行状态,该状态首先表现为支持单一的A64指令集的特征。

此外,AArch64在架构上的一个显著变化是放弃了传统ARM处理器的工作模式、特权模式等概念,转而定义了全新的ARMv8异常模型,最多含四个异常等级(Exception Levels,EL),即EL0~EL3,构筑了一个异常权限的层次结构。相应地,AArch64执行状态对每个系统寄存器使用后缀命名,以便指示该寄存器可以被访问的最低异常等级。

AArch64执行状态支持用64位寄存器存储虚拟地址(Virtual Address,VA),系统支持的物理地址长度最高达48位或52位。更多的地址位数可以让处理器支持的地址范围超出32位设备的4GB限制,让每个应用都可以拥有自身的超大存储器地址空间。使用更大的地址空间并使用64位指针将会减少在32位处理器上运行软件时必需的存储器写入和读回操作。

为了支持越来越复杂的软件算法,AArch64执行状态的通用寄存器的数量增加到31个,也即64位通用寄存器X0~X30。其中X30被当作过程链接寄存器(Procedure Link Register,PLR)。长度更长的整数寄存器使得操作64位数据的代码的运行效率更高。更大的寄存器池也能够显著提升系统性能,例如程序员在按照“ARM架构过程调用标准(ARM Architecture Procedure Call Standard,AAPCS)”执行函数调用时,如果必须传递多于四个寄存器的参数,可能不再需要使用堆栈。AArch64执行状态也提供了32个128位寄存器支持SIMD向量和标量浮点操作。

AArch64架构提供一个64位程序计数器PC(Program Counter)、若干堆栈指针SP(Stack Pointers)寄存器和若干异常链接寄存器ELR。

AArch64架构对程序状态寄存器的改进是定义了一组PSTATE(Process STATE,处理状态)参数,用于指示处理单元的当前状态。A64指令集中增加了直接操作PSTATE参数的指令。

2) AArch32执行状态

AArch32为32位执行状态,该状态支持A32和T32两种指令集。

AArch32执行状态提供13个32位通用寄存器和一个32位程序计数器PC、堆栈指针寄存器SP及链接寄存器LR。其中,LR寄存器同时被用作异常链接寄存器ELR和过程链接寄存器PLR。某些寄存器还配置了若干后备(Banked)实例,用于支持处理单元的不同模式。AArch32执行状态也提供了32个64位寄存器用于增强SIMD向量和标量浮点运算支持。

AArch32执行状态提供单一异常链接寄存器ELR,用于从Hyp模式异常返回。

在AArch32执行状态下,ARM同样定义了一组处理状态PSTATE参数用于保存处理单元的状态。A32和T32指令集中包含了直接操作各个PSTATE参数的指令,以及通过应用程序状态寄存器APSR(Application Program Status Register)和当前程序状态寄存器CPSR(Current Program Status Register)访问PSTATE参数的指令。

AArch32执行状态支持ARMv7-A基于处理单元模式的异常模型,并将该模型映射为基于异常等级的ARMv8异常模型。

AArch32执行状态支持32位虚地址。

在AArch64和AArch32这两种执行状态之间的相互转换被称为交互处理(Interprocessing)。处理单元只有在改变异常等级时才能转换执行状态,这与传统ARM处理器从ARM指令集转换到Thumb指令集的交互操作方式不同。这也意味着应用程序、操作系统内核以及虚拟机管理器(Hypervisor)等在不同异常等级执行的不同层次的软件可以在不同的执行状态执行。

ARMv8-A架构允许在不同层次等级支持AArch64和AArch32这两种执行状态。例如,某个ARMv8-A架构的实现可以只支持AArch64,或者在支持AArch64的同时支持在AArch32状态运行的操作系统或虚拟机,抑或在支持AArch64的同时在应用层(非特权状态)支持AArch32执行状态。

由于鲲鹏处理器是面向服务器市场的,而当前市场环境并没有特别需要保持32位应用兼容性的需求,故鲲鹏处理器内置的TaiShanV110处理器内核仅支持AArch64执行状态。本书只重点介绍AArch64执行状态。





2. ARMv8-A架构支持的指令集


ARMv8-A架构处理器可以使用的指令集依赖于其执行状态。

在AArch64执行状态下,ARMv8-A架构处理器只能使用A64指令集,该指令集的所有指令均为32位等长指令字。

在AArch32执行状态下,可以使用两种指令集:A32指令集对应ARMv7架构及其之前的ARM指令集,为32位等长指令字结构; T32指令集则对应ARMv7架构及其之前的Thumb/Thumb-2指令集,使用16位和32位可变长指令字结构。AArch32执行状态下的指令集状态决定处理单元当前执行的指令集。在ARMv8-A架构下,A32指令集和T32指令集均有扩展。

为了提升新增加的A64指令集的性能,ARMv8-A架构做了诸多改进。为了在指令字中给64位指令提供连续的位字段存放操作数和立即数,并且简化指令译码器的设计,A32指令集和A64指令集使用了不同的指令译码表。单独的指令译码表也便于实现更多更先进的分支预测技术。

作为精简指令集计算机(RISC)架构的代表,ARMv8-A架构当然不会放弃“精简”这一指导思想。新的A64指令集放弃了之前的ARMv7架构支持的多寄存器加载/存储(LoaD Multiple/STore Multiple,LDM/STM)指令,因为这类指令复杂度高,不利于设计高效的处理器存储系统。A64指令集也保留了更少的条件执行指令,同样是因为这类指令的实现复杂度高,且好处并不明显。因此,A64指令集的大部分指令都不再是条件执行指令。

此外,ARMv8-A架构将硬件浮点运算器设计为必需的部件,因而软件不需要检查浮点运算器是否可用。对软件而言,这保证了底层硬件的一致性。

ARMv8-A架构的指令集支持SIMD和标量浮点运算指令。SIMD数据引擎指令集是基本体系结构的一部分,并且为支持64位指令集而做了专门修订。SIMD指令引入了对双精度浮点数据处理的支持,以便更好地支持最新的IEEE754-2008标准的算法。

A64指令集从功能上与传统的A32指令集和T32指令集相似。其指令格式也