数据库选型,是用多核主机还是多线程主机?我是否可以用比较便宜的单核超线程(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. 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%左右, 而不是理想中的翻倍,而且,这应该还是在没有争用的情况下。