èè
ïŒã¢ã¬ã¯ã»ã€ã»ãªãŽãã³ãã³ãã¯ã©ãŠãäžã«ä»®æ³ãã·ã³ãäœæãããšããå€ãã®å Žåããããäœããã®ã¹ãã¬ãŒãžããã€ã¹ã«é¢é£ä»ããããšããèŠæããããŸãã ã¯ã©ãŠãäžã«ä»®æ³ãã·ã³ãäœæãããšããå¯èœãªéãè¿
éã«åäœãããããšæãããšããããããŸãã äžéšã®ããŒã¿ã¹ãã¬ãŒãžããã€ã¹ãä»®æ³ãã·ã³ïŒ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ã䜿çšããŠããã®ç®çãæãããŸãã æè»æ§ã®åäžã«å ããŠããã®ã¢ãããŒãã¯ããµãŒãã¹ãäºãã«ããªãã®è·é¢ã«é
眮ãããå¯èœæ§ããããããå
šäœçãªããã©ãŒãã³ã¹ã«æªåœ±é¿ãäžããå¯èœæ§ããããŸãã ãã®ãããªåŸ®èª¿æŽã®åé¡ã®å¯èœãªè§£æ±ºçã¯ããã¹ãŠã®ãµãŒãã¹ã®ã¹ã±ãžã¥ãŒã©ãŒãã¯ã©ãŠãã®ãã¹ãŠã®ç¹æ§ã«ã¢ã¯ã»ã¹ã§ãããã®ã«çµåããããšã§ãããçŸæç¹ã§ã¯ãã®åé¡ã解決ããç°¡åã§å¹æçãªæ¹æ³ã¯ãããŸããã
è±èªã®ãªãªãžãã«èšäº