数据库选型:多核还是多线程?

数据库选型,是用多核主机还是多线程主机?我是否可以用比较便宜的单核超线程(Hyper-Threading,HT)的机器,来替代双核非HT的机器?

回答这个问题,我们由浅入深的来看。

一,术语:

槽位(socket):指机器上可以容纳物理CPU个数的空间。一般也成为多少多少“路”,英文除了socket,也成processors。

核(core):指一个CPU中,包含若干个独立组成部分。

指令(Instruction):一个指令包含如下步骤:指令预取(IF),指令解码(ID),执行(EX),内存访问(MEM),寄存器写回(WB) 注,读取寄存器是在ID阶段。

指令流水线(Instruction pipelining):由于指令被切割成上面5部分,那么通过(以类似流水线的方式)同时执行不同指令的不同部分,来提高吞吐量。

为什么能提高吞吐量,我们打个比方:麦当劳买汉堡,要经过点餐(1分钟),做汉堡(3分钟),做薯条(2分钟),包装(1分钟),送餐(1分钟)。

(1)那么如果非流水线模式,顾客A需要等1+3+2+1+1=8分钟,如果顾客B是和顾客A一起到的,那么他需要等顾客A完成之后,再继续等8分钟。所以如果同时有N个顾客,顾客N需要等的时间是8N分钟。

(2)如果是采用流水线模式,顾客A点完餐,开始做汉堡的时候,此时点餐的服务员开始服务顾客B,那么顾客B需要等待11分钟。 如果同时有N个顾客,那么顾客N需要等的时间是1+3N+2+1+1=5+3N分钟。

由此可见流水线模式提高了效率,或者说吞吐量。可以在单位时间内服务更多的用户。HT模式下,只是将原来的CPU寄存器分成了2个,从这个角度上提高了吞吐量

但是由于其他如L1,L2等等都是共享的,因此还是会存在竞争。那么,指令的5个步骤,比作麦当劳买汉堡的5个步骤,也是类似的。

时钟频率(clock rate):每个CPU指令可能花费一个或者多个时钟周期,如5Ghz表示CPU每秒运行50亿个时钟周期。注:更快的时钟频率并不一定高性能,它取决于快速周期中到底做什么。如果他们大部分时间是停滞等待内存访问,那么更快的执行实际并不能提高CPU指令的执行效率或者吞吐量。

CPU内存缓存:

注1:HT CPU的寄存器(Register)独立,但是L1和L2缓存都是共享的。另外,负责运算的ALU(负责整形运算),FPU(负责浮点运算),以及MMU和TLB也都是共享的。

注2:多核CPU,L1缓存独立,但是共享L2缓存。(2012年前,L3缓存是外置的,没有集成在芯片内)

注3:L1和L2之间有MMU和TLB

分页内存管理单元(MMU,memory management unit):负责虚拟地址和物理地址的转换,

TLB(Translation Lookaside Buffer):维基上叫转译后备缓冲器或者页表缓存,你可以理解成这是页表的buffer

调度器(Scheduler):将CPU分配给线程的kernel程序。

上下文切换(context switch):多个进程分享CPU资源的一种方式。

注意其实最后的2个概念是kernel了,而不是CPU硬件了。

CPU这些组件存在的意义

  • 1.在单核计算机里,有一个资源是无法被多个程序并行使用的:CPU。 没有操作系统的情况下,一个程序一直独占着全都CPU。 如果要有两个任务来共享同一个CPU,程序员就需要仔细地为程序安排好运行计划–某时刻cpu和由程序A来独享,下一时刻cpu由程序B来独享 而这种安排计划后来成为OS的核心组件,被单独名命为“scheduler”,即“调度器”,它关心的只是怎样把单个CPU的运行拆分成一段一段的“运行片”,轮流分给不同的程序去使用,而在宏观上,因为分配切换的速度极快,就制造出多程序并行在一个CPU上的假象。
  • 2.在单核计算机里,有一个资源可以被多个程序共用,然而会引出麻烦:内存。 在一个只有调度器,没有内存管理组件的操作系统上,程序员需要手工为每个程序安排运行的空间 — 程序A使用物理地址0x00-0xff,程序B使用物理地址0x100-0x1ff,等等。 然而这样做有个很大的问题:每个程序都要协调商量好怎样使用同一个内存上的不同空间,软件系统和硬件系统千差万别,使这种定制的方案没有可行性。 为了解决这个麻烦,计算机系统引入了“虚拟地址”的概念,从三方面入手来做: 2.1、硬件上,CPU增加了一个专门的模块叫MMU,负责转换虚拟地址和物理地址。 2.2、操作系统上,操作系统增加了另一个核心组件:memory management,即内存管理模块,它管理物理内存、虚拟内存相关的一系列事务。 2.3、应用程序上,发明了一个叫做“进程”的模型,(注意)每个进程都用“完全一样的”虚拟地址空间,然而经由操作系统和硬件MMU协作,映射到不同的物理地址空间上。不同的“进程”,都有各自独立的物理内存空间,不用一些特殊手段,是无法访问别的进程的物理内存的。
  • 3.现在,不同的应用程序,可以不关心底层的物理内存分配,也不关心CPU的协调共享了。然而还有一个问题存在:有一些程序,想要共享CPU,并且还要共享同样的物理内存,这时候,一个叫“线程”的模型就出现了,它们被包裹在进程里面,在调度器的管理下共享CPU,拥有同样的虚拟地址空间,同时也共享同一个物理地址空间,然而,它们无法越过包裹自己的进程,去访问别一个进程的物理地址空间。
  • 4.进程之间怎样共享同一个物理地址空间呢?不同的系统方法各异,符合posix规范的操作系统都提供了一个接口,叫mmap,可以把一个物理地址空间映射到不同的进程中,由不同的进程来共享。

三、相关

1. NUMA架构。注意这是针对多socket来讲的,不是针对多core或者多线程。 2. 关于MMU和TLB,当内存较多时,TLB无关管理太多的物理内存页面,此时就引入了大页(Huge Page)。因此对于使用较多内存的数据库(如32G以上),建议开启HugePage,但是要注意关闭透明大页(Transparent HugePage)。另外,注意12c的pre_page_sga内部算法已经改变,可以使用pre_page_sga。 3. 关于CPU调度时,进程优先级的问题,对于高写入的oracle数据库,建议将lgwr放在”_high_priority_processes”. 4. 对于单核HT的CPU,只是独立的寄存器,而L1,L2等组件,还是共享,肯定会在这一层存在争用。 5. 对于多core的CPU,寄存器和L1独立,L2以下部分共享。由于总线(BUS)是共享的,所以总线带宽肯定会有瓶颈。 6. 对于多socket的CPU,一个多几个socket的CPU可以组成一个numa node,需要注意memory remote调用的问题。 7. 单核HT的CPU不应该和双核非HT的CPU比较,应该是和单核非HT的CPU比较,根据intel自己的介绍,使用HT比非HT快15%~30%左右, 而不是理想中的翻倍,而且,这应该还是在没有争用的情况下。

原文发布于微信公众号 - 数据和云(OraNews)

原文发表时间:2017-05-25

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏数据和云

实战演练:洞若观火--治堵之道在清源

堵塞往往是一件可怕的事情,交通堵塞让人心烦意乱,水道堵塞城市就会臭气冲天,言路堵塞则是非难辨。数据库出现会话堵塞,则很可能造成系统业务中断,这对于 DBA 来说...

945
来自专栏Golang语言社区

Go 语言构建高并发分布式系统实践

你知道互联网最抢手的技术人才有哪些吗?最新互联网职场生态报告显示,最抢手的十大互联网技术人才排名中Go语言开发人员位居第三,从中不难见得,Go语言的渗透率越来越...

2924
来自专栏架构师之路

1分钟了解Leader-Follower线程模型

上图就是L/F多线程模型的状态变迁图,共6个关键点: (1)线程有3种状态:领导leading,处理processing,追随following (2)假设共N...

3445
来自专栏数据和云

性能优化:MySQL 性能提升之降龙十八掌

作者 | 张甦, 数据库领域的专家和知名人士、图书《MySQL王者晋级之路》作者,51CTO 专家博主。近10年互联网线上处理及培训经验,专注于 MySQL 数...

1303
来自专栏云技术

性能超前,详解腾讯云新一代Redis缓存数据库

当前内存数据库发展迅速,用户对于存储系统的要求也越来越高,为了满足各类业务场景的需要,腾讯云设计了新一代的内存数据库,不但保留了原来系统的高性能,高可用等特性,...

50216
来自专栏吴生的专栏

消息中间件选型分析——从Kafka与RabbitMQ的对比来看全局

消息队列中间件(简称消息中间件)是指利用高效可靠的消息传递机制进行与平台无关的数据交流,并基于数据通信来进行分布式系统的集成。通过提供消息传递和消息排队模型,它...

4117
来自专栏Golang语言社区

网络服务器并发编程的几种方案对比

工作几年来,历经多种编程语言进行服务器端的开发,对几种方案优劣对比整理如下: 一 多进程 优势:1 具有很好的可靠性,其中一个进程挂掉后,系统在整体上仍...

32510
来自专栏数据和云

实战课堂:一则CPU 100%的故障分析处理知识和警示

编辑手记:在现实的生产环境中,DBA可能遭遇到各种各样的异常,或简单、或复杂,但是无一不考验DBA的经验和能力,在『实战课堂』栏目中,我们将整理和分享来自云和恩...

993
来自专栏Golang语言社区

Go 语言构建高并发分布式系统实践

你知道互联网最抢手的技术人才有哪些吗?最新互联网职场生态报告显示,最抢手的十大互联网技术人才排名中Go语言开发人员位居第三,从中不难见得,Go语言的渗透率越来越...

4815
来自专栏Java3y

操作系统第一篇【引论】

1596

扫描关注云+社区