Bug 1289368
| Summary: | [RFE] libvirt support for CAT | |||
|---|---|---|---|---|
| Product: | Red Hat Enterprise Linux 7 | Reporter: | Marcelo Tosatti <mtosatti> | |
| Component: | libvirt | Assignee: | Martin Kletzander <mkletzan> | |
| Status: | CLOSED ERRATA | QA Contact: | Luyao Huang <lhuang> | |
| Severity: | high | Docs Contact: | Yehuda Zimmerman <yzimmerm> | |
| Priority: | high | |||
| Version: | 7.3 | CC: | atelang, brpeters, dbayly, dyuan, fbaudin, jdenemar, jsuchane, juzhang, kchamart, ksanagi, lcapitulino, lhuang, lmiksik, mkletzan, mtessun, mtosatti, pezhang, pliu, pragyansri.pathi, rbalakri, sujith_pandel, tumeya, xfu, xiaolong.wang, xuzhang | |
| Target Milestone: | rc | Keywords: | FutureFeature | |
| Target Release: | 7.5 | |||
| Hardware: | Unspecified | |||
| OS: | Unspecified | |||
| Whiteboard: | ||||
| Fixed In Version: | libvirt-3.9.0-10.el7 | Doc Type: | Enhancement | |
| Doc Text: |
CAT support added to *libvirt* on specific CPU models
The *libvirt* service now supports Cache Allocation Technology (CAT) on specific CPU models. This enables guest virtual machines to have part of their host's CPU cache allocated for their vCPU threads.
For details on configuring this feature, see https://access.redhat.com/documentation/en-us/red_hat_enterprise_linux/7/html/virtualization_tuning_and_optimization_guide/index.html#sect_VTOG-vCPU_cache_reservation.
|
Story Points: | --- | |
| Clone Of: | ||||
| : | 1299678 1547015 (view as bug list) | Environment: | ||
| Last Closed: | 2018-04-10 10:33:22 UTC | Type: | Bug | |
| Regression: | --- | Mount Type: | --- | |
| Documentation: | --- | CRM: | ||
| Verified Versions: | Category: | --- | ||
| oVirt Team: | --- | RHEL 7.3 requirements from Atomic Host: | ||
| Cloudforms Team: | --- | Target Upstream Version: | ||
| Embargoed: | ||||
| Bug Depends On: | 1288964, 1410144 | |||
| Bug Blocks: | 1513282, 1299678, 1468650, 1469590, 1490967, 1522983, 1547015 | |||
|
Description
Marcelo Tosatti
2015-12-07 23:26:07 UTC
Marcelo, what's the scope of the work here? Is this just an update to a newer libvirt release? (In reply to Brad Peters from comment #2) > Marcelo, what's the scope of the work here? > > Is this just an update to a newer libvirt release? Yes. Martin can comment on upstream libvirt acceptance. (In reply to Brad Peters from comment #2) Yes, hopefully it will be. There were some spanners in the works, some rough edges here and there, but I have it planned for completion soon. Patch for initial support posted upstream: https://www.redhat.com/archives/libvir-list/2017-November/msg00424.html Karen Eli will talk with Martin for the details of testing requirements Verify this bug with libvirt-3.9.0-11.el7.x86_64:
S1, resctrl without cdp
0. prepare a machine which support intel CAT
# lscpu |grep cat
Flags: fpu vme de pse tsc msr pae mce cx8 apic sep mtrr pge mca cmov pat pse36 clflush dts acpi mmx fxsr sse sse2 ss ht tm pbe syscall nx pdpe1gb rdtscp lm constant_tsc arch_perfmon pebs bts rep_good nopl xtopology nonstop_tsc aperfmperf eagerfpu pni pclmulqdq dtes64 monitor ds_cpl vmx smx est tm2 ssse3 sdbg fma cx16 xtpr pdcm pcid dca sse4_1 sse4_2 x2apic movbe popcnt tsc_deadline_timer aes xsave avx f16c rdrand lahf_lm abm 3dnowprefetch epb cat_l3 cdp_l3 intel_pt tpr_shadow vnmi flexpriority ept vpid fsgsbase tsc_adjust bmi1 hle avx2 smep bmi2 erms invpcid rtm cqm rdt_a rdseed adx smap xsaveopt cqm_llc cqm_occup_llc cqm_mbm_total cqm_mbm_local dtherm ida arat pln pts
1. mount resctrl without cdp:
# mount -t resctrl resctrl /sys/fs/resctrl/
2. check the virsh caps output:
virsh # capabilities
<cache>
<bank id='0' level='3' type='both' size='20' unit='MiB' cpus='0,2,4,6,8,10,12,14,16,18,20,22,24,26,28,30'>
<control granularity='1' unit='MiB' type='both' maxAllocs='16'/>
</bank>
<bank id='1' level='3' type='both' size='20' unit='MiB' cpus='1,3,5,7,9,11,13,15,17,19,21,23,25,27,29,31'>
<control granularity='1' unit='MiB' type='both' maxAllocs='16'/>
</bank>
</cache>
3. set some l3 cache for vm
# echo "L3:0=000ff;1=000ff" > /sys/fs/resctrl/schemata
4. add cachetune in guest 1 xml:
# virsh edit vm1
...
<vcpu placement='static' cpuset='0-2' current='2'>4</vcpu>
<cputune>
<vcpupin vcpu='0' cpuset='10-20'/>
<vcpupin vcpu='2' cpuset='0-9'/>
<cachetune vcpus='0'>
<cache id='0' level='3' type='both' size='1' unit='MiB'/>
<cache id='1' level='3' type='both' size='2' unit='MiB'/>
</cachetune>
<cachetune vcpus='1'>
<cache id='0' level='3' type='both' size='2' unit='MiB'/>
<cache id='1' level='3' type='both' size='1' unit='MiB'/>
</cachetune>
<cachetune vcpus='3'>
<cache id='0' level='3' type='both' size='1' unit='MiB'/>
<cache id='1' level='3' type='both' size='1' unit='MiB'/>
</cachetune>
</cputune>
...
5. start guest:
# virsh start vm1
Domain vm1 started
6. check resctrl dir:
# ll /sys/fs/resctrl/
total 0
-rw-r--r--. 1 root root 0 Feb 7 01:25 cpus
-rw-r--r--. 1 root root 0 Feb 7 01:25 cpus_list
dr-xr-xr-x. 4 root root 0 Feb 7 03:28 info
dr-xr-xr-x. 4 root root 0 Feb 7 03:28 mon_data
dr-xr-xr-x. 2 root root 0 Feb 7 03:28 mon_groups
drwxr-xr-x. 4 root root 0 Feb 7 03:28 qemu-1-vm1-vcpus_0
drwxr-xr-x. 4 root root 0 Feb 7 03:28 qemu-1-vm1-vcpus_1
drwxr-xr-x. 4 root root 0 Feb 7 03:28 qemu-1-vm1-vcpus_3
-rw-r--r--. 1 root root 0 Feb 7 03:19 schemata
-rw-r--r--. 1 root root 0 Feb 7 01:25 tasks
# cat /sys/fs/resctrl/qemu-1-vm1-vcpus_0/tasks
42754
# cat /sys/fs/resctrl/qemu-1-vm1-vcpus_0/schemata
L3:0=00100;1=00300
# cat /sys/fs/resctrl/qemu-1-vm1-vcpus_1/tasks
42755
# cat /sys/fs/resctrl/qemu-1-vm1-vcpus_1/schemata
L3:0=00600;1=00400
# cat /sys/fs/resctrl/qemu-1-vm1-vcpus_3/tasks
# cat /sys/fs/resctrl/qemu-1-vm1-vcpus_3/schemata
L3:0=00800;1=00800
7. hotplug 2 vcpus:
# virsh setvcpus vm1 4
8. recheck the vcpus 3 dir:
# cat /sys/fs/resctrl/qemu-1-vm1-vcpus_3/tasks
43182
9. unplug vcpus:
# virsh setvcpus vm1 2
10. recheck the vcpus 3 dir:
# cat /sys/fs/resctrl/qemu-1-vm1-vcpus_3/tasks
11. destroy guest:
# virsh destroy vm1
Domain vm1 destroyed
12. check the /sys/fs/resctrl/ dir and vm1 related group should been deleted:
# ll /sys/fs/resctrl/
total 0
-rw-r--r--. 1 root root 0 Feb 7 01:25 cpus
-rw-r--r--. 1 root root 0 Feb 7 01:25 cpus_list
dr-xr-xr-x. 4 root root 0 Feb 7 03:28 info
dr-xr-xr-x. 4 root root 0 Feb 7 03:28 mon_data
dr-xr-xr-x. 2 root root 0 Feb 7 03:28 mon_groups
-rw-r--r--. 1 root root 0 Feb 7 03:19 schemata
-rw-r--r--. 1 root root 0 Feb 7 01:25 tasks
S2 resctrl mount with cdp:
1. mount resctrl with cdp:
# mount -t resctrl resctrl -o cdp /sys/fs/resctrl/
2. restart libvirtd
# service libvirtd restart
Redirecting to /bin/systemctl restart libvirtd.service
3. check the virsh caps:
virsh # capabilities
...
<cache>
<bank id='0' level='3' type='both' size='20' unit='MiB' cpus='0,2,4,6,8,10,12,14,16,18,20,22,24,26,28,30'>
<control granularity='1' unit='MiB' type='code' maxAllocs='8'/>
<control granularity='1' unit='MiB' type='data' maxAllocs='8'/>
</bank>
<bank id='1' level='3' type='both' size='20' unit='MiB' cpus='1,3,5,7,9,11,13,15,17,19,21,23,25,27,29,31'>
<control granularity='1' unit='MiB' type='code' maxAllocs='8'/>
<control granularity='1' unit='MiB' type='data' maxAllocs='8'/>
</bank>
</cache>
...
4. set some l3 cache for vm
# echo "L3DATA:0=ff;1=ff" > /sys/fs/resctrl/schemata
# echo "L3CODE:0=ff;1=ff" > /sys/fs/resctrl/schemata
5. add cachetune in guest xml:
<vcpu placement='static' cpuset='0-2' current='2'>4</vcpu>
<cputune>
<vcpupin vcpu='0' cpuset='10-20'/>
<vcpupin vcpu='2' cpuset='0-9'/>
<cachetune vcpus='0'>
<cache id='1' level='3' type='code' size='2' unit='MiB'/>
<cache id='0' level='3' type='data' size='1' unit='MiB'/>
</cachetune>
<cachetune vcpus='1'>
<cache id='0' level='3' type='code' size='2' unit='MiB'/>
<cache id='1' level='3' type='code' size='1' unit='MiB'/>
<cache id='0' level='3' type='data' size='2' unit='MiB'/>
<cache id='1' level='3' type='data' size='1' unit='MiB'/>
</cachetune>
<cachetune vcpus='3'>
<cache id='0' level='3' type='code' size='1' unit='MiB'/>
<cache id='0' level='3' type='data' size='1' unit='MiB'/>
</cachetune>
</cputune>
6. start guest:
# virsh start vm1
Domain vm1 started
7. check the value in the resctrl dir:
# cat /sys/fs/resctrl/qemu-1-vm1-vcpus_0/schemata
L3DATA:0=00100;1=000ff
L3CODE:0=000ff;1=00300
# cat /sys/fs/resctrl/qemu-1-vm1-vcpus_0/tasks
46238
# cat /sys/fs/resctrl/qemu-1-vm1-vcpus_1/schemata
L3DATA:0=00600;1=00100
L3CODE:0=00300;1=00400
# cat /sys/fs/resctrl/qemu-1-vm1-vcpus_1/tasks
46239
# cat /sys/fs/resctrl/qemu-1-vm1-vcpus_3/schemata
L3DATA:0=00800;1=000ff
L3CODE:0=00400;1=000ff
# cat /sys/fs/resctrl/qemu-1-vm1-vcpus_3/tasks
8. hotplug vcpu:
# virsh setvcpus vm1 4
9. recheck vcpus 3 resctrl dir:
# cat /sys/fs/resctrl/qemu-1-vm1-vcpus_3/tasks
46588
10. unplug vcpu:
# virsh setvcpus vm1 2
11. recheck vcpus 3 resctrl dir:
# cat /sys/fs/resctrl/qemu-1-vm1-vcpus_3/tasks
12. destroy guest :
# virsh destroy vm1
Domain vm1 destroyed
13. and check the resctrl dir:
# ll /sys/fs/resctrl/
total 0
-rw-r--r--. 1 root root 0 Feb 7 01:25 cpus
-rw-r--r--. 1 root root 0 Feb 7 01:25 cpus_list
dr-xr-xr-x. 5 root root 0 Feb 7 03:49 info
dr-xr-xr-x. 4 root root 0 Feb 7 03:55 mon_data
dr-xr-xr-x. 2 root root 0 Feb 7 03:55 mon_groups
-rw-r--r--. 1 root root 0 Feb 7 03:56 schemata
-rw-r--r--. 1 root root 0 Feb 7 01:25 tasks
S3 check the dir won't lose track after restart libvirtd:
1. start a guest which have cachetune:
# virsh dumpxml vm1
...
<cputune>
<vcpupin vcpu='0' cpuset='10-20'/>
<vcpupin vcpu='2' cpuset='0-9'/>
<cachetune vcpus='0'>
<cache id='1' level='3' type='code' size='2' unit='MiB'/>
<cache id='0' level='3' type='data' size='1' unit='MiB'/>
</cachetune>
<cachetune vcpus='1'>
<cache id='0' level='3' type='code' size='2' unit='MiB'/>
<cache id='1' level='3' type='code' size='1' unit='MiB'/>
<cache id='0' level='3' type='data' size='2' unit='MiB'/>
<cache id='1' level='3' type='data' size='1' unit='MiB'/>
</cachetune>
<cachetune vcpus='3'>
<cache id='0' level='3' type='code' size='1' unit='MiB'/>
<cache id='0' level='3' type='data' size='1' unit='MiB'/>
</cachetune>
</cputune>
...
2. start guest:
# virsh start vm1
Domain vm1 started
2, check the resctrl dir:
# ll /sys/fs/resctrl/
total 0
-rw-r--r--. 1 root root 0 Feb 7 01:25 cpus
-rw-r--r--. 1 root root 0 Feb 7 01:25 cpus_list
dr-xr-xr-x. 5 root root 0 Feb 7 04:04 info
dr-xr-xr-x. 4 root root 0 Feb 7 04:04 mon_data
dr-xr-xr-x. 2 root root 0 Feb 7 04:04 mon_groups
drwxr-xr-x. 4 root root 0 Feb 7 04:08 qemu-2-vm1-vcpus_0
drwxr-xr-x. 4 root root 0 Feb 7 04:08 qemu-2-vm1-vcpus_1
drwxr-xr-x. 4 root root 0 Feb 7 04:08 qemu-2-vm1-vcpus_3
-rw-r--r--. 1 root root 0 Feb 7 03:56 schemata
-rw-r--r--. 1 root root 0 Feb 7 01:25 tasks
3. restart libvirtd:
# service libvirtd restart
Redirecting to /bin/systemctl restart libvirtd.service
4. destroy guest:
# virsh destroy vm1
Domain vm1 destroyed
5. check resctrl dir and make sure libvirt remove the subdir for guest:
# ll /sys/fs/resctrl/
total 0
-rw-r--r--. 1 root root 0 Feb 7 01:25 cpus
-rw-r--r--. 1 root root 0 Feb 7 01:25 cpus_list
dr-xr-xr-x. 5 root root 0 Feb 7 04:04 info
dr-xr-xr-x. 4 root root 0 Feb 7 04:04 mon_data
dr-xr-xr-x. 2 root root 0 Feb 7 04:04 mon_groups
-rw-r--r--. 1 root root 0 Feb 7 03:56 schemata
-rw-r--r--. 1 root root 0 Feb 7 01:25 tasks
S4 start multi-guest which have cachetune to reach the limit of the l3 cache tune:
1. start 3 guest which have cachetune settings:
vm1:
<cputune>
<vcpupin vcpu='0' cpuset='10-20'/>
<vcpupin vcpu='2' cpuset='0-9'/>
<cachetune vcpus='0'>
<cache id='0' level='3' type='both' size='1' unit='MiB'/>
<cache id='1' level='3' type='both' size='2' unit='MiB'/>
</cachetune>
<cachetune vcpus='1'>
<cache id='0' level='3' type='both' size='2' unit='MiB'/>
<cache id='1' level='3' type='both' size='1' unit='MiB'/>
</cachetune>
<cachetune vcpus='3'>
<cache id='0' level='3' type='both' size='1' unit='MiB'/>
</cachetune>
</cputune>
vm2:
<cputune>
<vcpupin vcpu='0' cpuset='10-20'/>
<vcpupin vcpu='2' cpuset='0-9'/>
<cachetune vcpus='0'>
<cache id='0' level='3' type='both' size='1' unit='MiB'/>
<cache id='1' level='3' type='both' size='2' unit='MiB'/>
</cachetune>
<cachetune vcpus='1'>
<cache id='0' level='3' type='both' size='2' unit='MiB'/>
<cache id='1' level='3' type='both' size='1' unit='MiB'/>
</cachetune>
<cachetune vcpus='3'>
<cache id='0' level='3' type='both' size='1' unit='MiB'/>
<cache id='1' level='3' type='both' size='1' unit='MiB'/>
</cachetune>
</cputune>
vm3:
<cputune>
<vcpupin vcpu='0' cpuset='10-20'/>
<vcpupin vcpu='2' cpuset='0-9'/>
<cachetune vcpus='0'>
<cache id='0' level='3' type='both' size='3' unit='MiB'/>
</cachetune>
<cachetune vcpus='1'>
<cache id='1' level='3' type='both' size='5' unit='MiB'/>
</cachetune>
<cachetune vcpus='2'>
<cache id='0' level='3' type='both' size='1' unit='MiB'/>
</cachetune>
</cputune>
2. check the schemata value for each cpu:
# cat /sys/fs/resctrl/*/schemata
L3:0=00100;1=00300
L3:0=00600;1=00400
L3:0=00800;1=000ff
L3:0=01000;1=01800
L3:0=06000;1=02000
L3:0=08000;1=04000
L3:0=70000;1=000ff
L3:0=000ff;1=f8000
L3:0=80000;1=000ff
3, try to start another guest:
# virsh start vm4
error: Failed to start domain vm4
error: unsupported configuration: Not enough room for allocation of 1048576 bytes for level 3 cache 0 scope type 'both'
Verify this bug with comment 10, 11, 12 and 13 *** Bug 1546273 has been marked as a duplicate of this bug. *** *** Bug 1531405 has been marked as a duplicate of this bug. *** Since the problem described in this bug report should be resolved in a recent advisory, it has been closed with a resolution of ERRATA. For information on the advisory, and where to find the updated files, follow the link below. If the solution does not work for you, open a new bug report. https://access.redhat.com/errata/RHEA-2018:0704 |