為了減少CPU競爭,提高CPU cache命中率,可以把guest的vcpu pin到host的物理CPU上。
在openstack中,可以添加以下到flavor extra specs:
hw:cpu_policy=shared|dedicated
hw:cpu_threads_policy=avoid|separate|isolate|prefer
如果hw:cpu_policy=shared,則和現有的默認vcpu放置一樣,有NUMA來定義vcpu的放置,即沒有顯示的vcpu pin。
如果hw:cpu_policy=dedicated則顯示的vcpu pin。pin的policy有:
- hw:cpu_threads_policy = avoid
guest不會調度到有超線程的host上。 - hw:cpu_threads_policy = separate
每個vcpu到放置到不同的core。 - hw:cpu_threads_policy = isolate
每個vcpu到放置到不同的core上,並且獨占這個core。其他vcpu不能再放置到該core上。 - hw:cpu_threads_policy = prefer
guest的vcpu放置到同一core上,讓vcpu成為siblings thread。
image metadata properties也可以用來設置放置policy:
- hw_cpu_threads_policy=avoid|separate|isolate|prefer
為了使用vcpu pin,必須使用host aggregates,用來區分 hw:cpu_policy=shared/dedicated。
但同一host agg可以同時支持dedicated RAM (via huge pages) and dedicated CPUs (via pinning).
https://specs.openstack.org/openstack/nova-specs/specs/juno/approved/virt-driver-cpu-pinning.html
https://github.com/openstack/nova-specs/blob/master/specs/juno/implemented/virt-driver-numa-placement.rst