zoukankan      html  css  js  c++  java
  • 绑核与巨页

    1、核与巨页

      一个服务器通常有多个物理CPU,每个CPU又包含多个核,所以物理总核数=物理CPU*单个CPU的核数,每个核又可以包含几个(2个居多)超线程,逻辑总和数=物理总核数*超线程数,下面分别是某刀片的物理CPU数,每个cpu的核数,逻辑核。

    下面是CPU的内部基本架构,同一个核的超线程通过高速缓存L1 cache进行通信,不同的核通过L2 cache进行通信,BIU是总线接口单元,负责从内存指定区域取出指令传送到指令队列中排队并把指令执行的结果存入内存。

      每个刀片有多个物理CPU,也有多个内存块,系统进程通过虚拟地址访问内存,CPU把它转换程物理内存地址访问真正内存,为了提高这个转换效率,CPU会缓存最近的虚拟内存地址和物理内存地址的映射关系,内存都是以页的形式划分的,默认情况下每页是4K,物理内存很大时,映射表的条目将会非常多,会影响CPU的检索效率,为了减少映射表的条目,引入的巨页,如果在系统中使用了huge page,则内存页的数量会减少,从而需要更少的页表,节约了页表所占用的内存数量,并且所需的地址转换也减少了,TLBA Translation Lookaside Buffer)缓存失效的次数就减少了,从而提高了内存访问的性能。另外,由于地址转换所需的信息一般保存在CPU的缓存中,huge page的使用让地址转换信息减少,从而减少了CPU缓存的使用,减轻了CPU缓存的压力,让CPU缓存能更多地用于应用程序的数据缓存,也能够在整体上提升系统的性能。

    2、NUMA

      之前的时候,是采用SMPSymmetric Multi Processing)对称多处理器模型,这种模型多个CPU之间没有区别,平等地访问内存、外设、一个操作系统。操作系统管理着一个队列,每个处理器依次处理队列中的进程。如果两个处理器同时请求访问一个资源,由硬件、软件的锁机制去解决资源争用问题,这种模型在CPU数量增加时,系统性能提高的比例会递减,共享内存可能会导致内存访问冲突越来越厉害。

    基于这种原因,又引入了一个NUMANon-Uniform Memory Access)模型,NUMA就是将CPU的资源分开,以node为单位进行切割,每个node里有着独有的core mem等资源,比如一台机器是有2个处理器,有4个内存块。我们将1个处理器和两个内存块合起来,称为一个NUMA node,这样这个机器就会有两个NUMA node。在物理分布上,NUMA node的处理器和内存块的物理距离更小,因此访问也更快。比如这台机器会分左右两个处理器(cpu1, cpu2),在每个处理器两边放两个内存块(memory1.1, memory1.2, memory2.1,memory2.2),这样NUMA node1cpu1访问memory1.1memory1.2就比访问memory2.1memory2.2更快,但是NUMA的问题是2node之间的资源交互非常慢,所以即使有很多核,也不能划分很多歌node,否则效果反而不好。

    可以通过virsh命令查询节点信息,可以看到,该节点有48个逻辑核,配置了超线程,48和逻辑核,NUMA cell2说明有两个物理CPU

    通过virsh capabilities可以看到查到当前cpu的亲和性信息,cell 0即物理CPU 0memory是本numa node的内存,下面两个page代码默认页大小和数量,巨页的大小和数量,现在我们的巨页支持arge|small|any|2048|1048576这几种配置,distances代表,cpu访问其他cpu的距离,可以看到,本node间距离为10,跨node的距离为21cpus num=24说明这个cpu24和逻辑核,分别是0-11,24-35,其中siblings代表逻辑核的亲和关系,0,24亲和,1,25亲和。。。,如果VM使用具有亲和关系的核,性能会更高。

    执行numactl --hardware可以看到numa节点的信息,节点vcpu编号,内存,距离等。

    执行nova hypervisor-show 1可以看到具体的numa_topologycpu,亲和,已被绑核的cpu,占用的普通内存页,占用的巨页内存页等。

    找个虚机看一下:

     

    虚机核和物理核一一对应,是绑过核的,而且绑的都是带亲和关系的核,

     

    如果是未绑过核的,则是下面这样:

    可以用virsh vcpuinfo instance-00000003查看具体核对于的信息,发现所有的vcpu都分到了4cpu上,这样调度就会很慢,影响整体的性能

    绑核的命令为:

    virsh vcpupin (虚机实例名称virsh list) (虚机核id) (宿主机核id

    virsh vcpupin instance-***** 0 35

  • 相关阅读:
    c# 02-18 值类型 引用类型 字符串的不可变性 字符串的处理方法
    c#0218-命名空间
    c#学习0217
    BootStrap学习
    c#学习0216
    AngularJS学习
    java面试题之什么是死锁、活锁、饿死和竞态条件?
    java面试题之能创建volatile数组吗?
    java面试题之sleep()和wait()方法的区别
    java面试题之Thread的run()和start()方法有什么区别
  • 原文地址:https://www.cnblogs.com/small-office/p/9766536.html
Copyright © 2011-2022 走看看