OpenStack Nova 분석 - Nova Scheduler 스케줄링 알고리즘 분석(3)

돌아보다


이 소절은 주로 필터와 값 계산이다.FilterScheduler의schedule 방법은 가상 기기 스케줄링 알고리즘을 실현할 때 두 가지 중요한 것을 호출했다
방법:
(1) HostManager 객체가 호출된 getfiltered_hosts 방법으로 사용할 수 있는 계산 노드 목록을 가져옵니다.
(2) HostManager 객체가 호출된 getweighed_hosts 방법은 노드를 계산할 수 있는 권한을 계산합니다.
/nova/scheduler/host_manager.py:
def __init__(self):
        ...
        self.filter_handler = filters.HostFilterHandler()
        filter_classes = self.filter_handler.get_matching_classes(
                CONF.scheduler_available_filters)
        self.filter_cls_map = {cls.__name__: cls for cls in filter_classes}
        self.filter_obj_map = {}
        self.default_filters = self._choose_host_filters(self._load_filters())
        self.weight_handler = weights.HostWeightHandler()
        weigher_classes = self.weight_handler.get_matching_classes(
                CONF.scheduler_weight_classes)
       ....

HostManager 클래스의 초기화 방법에서 HostFilterHandler 대상과 HostWeightHandler 대상get 을 각각 호출합니다matching_classes
사용 가능한 필터 클래스와 값 클래스를 불러옵니다.필터 클래스와 값 클래스는 getfiltered_hosts 및 getweighed_hosts 방법의 기본
주춧돌

2. getfiltered_hosts 방법


HostManager 객체의 getfiltered_hosts 방법은 다음과 같이 정의됩니다. (사용 가능한 계산 노드 목록을 가져옵니다.)
class HostManager(object):
    def get_filtered_hosts(self, hosts, filter_properties, filter_class_names=None):
        ...
        # 
        filter_classes = self._choose_host_filters(filter_class_names)
        ...
        # ( ) 
        return self.filter_handler.get_filtered_objects(filter_classes,
                                                        hosts, filter_properties)

(1) 계산 노드를 사용할 수 있는지 확인하기 위해 노바 Scheduler는 여러 개의 필터를 정의하고 각 필터는 계산 노드의 속성을 검사합니다.... 만
모든 필터를 통해 검사된 계산 노드가 있어야 사용할 수 있는 계산 노드입니다.
(2) 위의 방법을 먼저 호출한다choose_host_필터 클래스 목록을 가져옵니다.그리고 Filter 호출handler 변수의
get_filtered_objects 방법은 필터를 사용하여 계산 노드가 사용할 수 있는지 검사합니다.그리고 getfiltered_hosts 방법은 매개 변수를 통해서도
filter_properties 전송 forcehosts 및 ignorehosts 두 변수 (호스트 탈락 규칙).

3. HostManager 클래스의choose_host_filters 방법


_choose_host_Filters 메서드: HostManager 클래스의choose_host_filters 방법의 기능은 필터 클래스 목록을 가져오는 것입니다.
class HostManager(object):
    def _choose_host_filters(self, filter_cls_names):
        # filter_cls_names , 
        if filter_cls_names is None:
            filter_cls_names = CONF.scheduler_default_filters
        # filter_cls_names 
        if not isinstance(filter_cls_names, (list, tuple)):
            filter_cls_names = [filter_cls_names]
        good_filters = []
        bad_filters = []
        # 
        for filter_name in filter_cls_names:
            found_class = False
            # 
            for cls in self.filter_classes:
                # filter_name , 
                if cls.__name__ == filter_name:
                    good_filters.append(cls)
                    found_class = True
                    break
            # filter_name , 
            if not found_class:
                bad_filters.append(filter_name)
        ...
        return good_filter
Filtercls_names 매개 변수의 모든 필터, 좋은 필터를 추출합니다. 좋은 필터란
이 필터는 이전에 등록되었습니다
지내다이 등록 프로세스는 HostManager 클래스의 초기화 방법에서 Filter를 호출하여handler 대상의 getmatching_classes 방법 등록
사용 가능한 필터, getmatching_classes 방법은nova를 등록합니다.scheduler.filters 패키지에 정의된 모든 필터입니다.
참고:
(1) 외부에 Filter가 들어오지 않은 경우cls_names 매개 변수입니다.choose_host_Filters 방법은 Filtercls_names 기본값으로 설정
필터 목록.기본 필터 목록은 nova입니다.conf 구성 파일의 schedulerdefault_filters 설정 항목 설정.
(2) filter_handler 대상의 getmatching_classes 방법은nova를 등록합니다.scheduler.filters 패키지에 정의된 모든 필터입니다.

4. Filterhandler 대상의 getfiltered_objects 메서드


1、filter_handler 대상의 getfiltered_objects 방법은 고객이 지정한 필터 종류를 호출하여 계산 노드가 사용할 수 있는지 확인합니다.
get_filtered_objects 방법은 최종적으로 사용 가능한 계산 노드 목록을 되돌려줍니다.
2、filter_handler 객체의 유형은 HostFilterHandler 클래스입니다.HostFilterHandler 클래스는 BaseFilterHandler 클래스에서 상속됩니다.
get_filtered_objects 메서드는 BaseFilterHandler 클래스에 정의됩니다.
class BaseFilterHandler(loadables.BaseLoader):
    def get_filtered_objects(self, filter_classes, objs, filter_properties):
        # 
        for filter_cls in filter_classes:
            # filter_all 
            objs = filter_cls().filter_all(objs, filter_properties)
        return list(objs)
filter_classes 매개 변수는 필터 형식 목록,objs 매개 변수는 필터를 위한 계산 노드 목록,filterproperties 매개 변수는 고객이 맞춤형으로 만든 것입니다
매개변수를 필터링합니다.
3、get_filtered_objects 방법은 필터 대상마다 필터를 순서대로 호출합니다all 방법.필터 개체당 Filterall 메소드 반환
필터를 통해 검사한 호스트 목록을 포함하는 교체기 대상을 되돌려줍니다.
4. 모든 필터 대상은 BaseHostFilter 클래스를 계승하고 BaseHostFilter 클래스는 BaseFilter 클래스를 계승한다.filter_all 방법 정의
BaseFilter 클래스의 정의:/nova/filters.py
class BaseFilter(object):  
    def filter_all(self, filter_obj_list, filter_properties):  
        for obj in filter_obj_list:  
            if self._filter_one(obj, filter_properties):  
                yield obj  
filter_obj_list 필터링할 계산 노드 목록,filterproperties 고객 맞춤형 필터 매개 변수
(1)、filter_all 방법은 호스트마다 삭제됩니다.filter_원 메서드, True로 돌아가면 호스트의 인용을 되돌려줍니다.BaseFilter 클래스의
_filter_원 메서드는 항상 True로 돌아갑니다.BaseHostFilter 클래스 재로드filter_one 방법, 자신의 host 호출패스 방법.
(2) BaseFilter 클래스의filter_원 방법:
class BaseHostFilter(filters.BaseFilter):
    def _filter_one(self, obj, filter_properties):
        return self.host_pass(obj, filter_properties)

필터 클래스의 내부 논리 정의는host패스 방법 중에매개 변수: 필터링할 호스트 참조, 사용자 정의 필터 매개 변수
호스트에 대해 필터의hostpasses 메서드가 True로 돌아가면 호스트가 이 필터의 검사를 통해 사용 가능한 것으로 간주됩니다.
5. 예를 들어 설명한다.
필터가 어떻게 작동하는지 더 잘 이해하고 ComputeFilter 필터의host 분석에 중심을 두다passes 메서드의 정의:
class ComputeFilter(filters.BaseHostFilter):
    def host_passes(self, host_state, filter_properties):
        """Returns True for only active compute nodes."""
        # 
		service = host_state.service  
        # , 
		if service['disabled']: 
            LOG.debug("%(host_state)s is disabled, reason: %(reason)s",
                      {'host_state': host_state,
                       'reason': service.get('disabled_reason')})
            return False
        else:
            if not self.servicegroup_api.service_is_up(service):
                LOG.warning(_LW("%(host_state)s has not been heard from in a "
                                "while"), {'host_state': host_state})
                return False
        return True
1. ComputeFilter 필터는 주로 서비스 그룹을 호출합니다.api의 서비스is_up 방법,
컴퓨팅 노드의 Nova Compute 서비스 확인
아니요 활성화 상태입니다.
2. 오픈스테이크에서 어떤 서비스든지 정해진 시간에 작업이 있고 정해진 시간에 데이터베이스에서 자신의 상태를 업데이트한다.servicegroup_api의
service_is_up 방법(/novaservicegroup/api.py)은 데이터베이스를 조회하고 서비스의 최근 업데이트 시간을 검사합니다.업데이트되지 않았습니다. 서비스가 이미
폐쇄를 거치다.
참고: ComputeFilter는 가장 기본적인 필터입니다.노드 하나에 Nova Compute 서비스가 시작되지 않으면 가상 환경 구축에 대한 언급이 없습니다.
기계
요약: HostManager 객체의 getfiltered_hosts 방법의 작업 절차.
1. HostManager 객체의 getfiltered_hosts 메서드는 HostManager 객체의 를 먼저 호출합니다.choose_host_필터 가져오기 방법
클래스 목록.그런 다음 HostManager 객체의 get 을 사용합니다.filtered_objects 방법은 필터를 사용하여 계산 노드가 사용할 수 있는지 검사합니다.
2、_choose_host_filters 방법 순서대로 filter 검사cls_names 매개 변수의 필터 이름, 필터 이름에 대응하는 필터가 미리 주석되어 있으면
책이 지나치면 좋은 필터라고 여긴다.최종,choose_host_filters 방법은 모든 좋은 필터 목록을 되돌려줍니다.
외부에 filter가 지정되어 있지 않은 경우cls_names 매개변수,choose_host_filters는 nova를 사용합니다.conf 프로필 기본 필터입니다.
3. HostManager 객체의 getfiltered_objects 방법은 필터 대상마다 필터를 순서대로 호출합니다all 방법.되돌아오는 것은 이 필터를 통해
의 호스트 목록입니다.
4、필터 대상의 Filterall 방법은 필터를 위한 호스트마다 Filterone 메서드, True로 돌아가면 호스트가 검사를 통과합니다.
5、filter_one 메서드 호출hostpasses.필터 대상의 주요 논리는host패스 방법 중에

좋은 웹페이지 즐겨찾기