性能优化调优 | 如何分配虚拟机CPU拓扑会得到较好的性能

文章转自:原创: 杨建旭,https://mp.weixin.qq.com/s/ZtwKmG3xCsTShJni6xTCmw


对于物理机来说,CPU有socket、Core、thread的概念,一个linux虚拟机上面同样有这些信息,这些信息是什么含义,和物理机之间有多少对应关系呢?如何分配CPU拓扑,会得到较好的性能?


物理CPU


首先介绍一下物理CPU的概念:


一个服务器可以有多个socket

一个socket(插槽)可以插一个chip。

一个chip里面可以有N个core(核)

一个核里面可以有1个CPU线程,如果开启超线程, CPU线程=核*2

下面是一个物理机的CPU信息



上面这些信息是x86
CPU。如果是Power的CPU,超线程可以一个核超出来2个、4个、8个(根据机器型号)。同时,还有一个drawer(抽屉)的概念。一个抽屉里面有N个socket,一个服务器可以有多个抽屉。


虚拟机的CPU


对于虚拟机来说,操作系统看到的CPU信息都是虚拟的,但操作系统认为他们是物理的。

查看虚拟机CPU的方法和物理机没什么区别,一般用lscpu或者cat
/proc/cpuinfo来查看

拿一台虚拟的linux举例



这个是linux操作系统看到的CPU信息,linux操作系统并不知道自己跑在一个虚拟机上,虽然看到的CPU都是虚拟的,但linux认为这些都是真的,因此在进程调度上,也会按照这个信息去调度。


CPU(s): 8   :一共8个逻辑CPU,即8个vCPU

Thread(s) per core:
1:每个核有几个线程,分配虚拟机的时候,拓扑默认就是1

Core(s) per socket:
1:每个插槽(一个插槽可以插一个cpu chip)里面有几个核,分配虚拟机的时候,拓扑默认就是1

Socket(s): 8:有几个插槽(一个插槽可以插一个cpu
chip)

这一段的信息是,该虚拟机一共有8个chip,每个chip里有1个核,每个核里有1个thread。这样就是8*1*1=8个thread,即8个逻辑CPU,即8个vCPU。

注:这里的socket、core都是虚的。

接下来,看cpuinfo里面的信息(和lscpu是一致的)



processor:
0 :虚拟CPU(vCPU)的ID,OS以为这是物理的,其实是虚拟的。这里的processor不是虚拟核,而是虚拟CPU线程。因为如果如果分配虚拟机的时候,虚拟核开启超线程(2),那么虚拟CPU线程=虚拟核*2

physical id: 0
:这个是虚拟socket(chip)的ID。在本例中,给虚拟机分配了8个sockets,那么physical id会有8个,分别是0-7.

siblings: 1
:一个虚拟socket上有多少虚拟CPU线程。如果=1,那么只有1个thread(processor)。说明这个socket上只有一个core,这个core里只有一个thread(processor)。

core id: 0
:这是虚拟core的id号,每个虚拟core可以有1个虚拟thread(processor),如果分配虚拟机的时候,虚拟核开启超线程(2),那么每个虚拟core可以有2个虚拟thread(processor)

cpu cores: 虚拟core的数量

收集全部cpuinfo的信息如下



CPU拓扑


即分配多少逻辑CPU,这些逻辑CPU是如何通过socket、core、超线程组合出来的。

分配虚拟机时,需要指定多少socket(插槽)、每个插槽有多少core,core有没有超线程。


不同的拓扑


同样是分配8个逻辑CPU,也可以采用其他的拓扑。

本例中,分配的方式我们再回顾一下

CPU(s):      
      8

Thread(s) per core:    1

Core(s) per socket:    1

Socket(s):    
      8

分配8个vCPU:该虚拟机一共有8个chip,每个chip里有1个核,每个核里有1个thread。这样就是8*1*1=8个thread,即8个vCPU。

换成拓扑B:

CPU(s):     
               8

Thread(s) per core:    2

Core(s) per socket:    4

Socket(s):      
           1

Cpuinfo对应的信息如下



换成拓扑C:

CPU(s):     
               8

Thread(s) per core:    1

Core(s) per socket:    8

Socket(s):      
           1

拓扑的排列组合还可以有很多其他方式。


不同的拓扑是否性能不同?


首先操作系统会看这个拓扑,在进程调度时为了保持亲和性,会优先把同一个进程调度到同一个core上,如果不能调度到同一个core,则尽量调度到同一个socket上。

虚拟化平台,也许也会倾向于把同一个虚拟core、虚拟socket调度到同一个物理core、物理socket上。至于具体到某个虚拟化平台(VMware、KVM、Hyper-V、Citrix)是怎么调度的,肯定是各有各的算法。

因此,如果想收获比较好的虚拟机性能表现,把虚拟机的CPU拓扑设置为和物理机一致,这样在亲和性保持上比较有利。如果不一致,就不利。

举一个不一致的例子。

物理机拓扑:2个sockets、每个socket有4个cores,每个core有一个thread。

虚拟机拓扑:1个sockets、每个socket有8个cores,每个core有一个thread。

在OS进程调度时,如果同一个进程不能调度到同一个虚拟core(名叫A)上,它会调度到同一个socket上其他core,OS一看拓扑,大家都在同一个socket,于是就随便调度到一个core(名叫F)。

而在物理机层面,这个8个虚拟core不可能调度到同一个socket(假设叫1)上,因为一个socket只有4个cores。结果,core(F)就被调度到Socket(名叫2)上了。

于是上下文切换的代价就明显增高。

阅读原文

原文地址:https://www.cnblogs.com/wyf0518/p/12107301.html

时间: 2024-11-04 15:45:38

性能优化调优 | 如何分配虚拟机CPU拓扑会得到较好的性能的相关文章

Java程序性能优化-调优层次

前言 前篇知道了性能优化相关概念,本篇就继续介绍如何调优.代码优化是我们最常见的,但是除此之外,还有软件架构上.JVM虚拟机层.数据库以及操作系统层面都可以通过各种手段进行调优,从而提升性能. 正题 优化的一般步骤: 如果我们的系统出现了问题,那么最主要的就是要查找并解决性能瓶颈问题,同时性能优化可能对原有的实现进行较大的改动,因此一定要测试打到目标之后才结束. 1.设计调优:设计阶段 一个良好的系统设计可以规避很多潜在的性能问题.因此,尽可能多花些时间在系统设计上,是创建高性能程序的关键. 我

nginx性能优化调优之google-perftools

什么是google-perftools?google-perftools是google公司开发的一款针对 C/C++ 程序的性能分析开源工具,使用该工具可以对 CPU 时间片.内存等系统资源的分配和使用进行分析google-perftools包含四个工具,分别是:TCMalloc.heap-checker.heap-profiler和cpu-profiler,其中我们本次需要的一个工具TCMalloc是google-perftools的其中一个工具,用于优化内存分配的效率和速度,帮助在高并发的情

深入理解Java虚拟机(jvm性能调优+内存模型+虚拟机原理)视频教程

14套java精品高级架构课,缓存架构,深入Jvm虚拟机,全文检索Elasticsearch,Dubbo分布式Restful 服务,并发原理编程,SpringBoot,SpringCloud,RocketMQ中间件,Mysql分布式集群,服务架构,运 维架构视频教程 14套精品课程介绍: 1.14套精 品是最新整理的课程,都是当下最火的技术,最火的课程,也是全网课程的精品: 2.14套资 源包含:全套完整高清视频.完整源码.配套文档: 3.知识也 是需要投资的,有投入才会有产出(保证投入产出比是

mysql性能基本调优

innodb_buffer_pool_size 80%(系统缓存池) innodb_log_file_size    4G (mysql5.5中限定的最大数值,redo日志增大提高性能,redo日志小崩溃后恢复更快) \\开始将这个值设置为512M可以拥有1G的的redo日志,会使得拥有充裕的写操作空间 max_connections 151(默认值,需要修改) innodb_file_per_table OFF(默认将所有表的数据和索引存放在共享表空间,值为ON时会为每张表建立一个.ibd文件

linux内核参数优化调优

TCP/IP及内核参数优化调优 Linux下TCP/IP及内核参数优化有多种方式,参数配置得当可以大大提高系统的性能,也可以根据特定场景进行专门的优化,如TIME_WAIT过高,DDOS攻击等等.如下配置是写在sysctl.conf中,可使用sysctl -p生效,相关参数仅供参考,具体数值还需要根据机器性能,应用场景等实际情况来做更细微调整. net.core.netdev_max_backlog = 400000#该参数决定了,网络设备接收数据包的速率比内核处理这些包的速率快时,允许送到队列

《linux性能及调优指南》 3.5 网络瓶颈

3.5 Network bottlenecks A performance problem in the network subsystem can be the cause of many problems, such as a kernel panic. To analyze these anomalies to detect network bottlenecks, each Linux distribution includes traffic analyzers. 网络子系统的性能问题

《Linux 性能及调优指南》写在后面的话

感谢飞哥的翻译. 目前飞哥 (http://hi.baidu.com/imlidapeng)的网址已经不能访问了. <Linux 性能及调优指南>这本书的原文地址:http://www.redbooks.ibm.com/abstracts/redp4285.html也不能访问了. 在此更新https://lenovopress.com/redp4285.pdf 我在网上只查到飞哥翻译了1,2,3章,第四章还未翻译.如果最近工作时间允许的话,我在翻译完smb.conf之后可以看看本书第四章!!

linux系统调优之IO、cpu

首先先要再次强调一个概念:系统调优的目的不是怎样去吧那一部分做的特别优化.而是整体的全局的考虑.性能优化是为了找到系统的瓶颈并且想办法提高瓶颈最好能够去除.(个人认为万事皆有利弊,在计算机的世界里同样如此所以完美是不现实的..) 调优的终极目标是为了让计算机个各个子系统达到一种平衡状态.. 子系统:cpu  memory  Io network 此处不多赘述.. 下来首先来解决io的优化,其实这个优化就是由内核控制选择一种相对较好的io策略对应您的实际环境. 下面给出我们IO调度在系统调用中的位

linux性能查看调优

一 linux服务器性能查看1.1 cpu性能查看1.查看物理cpu个数:cat /proc/cpuinfo |grep "physical id"|sort|uniq|wc -l2.查看每个物理cpu中的core个数:cat /proc/cpuinfo |grep "cpu cores"|wc -l3.逻辑cpu的个数:cat /proc/cpuinfo |grep "processor"|wc -l物理cpu个数*核数=逻辑cpu个数(不支持