ã¯ã©ãŠãäžã«ä»®æ³ãã·ã³ãäœæãããšããå€ãã®å Žåããããäœããã®ã¹ãã¬ãŒãžããã€ã¹ã«é¢é£ä»ããããšããèŠæããããŸãã ã¯ã©ãŠãäžã«ä»®æ³ãã·ã³ãäœæãããšããå¯èœãªéãè¿ éã«åäœãããããšæãããšããããããŸãã äžéšã®ããŒã¿ã¹ãã¬ãŒãžããã€ã¹ãä»®æ³ãã·ã³ïŒVMïŒã«æ¥ç¶ãããŠããå Žåããããšã®æ å ±äº€æã¯ãã³ãã«ã®ããã©ãŒãã³ã¹ãå€§å¹ ã«äœäžãããå¯èœæ§ããããŸãã ãããã£ãŠãã¹ãã¬ãŒãžããã€ã¹ãVMãå±éãããŠããç©çããŒããšåãç©çããŒãã«ããå Žåãé 延ã¯æå°éã«æããããããšã¯æããã§ãã OpenStackãã©ãããã©ãŒã ã䜿çšããŠãã®ãããªäŸ¿å©ãªé 眮ãå®çŸããæ¹æ³ã¯æããã§ã¯ãããŸããã
æ®å¿µãªãããOpenStackã¯ããã©ã«ãã§ãã®ãããªåŸ®èª¿æŽãè¡ãæ段ããŸã æäŸããŠããŸãããããªãŒãã³ã§æ¡åŒµã容æãªãã©ãããã©ãŒã ã§ãããããOpenStackã¯åæ§ã®æ©èœã§ããèªäœãè£å®ã§ããŸãã ãã®æçš¿ã§ã¯ãéçºãšäœ¿çšäžã«çºçããå¯èœæ§ã®ãããã®ãããªã¢ããªã³ãšèœãšãç©Žã®å®è£ ã®æ©èœã«ã€ããŠèª¬æããŸãã
ç°¡åãªè³ªåãã€ãŸãVMãç¹å®ã®ããŒãã«é 眮ããæ¹æ³ã«ã€ããŠèª¬æããŸãã
誰ããïŒããããïŒååã«èªèããŠãããããã¹ã±ãžã¥ãŒã©ãŒïŒnova-schedulerã³ã³ããŒãã³ãïŒã¯VMãããŒãã«é 眮ãã責任ããããŸãããããã£ãŠãå ã®ç®æšãéæããã«ã¯ãäœããã®æ¹æ³ã§ãã®åäœãå€æŽããŠãã¹ãã¬ãŒãžããã€ã¹ã®ååžã®ç¹æ§ãèæ ®ããå¿ èŠããããŸãã ããã«å¯Ÿããæšæºçãªã¢ãããŒãã¯ãã¹ã±ãžã¥ãŒã©ãã£ã«ã¿ãŒã䜿çšããããšã§ãã ãã£ã«ã¿ãŒã¯ãã¹ã±ãžã¥ãŒã©ãŒã«ããããŒãã®éžæã«åœ±é¿ãäžããå¯èœæ§ããããŸããããã£ã«ã¿ãŒã¯ã³ãã³ãã©ã€ã³ããå¶åŸ¡ã§ããã¹ã±ãžã¥ãŒã©ãŒã«ãã£ãŠéžæãããããŒãã察å¿ãã¹ãç¹æ§ããã£ã«ã¿ãŒã«æž¡ããŸãã ããªãå¹ åºãã¯ã©ã¹ã®èšç»ã¿ã¹ã¯ã解決ã§ããããã€ãã®æšæºãã£ã«ã¿ãŒãããããããã¯OpenStack Docsãããžã§ã¯ãã®ããã¥ã¡ã³ãã§èª¬æãããŠããŸãã ããã»ã©éèŠã§ã¯ãªãã¿ã¹ã¯ã®å Žåãç¬èªã®ãã£ã«ã¿ãŒãéçºããæ©äŒãåžžã«ãããŸãã ãããç§ãã¡ãä»ããããšã§ãã
ãã£ã«ã¿ãŒã«ã€ããŠäžèš
ãã£ã«ã¿ãªã³ã°ã䜿çšããèšç»ã®äžè¬çãªèãæ¹ã¯éåžžã«åçŽã§ãããŠãŒã¶ãŒã¯ããŒããå¿çããç¹æ§ãæå®ãããã®åŸãã¹ã±ãžã¥ãŒã©ãŒã¯ãããã«å¯Ÿå¿ããããŒãã®ã»ãããéžæããŸãã 次ã«ãåã®æ®µéã§éžæããããŒãã®1ã€ã§VMãèµ·åã§ããŸãã è² è·ãšããã£ã«ã¿ãªã³ã°æ®µéã§éèŠã§ã¯ãªãä»ã®å€ãã®ç¹æ§ã«ãã£ãŠãã©ã¡ãã決ãŸããã ãã£ã«ã¿ãªã³ã°æé ããã詳现ã«æ€èšããŠãã ããã
å€ãã®å Žåãã·ã¹ãã ã«ã¯è€æ°ã®ãã£ã«ã¿ãŒãåæã«ååšããŸãã ã¹ã±ãžã¥ãŒã©ãŒã¯ãæåã«äœ¿çšå¯èœãªãã¹ãŠã®ããŒãã®ãªã¹ããäœæãã次ã«åãã£ã«ã¿ãŒããã®ãªã¹ãã«é©çšããŠãåå埩ã§äžé©åãªããŒããç Žæ£ããŸãã ãã®ãããªã¢ãã«ã§ã¯ããã£ã«ã¿ãŒã¿ã¹ã¯ã¯éåžžã«åçŽã§ããå ¥åæã«éä¿¡ãããããŒããèæ ®ãããã£ã«ã¿ãŒåºæºãæºãããã©ããã決å®ããŸãã åãã£ã«ã¿ãŒã¯ãå°ãªããšã1ã€ã®ã¡ãœãã
host_passes()
ãæã€ãã£ã«ã¿ãŒã¯ã©ã¹ã®1ã€ã®ãªããžã§ã¯ãã§ãã ãã®ã¡ãœããã¯ãããŒãããã³ãã£ã«ã¿ãªã³ã°åºæºãå ¥åãšããŠåãå ¥ããããŒããæå®ãããåºæºãæºãããã©ããã«å¿ããŠ
True
ãŸãã¯
False
ãè¿ãå¿ èŠããããŸãã ãã¹ãŠã®ãã£ã«ã¿ãŒã¯ã©ã¹ã¯ã
nova.scheduler.filters
ã§å®çŸ©ãããŠããããŒã¹ã¯ã©ã¹
BaseHostFilter()
ç¶æ¿ããå¿ èŠããããŸãã èµ·åæã«ãã¹ã±ãžã¥ãŒã©ãŒã¯äœ¿çšå¯èœãªãã£ã«ã¿ãŒã®ãªã¹ãã§æå®ããããã¹ãŠã®ã¢ãžã¥ãŒã«ãã€ã³ããŒãããŸãã 次ã«ããŠãŒã¶ãŒãVMãèµ·åããèŠæ±ãéä¿¡ãããšãã¹ã±ãžã¥ãŒã©ãŒã¯åãã£ã«ã¿ãŒã¯ã©ã¹ã®ãªããžã§ã¯ããäœæãããããã䜿çšããŠäžé©åãªããŒãããã£ã«ã¿ãŒã§é€å€ããŸãã ãããã®ãªããžã§ã¯ãã¯ã1ã€ã®èšç»ã»ãã·ã§ã³äžã«ååšããããšã«æ³šæããããšãéèŠã§ãã
ããšãã°ãååãªã¡ã¢ãªãåããããŒããéžæããRAMãã£ã«ã¿ãŒãæ€èšããŸãã ããã¯ããªãåçŽãªæ§é ã®æšæºãã£ã«ã¿ãŒã§ãããããããè€éãªãã£ã«ã¿ãŒãããã«åºã¥ããŠéçºã§ããŸãã
ã¯ã©ã¹RamFilterïŒfilters.BaseHostFilterïŒïŒ
"" "ãªãŒããŒãµãã¹ã¯ãªãã·ã§ã³ãã©ã°ä»ãã®ã©ã ãã£ã«ã¿" ""
def host_passesïŒselfãhost_stateãfilter_propertiesïŒïŒ
"" "ååãªRAMããããã¹ãã®ã¿ãè¿ããŸãã" ""
instance_type = filter_properties.getïŒ 'instance_type'ïŒ
requested_ram = instance_type ['memory_mb']
free_ram_mb = host_state.free_ram_mb
total_usable_ram_mb = host_state.total_usable_ram_mb
memory_mb_limit = total_usable_ram_mb * FLAGS.ram_allocation_ratio
used_ram_mb = total_usable_ram_mb-free_ram_mb
available_ram = memory_mb_limit-used_ram_mb
䜿çšå¯èœã§ãªãå Žå> = requested_ramïŒ
LOG.debugïŒ_ïŒ "ïŒ ïŒhost_stateïŒsã¯ïŒ ïŒrequested_ramïŒs MBãæã£ãŠããŸããã"
ã䜿çšå¯èœãªRAMã䜿çšå¯èœãªRAMã¯ïŒ ïŒusable_ramïŒs MBã®ã¿ã§ãããïŒã
å°å ã®äººïŒïŒïŒ
åœãè¿ã
ïŒèšç®ããŒãã®ãªãŒããŒãµãã¹ã¯ãªãã·ã§ã³ã®å¶éãä¿åããŠã以äžããã¹ãããŸãïŒ
host_state.limits ['memory_mb'] = memory_mb_limit
çãè¿ã
ç¹å®ã®ããŒããå°æ¥ã®VMã«é©ããŠãããã©ãããå€æããã«ã¯ããã®ããŒãã§çŸåšã©ã®ãããã®RAMã空ããŠããããããã³VMã«å¿ èŠãªã¡ã¢ãªéããã£ã«ã¿ãŒãç¥ãå¿ èŠããããŸãã ããŒãã®ç©ºãã¡ã¢ãªãVMã«å¿ èŠãªéããå°ãªãããšãå€æããå Žåã
host_passes()
ã¯
False
è¿ããããŒãã¯å©çšå¯èœãªããŒãã®ãªã¹ãããåé€ãããŸãã ããŒãã®ç¶æ ã«é¢ãããã¹ãŠã®æ å ±ã¯
host_state
åŒæ°ã«å«ãŸãã決å®ãäžãã®ã«å¿ èŠãªæ å ±ã¯
filter_properties
åŒæ°ã«å ¥ããããŸãã
ram_allocation_ratio
ãªã©ã®ããã€ãã®äžè¬çãªèšç»æŠç¥ãåæ ããå®æ°ã¯ãæ§æãã¡ã€ã«ãŸãã¯ãã£ã«ã¿ãŒã³ãŒãå ã®å¥ã®å Žæã§å®çŸ©ã§ããŸãããèšç»ã«å¿ èŠãªãã¹ãŠã®ãã®ã䜿çšããŠãã£ã«ã¿ãŒã«è»¢éã§ãããããããã¯
ram_allocation_ratio
éèŠã§ã¯ãããŸãããããããã©ã³ããŒã®ãã³ãã
ã¹ã±ãžã¥ãŒã©ãŒã®ãã³ã
ã¹ã±ãžã¥ãŒã©ãŒã®ãã³ãã¯ã
nova boot
ã³ãã³ãã«ãã£ãŠçæããããã¹ãŠã®èŠæ±ã«å«ãŸããããŒãšå€ã®ãã¢ã®èŸæžã«ãããŸããã äœãããªããã°ããã®èŸæžã¯ç©ºã®ãŸãŸã«ãªããèå³æ·±ãããšã¯äœãèµ·ãããŸããã ãŠãŒã¶ãŒããã³ããæž¡ããŠãèŸæžã«ãã³ãã
nova boot ⊠--hint your_hint_name=desired_value
ããããšã決å®ããå Žåãããã¯ãããšãã°æ¬¡ã®ã³ãã³ãã®ããã«ããŒ-
hint
ã䜿çšããŠç°¡åã«å®è¡ã§ããŸãïŒ
nova boot ⊠--hint your_hint_name=desired_value
ã ããã§ããã³ãä»ãã®èŸæžã¯ç©ºã§ã¯ãªããéä¿¡ããããã¢ãå«ãŸããŠããŸãã ã¹ã±ãžã¥ãŒã©ã®æ¡åŒµæ©èœããã®ãã³ãã®äœ¿çšæ¹æ³ãç¥ã£ãŠããå Žåã圌ã¯äœæ¥æã«èæ ®ããå¿ èŠã®ããæ å ±ãåãåããŸããã ãã®ãããªæ¡åŒµåããªããã°ãäœãèµ·ãããŸããã 2çªç®ã®ã±ãŒã¹ã¯æåã®ã±ãŒã¹ã»ã©ããããããªãã®ã§ãæåã®ã±ãŒã¹ã«æ³šç®ããŸãããã æ¡åŒµæ©èœããã³ããã©ã®ããã«æŽ»çšã§ããããèŠãŠã¿ãŸãããã
ãã³ãã䜿çšããã«ã¯ãæããã«ãªã¯ãšã¹ãããæœåºããå¿ èŠããããŸãã ãã®æé ãéåžžã«ç°¡åã§ãããã¹ãŠã®ãã³ãã¯ã
scheduler_hints
ããŒã«ãã£ãŠ
filter_properties
èŸæžã«æ ŒçŽãããŸãã 次ã®ã³ãŒãã¹ããããã¯ããã³ããååŸããæ¹æ³ãå®å šã«èª¬æããŠããŸãã
scheduler_hints = filter_properties ['scheduler_hints']
important_hint = scheduler_hints.getïŒ 'important_hint'ãFalseïŒ
nova scheduler_hints
ã§ã¯ãscheduler_hints
nova scheduler_hints
åžžã«ãªã¯ãšã¹ãã«ååšãããããæ¡åŒµæ©èœãéçºããéã«äžæå¿«ãªé©ããæåŸ ããããšã¯ã§ããŸãããããã³ãã®å€ãèªããšãã¯æ³šæãå¿ èŠã§ãã
ããã§ãä»»æã®ããã³ãããåãåãããšãã§ããŸãã ãã®ç®æšãéæããããã«ãããããã©ã®ããã«äœ¿çšããããè°è«ããããšãæ®ã£ãŠããŸã
ã¹ãã¬ãŒãžããã€ã¹ã®æ¥ç¶æ§ãæ¹åããŸãïŒ
ã¹ã±ãžã¥ãŒã©ã®æ©èœãæ¡åŒµããæ¹æ³ã®ç¥èãããã°ããŠãŒã¶ãŒãé¢å¿ã®ããã¹ãã¬ãŒãžããã€ã¹ãç©ççã«é 眮ãããŠããããŒããšåãããŒãã§VMãå®è¡ã§ãããã£ã«ã¿ãŒãç°¡åã«èšèšã§ããŸãã æããã«ã䜿çšããã¹ãã¬ãŒãžããã€ã¹ãäœããã®æ¹æ³ã§åºå¥ããå¿ èŠããããŸãã ããã§ã¯ãåããã€ã¹ã«åºæã®volume_idè¡ã圹ç«ã¡ãŸãã volume_idããããããå±ããããŒãã®ååãäœããã®æ¹æ³ã§ååŸãããã£ã«ã¿ãªã³ã°æ®µéã§ãã®ããŒããéžæããå¿ èŠããããŸãã æåŸã®ã¿ã¹ã¯ã¯äž¡æ¹ãšããã£ã«ã¿ãŒã§è§£æ±ºããå¿ èŠãããããã¹ãŠãæ©èœããã«ã¯ãé©åãªãã³ãã䜿çšããŠãã£ã«ã¿ãŒã«ããŒãã®ååãéç¥ããå¿ èŠããããŸãã
ãŸãããã³ãã¡ã«ããºã ã䜿çšããŠãvolume_idããã£ã«ã¿ãŒã«æž¡ããŸãã ãã®ãããåå
same_host_volume_id
ã䜿çšããããšã«åæããŸãã ããã¯ç°¡åãªã¿ã¹ã¯ã§ãããããã«æ¬¡ã®åé¡ã«ééããŸãããããã»ã©æ確ã§ã¯ãããŸããããã¹ãåãååŸããæ¹æ³ãã¹ãã¬ãŒãžããã€ã¹ã®èå¥åãç¥ãæ¹æ³ãªã©ã§ãã æ®å¿µãªãããã©ããããã®åé¡ã解決ããç°¡åãªæ¹æ³ã¯ãªãã®ã§ãããŒã¿ã¹ãã¬ãŒãžã®è²¬ä»»è ã§ããcinderã³ã³ããŒãã³ãã®å©ããæ±ããŸãã
cinderãµãŒãã¹ã䜿çšããã«ã¯å€ãã®æ¹æ³ããããŸããããšãã°ãAPIåŒã³åºãã®çµã¿åããã䜿çšããŠãæå®ãããvolume_idã«é¢é£ä»ããããã¡ã¿ããŒã¿ãååŸãããããããããŒãåãæœåºããŸãã ãã ããä»åã¯ããç°¡åãªæ¹æ³ã䜿çšããŸãã cinderclientã¢ãžã¥ãŒã«ã®æ©èœãå©çšããŠå¿ èŠãªã¯ãšãªãçæãããããè¿ããã®ãåŠçããŸãã
ããªã¥ãŒã = cinder.cinderclientïŒã³ã³ããã¹ãïŒ.volumes.getïŒvolume_idïŒ
vol_host = getattrïŒããªã¥ãŒã ããos-vol-host-attrïŒãã¹ããããªãïŒ
ããã§æ³šæããå¿ èŠãããã®ã¯ããã®ã¢ãããŒãã¯Grizzly以éã®ãªãªãŒã¹ã§ã®ã¿æ©èœããããšã§ãããªããªããèå³ã®ããæ å ±ãååŸã§ããcinderã®æ¡åŒµæ©èœã¯Grizzlyã§ã®ã¿å©çšå¯èœã ããã§ãã
ãããªãå®è£ ã¯ç°¡åã§ã
vol_host
ãšå ¥ã£ãŠããååãæ¯èŒããäžèŽããå Žåã«ã®ã¿
True
ãè¿ãå¿ èŠããããŸãã å®è£ ã®è©³çŽ°ã¯ãGrizzlyã®ããã±ãŒãžãŸãã¯Havanaã®å®è£ ã®ããããã§ç¢ºèªã§ããŸãã çµæã®ãã£ã«ã¿ãŒã«ããçšåºŠã®åå°ããããšãå¿ ç¶çã«åé¡ãçºçããŸãã
ããã¯ããªããã§ããæåã§ããïŒ
ããããèæ ®ãããæ¹æ³ã¯æé©ã§ããå¯äžå¯èœãªæ¹æ³ã§ããããŸããã ãã®ãããåçŽãªå®è£ ã§ã¯ãcinderãžã®è€æ°ã®åŒã³åºãã«é¢é£ããåé¡ããããããã¯éåžžã«é«äŸ¡ã§ããããã£ã«ã¿ãŒãé ãããä»ã®å€ãã®åé¡ããããŸãã ãããã®åé¡ã¯ãå°èŠæš¡ãªã¯ã©ã¹ã¿ãŒã§ã¯éèŠã§ã¯ãããŸããããå€æ°ã®ããŒããæäœããå Žåãå€§å¹ ãªé 延ã«ã€ãªããå¯èœæ§ããããŸãã ç¶æ³ãæ¹åããããã«ããã£ã«ã¿ãŒãå€æŽã§ããŸããããšãã°ããã¹ãåã®ãã£ãã·ã¥ãå ¥åããããšã«ãããVMãããŒãããããã®cinderãžã®1åã®åŒã³åºãã«å¶éããããç®çã®ããŒããæ€åºããããšããã«ãã£ã«ã¿ãŒãå®éã«ãªãã«ãããã©ã°ãè¿œå ããŸã
èŠçŽãããšãVolumeAffinityFilterã¯ãããŒã«ãªãã£ã䜿çšããŠã¯ã©ãŠãã®ããã©ãŒãã³ã¹ãåäžãããäœæ¥ã®å§ãŸãã«éããããã®æ¹åã«éçºã®äœå°ãããããšã«æ³šæããŠãã ããã
ããšããã®ä»£ããã«
ç§ã調ã¹ãäŸã¯ãnovaã¹ã±ãžã¥ãŒã©çšã®ãã£ã«ã¿ãŒãéçºããæ¹æ³ã瀺ããŠããŸããnovaã¹ã±ãžã¥ãŒã©ãŒã¯ãä»ã®ãã£ã«ã¿ãŒãšåºå¥ããæ©èœãåããŠããŸãã ãã®ãã£ã«ã¿ãŒã¯ãOpenStackãã©ãããã©ãŒã ã®å¥ã®ã³ã³ããŒãã³ãã®APIã䜿çšããŠããã®ç®çãæãããŸãã æè»æ§ã®åäžã«å ããŠããã®ã¢ãããŒãã¯ããµãŒãã¹ãäºãã«ããªãã®è·é¢ã«é 眮ãããå¯èœæ§ããããããå šäœçãªããã©ãŒãã³ã¹ã«æªåœ±é¿ãäžããå¯èœæ§ããããŸãã ãã®ãããªåŸ®èª¿æŽã®åé¡ã®å¯èœãªè§£æ±ºçã¯ããã¹ãŠã®ãµãŒãã¹ã®ã¹ã±ãžã¥ãŒã©ãŒãã¯ã©ãŠãã®ãã¹ãŠã®ç¹æ§ã«ã¢ã¯ã»ã¹ã§ãããã®ã«çµåããããšã§ãããçŸæç¹ã§ã¯ãã®åé¡ã解決ããç°¡åã§å¹æçãªæ¹æ³ã¯ãããŸããã
è±èªã®ãªãªãžãã«èšäº