虚拟化,简单来说就是把一台服务器/PC电脑,虚拟成多台独立的虚拟机,每台虚拟机之间相互隔离,每个虚拟机都有自己独立的操作系统,磁盘,网络资源。虚拟化是一个很庞大的系统,我的介绍主要是帮助你入门,让你了解基本技术原理,具备搭建操作虚拟化的能力。
我们上一小节讲了绑定核心,来提高cpu的性能。但是cpu性能其实不仅仅只涉及到cpu,实际上内存也是很重要的因素。目前最新的技术是numa,下面这个图是为了方便理解改造过的。
竖线中间代表代表2个楼层(2个物理cpu)。
服务员则代表物理cpu的核心。
房间则代表不同的内存。
为了简单理解我这里以酒店的服务员和房间服务关系来理解这个图。我这个酒店有2个层楼(2个物理cpu),每层楼有6个服务员(6个核心);每层楼有n个房间(n个内存条)。
如果一楼的服务员只给一楼房间服务,它的效率会比较高。但是如果它要去二楼的房间服务,则会乘坐电梯(上下文切换),则效率会降低。反之二楼的服务员如果要给一楼的房间服务也是同样的道理。
所以如果要加快效率,则尽量避免这样的交叉服务,尽量让服务员只服务自己楼层的房间,这个就是所谓的numa技术。
NUMA(Non-Uniform Memory Access,非统一内存访问)是一种计算机内存设计,用于多处理器系统中。在NUMA架构下,每个处理器或一组处理器都有本地内存直接连接到它们,同时也可以访问系统中其他处理器的内存。然而,访问远程内存的速度比访问本地内存要慢,因此称为“非统一”。
这种设计的主要目的是解决随着处理器数量增加而带来的扩展性问题。传统的对称多处理系统(SMP)中,所有处理器共享同一块物理内存,当处理器数量增加时,内存带宽成为瓶颈,影响系统的性能。
NUMA的特点包括:
本地内存访问更快:每个处理器可以快速访问自己的本地内存。
可扩展性更强:通过将处理器及其相关内存组织成节点,可以更容易地扩展系统以支持更多的处理器。
负载均衡:操作系统可以根据各个处理器与内存的距离来优化任务调度和数据放置,从而提高效率。
此图来源于互联网
查看numa信息
#这个是单个cpu
[root@localhost ~]# lscpu |grep NUMA
NUMA node(s): 1
NUMA node0 CPU(s): 0-15
#也可以使用这个命令查看
numactl --hardware
available: 1 nodes (0)
node 0 cpus: 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15
node 0 size: 28593 MB
node 0 free: 23818 MB
如果要使kvm虚拟机利用到这个numa特性,则可以参考下面的配置。
<memory unit='GiB'>16</memory>
<vcpu placement='static'>4</vcpu>
<numatune>
<memory mode='strict' nodeset='0'/>
</numatune>
<cputune>
<vcpupin vcpu='0' cpuset='0'/>
<vcpupin vcpu='1' cpuset='1'/>
<vcpupin vcpu='2' cpuset='2'/>
<vcpupin vcpu='3' cpuset='3'/>
</cputune>
<cpu mode='host-passthrough'>
<numa>
<cell id='0' cpus='0-3' memory='16384' unit='MiB'/>
</numa>
</cpu>