物理机配置
型号 | 配置 |
华为 RH2288H V3 | CPU:Intel(R) Xeon(R) CPU E5-2620 v4 @ 2.10GHz 内存:251G 磁盘:1x600G SSD, 5x600G SATA 网络:2x1000M,2x10000M |
曙光 I620-G30 | CPU:Intel(R) Xeon(R) Gold 6148 CPU @ 2.40GHz 内存:1T 磁盘:1x240G SSD, 7x4T SATA 网络:2x1000M,2x10000M |
1. 修改BIOS
禁用电源管理,包括CPU睡眠状态
禁用超线程或与逻辑处理器相关的任何选项
2. 安装实时核
2.1 将yum源换成阿里的源
在/etc/yum.repo.d/下修改CentOS.Base.repo
# CentOS-Base.repo
#
# The mirror system uses the connecting IP address of the client and the
# update status of each mirror to pick mirrors that are updated to and
# geographically close to the client. You should use this for CentOS updates
# unless you are manually picking other mirrors.
#
# If the mirrorlist= does not work for you, as a fall back you can try the
# remarked out baseurl= line instead.
#
#
[base]
name=CentOS-7.7.1908 - Base - mirrors.aliyun.com
failovermethod=priority
baseurl=http://mirrors.aliyun.com/centos/7.7.1908/os/x86_64/
http://mirrors.aliyuncs.com/centos/7.7.1908/os/x86_64/
http://mirrors.cloud.aliyuncs.com/centos/7.7.1908/os/x86_64/
gpgcheck=1
gpgkey=http://mirrors.aliyun.com/centos/RPM-GPG-KEY-CentOS-7
#released updates
[updates]
name=CentOS-7.7.1908 - Updates - mirrors.aliyun.com
failovermethod=priority
baseurl=http://mirrors.aliyun.com/centos/7.7.1908/updates/x86_64/
http://mirrors.aliyuncs.com/centos/7.7.1908/updates/x86_64/
http://mirrors.cloud.aliyuncs.com/centos/7.7.1908/updates/x86_64/
gpgcheck=1
gpgkey=http://mirrors.aliyun.com/centos/RPM-GPG-KEY-CentOS-7
#additional packages that may be useful
[extras]
name=CentOS-7.7.1908 - Extras - mirrors.aliyun.com
failovermethod=priority
baseurl=http://mirrors.aliyun.com/centos/7.7.1908/extras/x86_64/
http://mirrors.aliyuncs.com/centos/7.7.1908/extras/x86_64/
http://mirrors.cloud.aliyuncs.com/centos/7.7.1908/extras/x86_64/
gpgcheck=1
gpgkey=http://mirrors.aliyun.com/centos/RPM-GPG-KEY-CentOS-7
#additional packages that extend functionality of existing packages
[centosplus]
name=CentOS-7.7.1908 - Plus - mirrors.aliyun.com
failovermethod=priority
baseurl=http://mirrors.aliyun.com/centos/7.7.1908/centosplus/x86_64/
http://mirrors.aliyuncs.com/centos/7.7.1908/centosplus/x86_64/
http://mirrors.cloud.aliyuncs.com/centos/7.7.1908/centosplus/x86_64/
gpgcheck=1
enabled=0
gpgkey=http://mirrors.aliyun.com/centos/RPM-GPG-KEY-Ce
2.2 添加rt源
在/etc/yum.repos.d/下新建CentOS-RT.repo
写入以下内容
# CentOS-RT.repo
#
# The Real Time (RT) repository.
#
[rt]
name=CentOS-7 - rt
baseurl=http://mirrors.aliyun.com/centos/7.7.1908/rt/x86_64/
gpgcheck=0
gpgkey=file:///etc/pki/rpm-gpg/RPM-GPG-KEY-CentOS-7
enabled=1
yum update -y
yum install kernel-rt kernel-rt-kvm tuned-profiles-realtime
3. 配置实时配置文件
3.1 看NUMA信息
[root@compute1 ~]# lscpu | grep NUMA
NUMA 节点: 2
NUMA 节点0 CPU: 0-7
NUMA 节点1 CPU: 8-15
3.2 配置实时cpu
通常CPU 0用来处理控制台中断,CPU 1用于处理主机的其他开销,因此理论上只需cpu 0和1预留给物理机,其余给虚拟机用即可。
以下为测试的隔离方案及测试结果供参考
Isolcpus 虚拟机最大延时 物理机最大延时(40cpus)
2-39 43 2642
4-39 44 2657
8-39 47 2483
4-19, 24-39 49 3237
4-35 39 2503
2-37 42 2810
2-19, 22-39 46 2634
4-15 44 27 (16cpus)
4-11 55 18
2-15 47 21
2-13 45 19
2-7, 10-15 39 20
经测试,性能差距不大,如果想创更多虚拟机,隔离更多的cpu即可。
3.3 配置隔离
echo "isolated_cores=4-11" >> /etc/tuned/realtime-variables.conf
如果cpu不连续,用逗号隔开。
systemctl enable tuned
systemctl start tuned
3.5 设置为realtime
tuned-adm profile realtime
3.6 查看是否配置成功
grep tuned_params= /boot/grub2/grub.cfg
输出:
set tuned_params="skew_tick=1 isolcpus=4-11 intel_pstate=disable nosoftlockup"
4 配置huge pages
4.1 添加default_hugepagesz=1G到/etc/default/grub的GRUB_CMDLINE_LINUX
4.2 使配置生效
grub2-mkconfig -o /boot/grub2/grub.cfg
4.3 重启系统
4.4 查看是否默认挂载hugetlbfs文件系统
cat /proc/mounts | grep huge
4.5 否则mount一个hugetlbfs文件系统
mount -t hugetlbfs hugetlbfs /dev/hugepages
为huge pages保留一定数量的内存,在/etc/sysctl.conf加入如下配置
vm.nr_hugepages=16
修改后,用命令sysctl -p 使设置生效
4.6 查看是否生效
cat /proc/meminfo
注意:根据需要及物理机内存填写。hugepagesz为1G,配置16个page,会用掉16G内存
5 测试是否安装成功
# yum install -y rt-tests
# hwlatdetect
hwlatdetect: test duration 120 seconds
parameters: Latency threshold: 10us
Sample window: 1000000us
Sample width: 500000us
Non-sampling period: 500000us
Output File: None
Starting test test
finished Max Latency: 0us
Samples recorded: 0
Samples exceeding threshold: 0
如果任何样本超出阈值,则需重新配置
虚拟机配置
参考物理机配置
注:
虚拟机不用配置hugepage的个数,只用配置hugepage的大小。
不用安装kernel-rt-kvm。
1 用安装好实时核的虚拟机做快照生成镜像
2 云平台配置
2.1 使cpu支持实时
修改物理机/etc/kolla/nova-compute/nova.conf
在[libvirt]下添加
cpu_mode=host-passthrough
# nova flavor-create --is-public true rt_flavor 70 8192 80 4
# nova flavor-key 70 set hw:cpu_policy=dedicated hw:cpu_realtime=yes hw:cpu_realtime_mask=^0-1 hw:mem_page_size=1GB tag=kcmp
hw:cpu_policy=delicated:表示实例必须为其分配独占的pCPU。
hw:cpu_realtime=yes:表示实例将具有实时策略。
hw:cpu_realtime_mask=^0-1:表示实例的vcpu除了vcpu 0和vcpu 1都有实时策略
hw:mem_page_size=1GB:表示实例将会分配的每个大页内存为1GB
tag=kcmp: 表示该flavor会在web页面展示,供选择。
让虚拟机只使用隔离出的cpu
查看隔离出的cpu,此处即为realtime-variables.conf配置的隔离出的cpu
cat /proc/cmdline
isolcpus=4-11
修改物理机/etc/kolla/nova-compute/nova.conf
在[libvirt]下添加
vcpu_pin_set = 4-11
重启nova_compute
2.4 创建虚拟机
用生成的镜像和配置好的flavor创建虚拟机
测试
测试命令
cyclictest -m -n -q -p90 -D 12h -h100 -i 200
或
cyclictest -p 90 - m -c 0 -i 200 -n -h 100 -q -l 10000000
参数说明
-m 锁定内存分配
-n 使用nanosleep 而不是简单的sleep
-q 运行时不打印即时信息
-p 给cyclictest 赋优先级
-D 测试时间
-h 总共统计100个信息在最后的结果中
-i 指定一个循环为200us
-l 指定循环次数
-c 0指定使用默认的MONOTONIC 时钟
cyclictest用于测试定时器的精度,假定定时器时间间隔为 interval,定时器启动前记录下当前时间t1,定时器到时后记录下当前时间t2,则测出的时延为 t2 - (t1 + interval)
为能实时查看测试信息,可将-q参数去掉。
1. 物理机(华为)实时核
# Total: 263706597
# Min Latencies: 00001
# Avg Latencies: 00002
# Max Latencies: 00042
# Histogram Overflows: 00000
# Total: 010135378
# Min Latencies: 00001
# Avg Latencies: 00002
# Max Latencies: 05004
# Histogram Overflows: 00106
# Total: 369213964
# Min Latencies: 00003
# Avg Latencies: 00007
# Max Latencies: 00055
# Histogram Overflows: 00000
# Total: 327727659
# Min Latencies: 00003
# Avg Latencies: 00005
# Max Latencies: 00051
# Histogram Overflows: 00000
# Total: 15057973
# Min Latencies: 00003
# Avg Latencies: 00014
# Max Latencies: 17737
# Histogram Overflows: 195438
# Total: 000949607
# Min Latencies: 00003
# Avg Latencies: 00119
# Max Latencies: 69721
# Histogram Overflows: 57768
# Total: 263748117
# Min Latencies: 00001
# Avg Latencies: 00002
# Max Latencies: 00034
# Histogram Overflows: 00000
# Total: 10027138
# Min Latencies: 00001
# Avg Latencies: 00002
# Max Latencies: 03237
# Histogram Overflows: 00138
# Total: 002455887
# Min Latencies: 00003
# Avg Latencies: 00015
# Max Latencies: 24009
# Histogram Overflows: 48213
# Total: 126359639
# Min Latencies: 00003
# Avg Latencies: 00005
# Max Latencies: 00048
# Histogram Overflows: 00000
# Total: 17369394
# Min Latencies: 00002
# Avg Latencies: 00016
# Max Latencies: 37601
# Histogram Overflows: 195751
# Total: 125625396
# Min Latencies: 00003
# Avg Latencies: 00006
# Max Latencies: 00049
# Histogram Overflows: 00000
结果分析
服务器 | 测试对象 | host有无实时核 | guest有无实时核 | Min | Avg | Max | 循环总数 | 超过99us循环数 |
华为 | host | 有 | / | 1 | 2 | 42 | 263,706,597 | 0 |
华为 | host | 无 | / | 1 | 2 | 5004 | 10,135,378 | 106 |
华为 | guest | 有 | 有 | 3 | 7 | 55 | 369,213,964 | 0 |
华为 | guest | 无 | 无 | 3 | 119 | 69721 | 949,607 | 57768 |
华为 | guest | 无 | 有 | 3 | 5 | 51 | 327,727,659 | 0 |
华为 | guest | 有 | 无 | 3 | 14 | 17737 | 15,057,973 | 195438 |
曙光 | host | 有 | / | 1 | 2 | 34 | 263,748,117 | 0 |
曙光 | host | 无 | / | 1 | 2 | 3237 | 10,027,138 | 138 |
曙光 | guest | 无 | 无 | 2 | 16 | 37601 | 17,369,394 | 195,751 |
曙光 | guest | 无 | 有 | 3 | 6 | 49 | 125,625,396 | 0 |
曙光 | guest | 有 | 有 | 3 | 5 | 48 | 126,359,639 | 0 |
曙光 | guest | 有 | 无 | 3 | 15 | 24009 | 2,455,887 | 48213 |
在配置hugepagesz后需要重启系统,选择以带实时核的系统启动或不带实时核的系统启动。
- 虚拟机实时性与虚拟机实时核正相关,与物理机实时核无实质影响
- 实时虚拟机最小延时在3us左右,平均延时在6us左右,最大延时在55us
- 物理机无论是否安装实时核,均需要配置huge pages、tuned profile,具备创建具有实时策略虚拟机的条件,具体体现flavor具备cpu_policy、cpu_realtime、cpu_realtime_mask、mem_page_size
- 虚拟机有无实时核,最大时延差距巨大,平均时延相差也较大
- 通过华为和曙光服务器的正向比较,相当性能的服务器实时数据无明显差别
1. http://mirror.centos.org/centos/7/rt/x86_64/repodata/repomd.xml: [Errno 14] curl#6 - "Could not resolve host: mirror.centos.org; 未知的错误
配置域名解析
vim /etc/resolv.conf
网络不可达,配置网关
route add default gw 192.168.1.254
2. 创建虚拟机时warning host doesn't support requested feature: CPUID.01H:EDX.ds [bit 21]
出现许多warning,cpu不支持某些flag。
解决办法:修改/etc/kolla/nova-compute/nova.conf
在[libvirt]下添加
cpu_mode=host-passthrough
重启nova_compute
host-passthrough: libvirt 令 KVM 把宿主机的 CPU 指令集全部透传给虚拟机。因此虚拟机能够最大限度的使用宿主机 CPU 指令集.
3. 创建虚拟机时Insufficient compute resources: Requested instance NUMA topology cannot fit the given host NUMA topology
解决办法:
1、查看是否挂载文件系统
cat /proc/mounts | grep huge
如果没有挂载重新挂载
2、查看是否配置vm.hugepages或hugepages_free不足
cat /proc/meminfo
如果没有则重新生成hugepage,如果不足则加大
- 查看物理机系统盘空间是否充足,如果不足,删一些无用的文件
- 查看cpu是否充足,虚拟机cpu之和不能超过物理机总的cpu数
3. 如果发现虚拟机实时性能较差,可以查看该虚拟机是否同时使用了两个numa节点的cpu或vcpu_pin_set配置有误
virsh
list
dumpxml ID
4. could not find capabilities for domaintype=kvm
缺少kernel-rt-kvm.x86_64包
5. libvirtError: unsupported configuration: CPU mode 'host-passthrough' for x86_64 qemu domain on x86_64 host is not supported by hypervisor
重启机器
参考文章
1、Deploying Real Time Openstack | that.guru
2、http://www.voidcn.com/article/p-wvsnxbgc-bpt.html
3、2.3. Setting BIOS Parameters Red Hat Enterprise Linux for Real Time 7 | Red Hat Customer Portal
5、实时 KVM(Realtime KVM) - AspxHtml学习分享网
6、HugePage简介和KVM中使用HugePage_junmuzi的专栏-CSDN博客_hugepage kvm