openstack在建立虛擬機或進行虛擬機的冷遷移時根據在nova.conf文件中scheduler_default_filters和scheduler_available_filters配置的過濾器,數據庫
對主機進行篩選,選擇合適的目的主機。json
本文根據nova M版源碼分析調度不一樣過濾器的過程。函數
1、conductor服務經過rpc調用scheduler服務 SchedulerManager類的select_destinations,由此開始進入進入主機過濾階段,源碼分析
此階段主要目的是調用事先在nova.conf文件中配置的過濾器,選擇合適的計算節點。3d
文件nova/scheduler/manager.pyblog
104行,self.driver實際是在nova.conf文件中配置的FileterScheduler排序
2、nova/scheduler/filter_scheduler.py文件rpc
52行,num_instances是要選擇的計算節點數。get
53行,self._schedule是實際的調度函數,在此函數中調度各個過濾器的函數。源碼
3、_schedule函數
94行,加載json文件能夠在json文件裏配置過濾規則,如今m版json文件沒起做用。
104行,在過濾以前首先要從數據庫拿到全部計算節點的的當前狀態。
112行,進行主機過濾
120行,拿到過濾的主機計算權重,並返回根據權重排序的列表。
4、nova/scheduler/host_manager.py文件
get_filtered_host函數中參數filter_class_names傳進來的值是None,進入517分支
517行,filters是全部過濾器類名字的列表,由self._choose_host_filters函數返回
_choose_host_filters(),函數根據nova.conf文件中的scheduler_default_filters和scheduler_available_filters挑選出要使用的過濾器
self._load_filters()加載nova.conf文件中的scheduler_default_filters項,默認在nova/scheduler/filters下的所有過濾器都打開。
545行,調用nova/filters.py文件中BaseFilterHandler::get_filtered_objects,參數filters是要使用的過濾器類列表,hosts是全部的計算節點。
5、nova/filters.py文件
81行,循環調用過濾器
85行,調用過濾器類的filter_all方法,對主機進行篩選,以AvailabilityZoneFilter類說明調用關係