1、熱遷移的排錯經歷node
先來看下cpu型號,從/proc/cpuinfo中能夠看出全部cpu型號版本是同樣的
ios
經過nova live-migration --debug <instance-xxx> <node-xxxx>命令行遷移,能夠看到報錯信息api
經過nova-compute log錯誤信息定位代碼服務器
再下面就到libvirt.py了ide
經過這個api,看不出具體錯誤信息,多是跟flags是0有關係。ui
經過debug代碼,保存cpu xml信息到某個文件spa
經過virsh接口能夠看到錯誤, 舒了一口氣!
命令行
同樣的cpu不同的cpu features,亮瞎我了!debug
對比宿主機的cpu flags,真的差了一個monitor特性,後面查到是曙光服務器的bios版本不一致,漲姿式了!3d
kvm是支持實例以指定的cpu啓動,經過在/etc/nova/nova.conf中配置cpu_mode和cpu_model
[libvirt]
cpu_mode=custom
cpu_model=kvm64
重啓openstack-nova-compute服務生效,若是要對已存在的實例生效,需對其硬重啓。 在cpu配置爲kvm64下 window 2012R2 vm啓動會有問題,症狀跟在這裏描述的同樣:https://bugzilla.redhat.com/show_bug.cgi?id=1086319
對應的qemu、libvirt版本:
qemu: 1.5.3
libvirt: 1.2.17
2、冷遷移的排錯經歷
若是nova-scheduler節點nova.conf中的scheduler_default_filters配置項有AvailabilityZoneFilter這個配置,而後改了availability-zone(默認爲nova),改成其它名字。 冷遷移的時候走調度,結果AvailabilityZoneFilter過濾後沒有匹配的主機了。
class AvailabilityZoneFilter(filters.BaseHostFilter): """Filters Hosts by availability zone. Works with aggregate metadata availability zones, using the key 'availability_zone' Note: in theory a compute node can be part of multiple availability_zones """ # Availability zones do not change within a request run_filter_once_per_request = True def host_passes(self, host_state, filter_properties): spec = filter_properties.get('request_spec', {}) props = spec.get('instance_properties', {}) availability_zone = props.get('availability_zone') if not availability_zone: #第一次建立虛擬機的時候,還有availability_zone,返回是true return True metadata = utils.aggregate_metadata_get_by_host( #對已建立好的虛擬機;有兩種判斷 host_state, key='availability_zone') if 'availability_zone' in metadata: #一、給主機聚合設置元數據 hosts_passes = availability_zone in metadata['availability_zone'] host_az = metadata['availability_zone'] else: hosts_passes = availability_zone == CONF.default_availability_zone #二、跟default_availability_zone(默認也爲nova)配置項比較 host_az = CONF.default_availability_zone if not hosts_passes: LOG.debug("Availability Zone '%(az)s' requested. " "%(host_state)s has AZs: %(host_az)s", {'host_state': host_state, 'az': availability_zone, 'host_az': host_az}) return hosts_passes