OpenStack虛擬機遷移的排錯經歷

1、熱遷移的排錯經歷node

先來看下cpu型號,從/proc/cpuinfo中能夠看出全部cpu型號版本是同樣的
ios

wKioL1g85vriY4jFAAD7Rbyu3nk172.png


經過nova live-migration --debug <instance-xxx>  <node-xxxx>命令行遷移,能夠看到報錯信息api

wKiom1g86LeDQQaNAAFwNs66wbg124.png


經過nova-compute log錯誤信息定位代碼服務器

wKiom1g86YfBVRfHAAEHYaq5nuc718.png



再下面就到libvirt.py了ide

wKiom1g86oKh7qLlAABbMIIgtzY794.png

經過這個api,看不出具體錯誤信息,多是跟flags是0有關係。ui



經過debug代碼,保存cpu xml信息到某個文件spa

wKiom1g87EPR-a5YAAHdqUXeegM282.png


經過virsh接口能夠看到錯誤, 舒了一口氣!
命令行

wKiom1g87Mqxo9xuAADXl8op5Xk929.png

同樣的cpu不同的cpu features,亮瞎我了!debug


對比宿主機的cpu flags,真的差了一個monitor特性,後面查到是曙光服務器的bios版本不一致,漲姿式了!3d

wKioL1g87ovxtUyhAAIF2kcoIz4786.png


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
相關文章
相關標籤/搜索