KVMのCPU最適化のパフォーマンスの最適化

序文

 

シーンに応じて、任意のプラットフォームは、対応する最適化されています。それが効果を使い果たしていない同じハードウェア環境、ネットワーク環境、同じプラットフォームは、確かに同じではありません。フェラーリのように、私はスピードと情熱は確かに違う、高速道路上の村の通りに戻って走りました...

だから、我々としても、運用、保守作業を行います。まず、あなたは完全にあなたが使用するソフトウェアプラットフォームを理解し、そして完全にテストし、最終的に結果に、既存の本番環境に基づいて、最良の調整を行う必要があります。

KVMは行うには同じ、最初に完全にそれを理解し、我々は最高のパフォーマンスを達成するために、最終的なアプリケーションをパラメータを設定し、調整を行うことができます参照してくださいすることです。

CPU、メモリ、ディスクIO、ネットワーク - だから、KVMのパフォーマンスチューニングは、我々は4つの側面から開始することができます。

 

KVM CPUのパフォーマンスチューニング

 

 このCPUの私たちの作品は、NUMA用に調整され、NUMAは、それは何ですか?NUMAは、ソリューションを解決するために一緒にマルチCPUの仕事である非一様メモリアクセスを意味し、略語不均等メモリアクセスアーキテクチャです。私たちは今、サーバの設定を知っている比較的高く、CPUの稼働率が高くない場合、多くはマルチチャンネル、マルチコアCPUで、CPUは、過去の時代のメモリとデータを交換する必要がある、とされているシングルCPUモードその後、CPUにメモリ内のデータを配置することは、これは完全にペースを維持されて計算されます。しかし、今のCPU速度が大幅に増加し、それらはすべて、マルチCPUモードなので、それがアンバランスだった、つまり、メモリ内のデータCPU完全に不十分な消化するように、と複数のメモリは、CPUのスナッチを表示します。..このケースではCPU性能が...非常に空腹ではない十分なデータを享受することはなく、十分なメモリを割り当てました。

だから、コンピュータ科学者は、コンピュータのパフォーマンスを改善するために、慎重にCPUやメモリ内の対話モード間の調整を検討しました。全体的なアイデアは、複数のメモリからのより多くのデータを「楽しむ」ことができますCPUを最大化する方法を、マルチコアCPUのモードを見つけることです。

だから私は、次のソリューションセットを考案しました。

1.1 SMPの技術

SMP技術から出発して、SMP(対称型マルチプロセッシング)技術は、対称型マルチプロセッシングアーキテクチャで、この構造の最も重要な機能は、バス、メモリ、IOシステムとして、すべてのCPUリソースによって共有されています。

それは、各CPU間の平等の関係であるので、これらのCPUのオペレーティングシステムは、(通常は管理するキューの形で)リソースへのアクセスを管理し、すべての共有リソースであるからです。キューのプロセスに対処するために、各CPUには、2つのCPUならば同時に、真実でスレッドセーフロック機構で開発されたこのコンセプトは同じですが、その後、一般的にはソフトウェアロックのメカニズムを通じて競争の問題を解決することで、ソフトウェアのロックにアクセスときのプロセスとCPUの処理は、通常、ロックされて処理され、その後解放されます。

だからここでは対称性を意味し、ここで、来るリソースが等しいアクセスからメインCPUの間には平等ではありません。私たちは、以下の絵を見ることができます:

これは、プログラムの初期の構造であるが、その欠点は、すぐにその拡張が強くないことが明らかになることは、早いためです。明らかに、サーバーのCPUは、(メモリの状況を最大時)の性能向上、そしてメモリを強化する場合は、明らかに十分ではないことを感じた上で、それは共有モード、複数のCPUがあるので、私たちは、この絵を見て、多くの人は、メモリデータを食べます増加したCPUメモリのデータを楽しむことが...そんなにない、それはこのようにCPUの無駄を引き起こし、停止します。

実験データは、SMPサーバーのCPUの種類は、好ましくはOKに2-4星であることを示し、過剰が無駄になります。

 

したがって、このアプローチには欠陥があります。したがって、科学者はプログラムの他の構成を考えている、それはNUMAです。

 

1.2 NUMA技术

私達はちょうど目の前に不均一メモリアクセス手段を述べているNUMAは、それはSMPの拡張の問題に良い解決策を表示されます。NUMAの技術を使用すると、サーバーのCPUの中に数十あるいは組み合わせの数百を置くことができるようにします。

NUMAアーキテクチャの設計:

 

我々は、各CPUモジュールは数平均チップ(これ以上4以下)に分割されている間、それは、CPUの相互接続であり、インターネットと情報インタラクションモジュールを介して接続されているCPUモジュールのそれぞれの間、図面から求め、各チップは、独自のメモリ・コントローラとメモリ・スロットを有しています。

NUMAノードでは3つの概念があります。

  1. ローカル・ノード:すべてのノードのCPUは、このノードは、ローカル・ノードと呼ばれます。

  2. 隣人:ローカル・ノードと呼ばれる隣人に隣接。

  3. リモートノード:非ローカルノードまたはノードの隣接ノードは、リモートノードと呼ばれます。

隣接ノードとリモートノードは、(ノードオフ)非ローカルノードと呼ばれます。

这里要注意的是,CPU访问不同类型节点内存的速度是不相同的,访问本地节点的速度最快,访问远端节点的速度最慢,即访问速度与节点的距离有关,距离越远访问速度越慢,此距离称作Node Distance。正是因为有这个特点,所以我们的应用程序要尽量的减少不通CPU模块之间的交互,也就是说,如果你的应用程序能有方法固定在一个CPU模块里,那么你的应用的性能将会有很大的提升。

访问速度:本地节点>邻居节点>远端节点

 

因此KVM也是一样,我们在CPU优化这块就是要让KVM绑定在指定的CPU上,这样减少跨CPU的交互使用,让KVM的性能提升。现在我们的服务器还有linux操作系统都是默认走NUMA模式,所以我们接下来说说如何去做CPU的绑定。

那么具体如何操作?

1.3 numactl 命令讲解

我们这里用一台真实的物理机演示,这台物理机的是IBM 3650M4。

首先我们用numactl命令查看NUMA的情况,如果你系统没有这个命令,用 yum install numactl 安装下即可。

 

# numactl --h      numactl 帮助命令,主要参数如下:
 --interleave=nodes, -i nodes      这个选项用于设定内存的交织分配模式。

也就是说系统在为多个节点分配内存空间的时候,将会以轮询分发的方式被分配给这

多个节点。如果在当前众多的交织分配内存节点中的目标节点无法正确的分配内存空

间的话,内存空间将会由其他的节点来分配。多节点可以通过 --interleave ,

--membind 和 --cpunodebind 命令来指定。

 --membind=nodes, -m nodes     选项 '--membind' 仅用来从节点中分配内存

空间所用。 如果在这些节点中无法分配出所请求的空间大小的话该分配操作将会失败.

上述命令中指定需要分配空间的 nodes 的方式可以遵照上述 N,N,N , N-N ,N 这

种方式来指定.

 --cpunodebind=nodes, -N nodes     这命令仅用于施加在运行与 cpu 上的进程。

这个命令用于显示 cpu 的个数,cpu 数目信息同样记录在系统中的存放处理器领域

信息的 /proc/cpuinfo 文件夹下,或者是按照关联的中央处理器信息 在当前的中

央处理器集中所存放。

  --localalloc, -l     这个命令选项通常是为当前的节点分配内存的。
 --preferred=node      该命令由于指定优先分配内存空间的节点,如果无法将

空间分配给该节点的话,应该分配给该节点上的空间将会被分发到其他的节点上 。

该命令选项后面仅接收一个单独的节点标号.  相关的表示方式也可以使用。

  --show, -s      该命令用于显示 NUMA 机制作用在当前运行的那些进程上。
  --hardware, -H      该命令用于显示当前系统中有多少个可用的节点。
 --huge     当创建一个基于大内存页面的系统级的共享内存段的时候使用--huge 这个选项,

注意这选项仅在 --shmid 或是 --shm 命令的后面使用才有效。

 --offset    该参数选项用于指定共享内存段中的位移量的偏移。 默认的情况下

偏移量是 0 。 有效的偏移量单位是 m (用于表示 MB)  g (用于表示 GB) , k (用于表示 KB ),

其他没有指定的被认为是以字节为单位。

 --strict    这个参数选项 当施加了 NUMA 调度机制的共享内存段区域的页面被

施加了另一个机制而导致错误的时候,使用 --strict 选项将会把错误信息显示出来.

默认情况是不使用该选项的。

 --shmmode shmmode    该选项仅在 --shmid 或是 --shm 之前使用才会生效。

当创建一个共享内存段的时候,通过整型数值来指定共享内存的共享的模式类型。

 --shmid id     通过ID 号码来创建或使用一个共享内存段。(如果共享内存段已经

存在,那么通过 shmid 来指定下面要使用某个 ID 的共享内存段;

如果该 ID 对应的共享内存段并不存在的话,那么就创建一个)。

 --shm shmkeyfile     通过存放在 shmkeyfile(共享内存-键文件)

中的 ID 号码来创建或者是使用一个共享内存段。访问 shmkeyfile 文件的进程是

通过 fork(3 arguments) 方法来实现的。

 --file tmpfsfile     将 numa 机制施加于文件上面, 这个文件属于 tmpfs

或者是 hugetlbfs 这种特殊的文件系统。

 --touch      通过将 numa 机制施加于刚刚页面上来实现内存的早期 numa 化。

默认情况下是不使用该选项,如果存在映射或是访问页面的应用的话,将会使用该早

期实行 NUMA 机制的这种方法。

  --dump    该选项用于废除将已经 numa 化的特定区域上的 NUMA性质.
 --dump-nodes      nodes 所指定的节点以外的所有节点上的 NUMA 特性全都会

被移除

  all  用于将所有的节点上的 NUMA 特性移除
  number  通过指定 node 后接的数值来废除该数字对应的 node 
 number1(number2)  node number1(node number2)上的 NUMA 特性将会被移除

 number1-number2    node number1 -- node number2 区间上的所有存在的 node

的 NUMA 特性将会被移除

 !nodes                除了 nodes 所指定的节点以外的所有节点上的 NUMA 特性

全都会被移除

 

OK,以上是numactl的详细命令,那么接下来我们先看看当前服务器CPU的numa情况:

我们执行lscpu命令可以查看到一些CPU信息:

 

我们用numactl --hardware可以查看,如这里我准备了两台IBM的服务器,一个3650M4另外一个是3850M2。

我们可以从命令返回的情况看出,这台服务器numa有2个node(node0和node1):

 我们再看另外一个服务器,这是一台IBM 3850M2,那么它就只有一个node:

        

 

通过这个numactl --hardware命令,我们可以看出上面那台机器每个node有81894 MB的内存可以使用(大概79G),而IBM 3850M2这个服务器node有131070MB(120多G)内存可用(基本上是整个服务器的内存)

那么接下来我们可以看下cpu numa的调度分配情况:

我们运行numastat命令可以查到:

   

3650M4

   

  

3850M2

 

参数解释:

  • numa_hit 使用本节点内存次数

  • num_miss  计划使用本节点内存而被调度到其他节点次数

  • num_foregin  计划使用其他节点内存而使用本地内存次数

  • interleave_hit  交叉分配使用的内存中使用本节点的内存次数

  • local_node  在本节点运行的程序使用本节点内存次数

  • NB other_node  在其他节点运行的程序使用本节点内存次数

   

接着我们看下这个命令:numastat -c  , 这个命令c 后面跟上进程名就能看到相关进程的NUMA内存使用情况。比如:numastat -c qemu-kvm,这样我们就知道了qemu-kvm这个进程,它在node0 和node1上使用的内存大小,单位是MB:

 

  

OK 通过这几个命令我们可以查看一些numa的基本状态和使用情况。那么针对CPU Numa技术,linux操作系统本身呢也有自身对这块的设计。拿linux来说,它默认使用的就是NUMA自动平衡策略,也就是说,系统会自动的调配numa的内存使用,以求一个平衡。

当然,这个设置是可以用户自己控制的,如果我们想关闭,直接运行 

     # echo 0 > /proc/sys/kernel/numa_balancing    即可

     # echo 1 > /proc/sys/kernel/numa_balancing    就是开启

1.4 CPU绑定操作

说到这,既然我们的操作系统还有CPU特性都采用了NUMA架构,那么我们完全可以通过调整KVM对应的NUMA关系来达到KVM CPU这方面的优化。这里,我们一般是通过CPU绑定的方法来做相关操作的。

那么具体的操作是怎么样的呢?那么接下来我们通过一个例子来演示。这里是一台物理机,之前我们看过了,现在上面装好了KVM,然后运行着几个虚拟机,我们用 virsh list 命令可以查看到当前运行的虚拟机列表。

 

 

比如我们要看这个Win7-ent虚拟机里vCPU对应物理CPU的情况,那么可以运行:

   # virsh vcpuinfo Win7-ent  可以查看

     

 

这个虚拟机是2个vCPU 双核的,然后都是跑在了物理机的CPU8上,使用的时间是2964.6s。最后一个是CPU的亲和性,这个yyyyy 表示的是使用的物理CPU内部的逻辑核,一个y就代表其中一个CPU逻辑核。全部是y ,那么说明这台物理机的24个CPU核,这个CPU都能调度使用。

当然,我们可以进入vrish ,然后运行emulatorpin Win7-ent, 通过这个命令我们可以更详细的得到这个虚拟机可以用哪几个核:

 

我们可以看到目前这个虚拟机0-23的CPU它都能调度使用

那么以上就是查看虚拟机CPU NUMA调度的信息,如果我们要把虚拟机绑定到固定的CPU上,我们就要做以下操作: # virsh emulatorpin Win7-ent 18-23 --live   通过这个命令,我们把这个win7的虚拟机vCPU绑定在了18-23这6个CPU之间的核上。

我们用命令查看下 emulatorpin Win7-ent

 

我们也可以用virsh dumpxml Win7-ent 查看确认:

 

这是让虚拟机里的vCPU一起绑定的方法。

那么有的人会疑问,一个虚拟机我有两个vCPU, 比如这个win7 ,它就是双核的,我想让里面的vCPU1和vCPU2分别绑定在不同的物理CPU上可以吗?怎么操作呢?这也是可以的,我们通过下面的方法可以进行相关的vCPU分别绑定

    # virsh vcpupin Win7-ent 0 22

    # virsh vcpupin Win7-ent 1 23

    # virsh dumpxml Win7-ent

 

 

   # virsh vcpuinfo Win7-ent

     

 

 

 

OK,这里要注意的是,你把虚拟机用reboot重启,这个绑定配置还是生效的,但是你shutdown的话,CPU绑定的效果会失效。我们要让VM关机然后起来也生效,就必须把参数写入到虚拟机的XML里,然后保存,这样关机了也不会失效,这里要注意下

   # virsh edit vm1
   wq!
   添加:
   <cputune>
      <vcpupin vcpu='0' cpuset='22'/>
      <vcpupin vcpu='1' cpuset='23'/>
   </cputune>

     

 

 

OK,以上就是CPU绑定技术的操作。通过这样的操作,我们可以在一台多CPU的物理机上固定几个CPU给虚拟机用。当然,至于为什么可以这样做,前面我们提到了关于NUMA的原理,如果固定了虚拟机的CPU,那么它就不会去找远端节点了,另外就是有些场景下,一物理机多个CPU,如果前面几个CPU负载很高,利用率大,后面几个CPU利用率低,那么我们可以协调下,做CPU的绑定,平衡下CPU的负载。

以上是CPU的绑定,接下来我们讲讲CPU的热添加。

 

1.5 CPU 热添加

首先我们先了解下什么叫热添加,热添加就是在虚拟机运行不关机的情况下,做CPU的添加操作。那么要注意的是,这个热添加是在Redhat7.0以后才出现的,之前是没有的。所以要享用这功能那必须要求KVM宿主机和虚拟机都得在7.0版本以后。那么具体怎么操作我们通过一个演示给大家操作下。

比如目前这个虚拟机,这是一个CentOS7.1的。我们先看下目前虚拟机的CPU的数值,我们可以进系统查看,cat /proc/cpuinfo| grep "processor"| uniq| wc -l ,我们看到当前是2个CPU: 

 

然后我们解释下这个最大CPU分配数是怎么个意思,它的意思就是给这个虚拟机最大预留的CPU个数,这个设置很重要,如果你想给虚拟机热添加,那么这个设置必须写。比如我们这里写的4,那么我们可以给虚拟机最大热添加到4个CPU,而且4是上限。

那么接下来说下,具体怎么热添加。我们先在宿主机里先给这个虚拟机添加第三个CPU,原来是2个,现在再添加一个变成3个: setvcpus VM3_CentOS7.1 3 --live

然后我们到虚拟机里面把这个CPU激活 :

echo 1 >/sys/devices/system/cpu/cpu2/online

 

我们再运行查看,发现已经变成3个了。

如果要减少,那么只能在虚拟机里减少刚才的CPU

    # echo 0 >/sys/devices/system/cpu/cpu2/online

 

但是在宿主机层面看这个虚拟机的vCPU数还是3个,也就是说不支持热减少,我们运行vcpuinfo VM3_CentOS7.1命令发现还是3个:

 

 

同理,Windows的添加也是如此,直接在宿主机里添加第三个CPU即可

    # setvcpus VM4_Win2008 3 --live

然后虚拟机里不用操作,它会自动刷新成3个CPU,我们也可以一个windows虚拟机做相关的演示,具体的可以由读者自己操作了。

到这为止, 以上就是KVM CPU方面的优化。总结起来就两点,一个是CPU绑定,还有一个就是热添加。

CPU绑定首先得了解NUMA技术,然后站在整个宿主机CPU资源的层面去调节。

热添加,当你某个虚拟机正在运行,然后突然业务压力增大了,可以通过这方法达到0停机提升虚拟机CPU性能。

参考链接:

https://mp.weixin.qq.com/s?__biz=MzU0NDEyODkzMQ==&mid=2247494800&amp;idx=1&amp;sn=f8b280b15b3e13ec72afa940da60ed29&source=41#wechat_redirect

http://www.cnblogs.com/yubo/archive/2010/04/23/1718810.html

http://cenalulu.github.io/linux/numa/

 

おすすめ

転載: www.cnblogs.com/kcxg/p/11095519.html