OpenStack之Nova分析——建立虛擬機器(五)
上篇兩篇文章分析了Nova Scheduler服務,這篇文章我們繼續來分析建立虛擬機器的過程。先來回顧一下。
這個方法的前半部分(_scheduler方法)我們已經在“Nova Scheduler排程演算法”中分析過,我們繼續來看該方法的後半部分。class FilterScheduler(driver.Scheduler): def scheduler_run_instance(self, context, request_spec, admin_password, injected_files, requested_networks, is_first_time, filter_properties): #獲取排程所需引數 payload = dict(request_spec=request_spec) #通知Nova API開始排程 notifier.notify(context, notifier.publisher_id("scheduler"), 'scheduler.run_instance.start', notifier.INFO, notifier.INFO, payload) ... #執行排程演算法,獲取加權主機列表 weighted_hosts = self._schedule(context, "compute", request_spec, filter_properties, instance_uuids) ... #為每個虛擬機器分配計算節點 for num, instance_uuid in enumerate(instance_uuids): ... try: try: #選擇權值最高的計算節點 weighted_host = weighted_hosts.pop(0) except IndexError: raise exception.NoValidHost(reason="") #在權值最高的計算節點上建立虛擬機器 self._provision_resource(context, weighted_host, request_spec, filter_properties, requested_networks, injected_files, admin_password, is_first_time, instance_uuid=instance_uuid) except Exception as ex: ... #通知Nova API虛擬機器排程完畢 notifier.notify(context, notifier.publisher_id("scheduler"), 'scheduler.run_instance.end', notifier.INFO, payload)
_provision_resource方法
class FilterScheduler(driver.Scheduler):
def _provision_resource(self, context, weighed_host, ...):
...
self.compute_rpcapi.run_instance(context, instance=updated_instance, ...)
該方法在權值最高的計算節點上建立虛擬機器,遠端呼叫了Nova Compute服務的run_instance方法,這個方法位於nova/nova/compute/rpcapi.py。
class ComputeAPI(nova.openstack.common.rpc.proxy.RpcProxy): def run_instance(self, ctxt, instance, ...): ... self.cast(ctxt, self.make_msg('run_instance',intance=instance_p, ...), topic=_compute_topic(self.topic, ctxt, host ,None), ...)
可以看到,該方法會呼叫cast方法向Nova Compute服務傳送RPC請求。
和其它服務類似,在Nova Compute服務中,處理RPC請求的方法都定義在Nova Compute服務的manager類中,該類位於nova/nova/compute/manager.py。來看一下這個類下的run_instance方法。
class ComputeManager(manager.SchedulerDependentManager):
def run_instance(self, context, instance, request_spec=None,
filter_properties=None, requested_networks=None,
injected_files=None, admin_password=None,
is_first_time=False, node=None):
...
@lockutils.synchronized(instance['uuid'], 'nova-')
def do_run_instance():
self._run_instance(context, request_spec,
filter_properties, requested_networks, injected_files,
admin_password, is_first_time, node, instance)
do_run_instance()
可以看到這個方法定義了一個內部方法do_run_instance,do_run_instance內部方法的主要作用是加了一個鎖,這個鎖的目的是保證同一個虛擬機器在同一時刻只能執行一個任務。在這個方法內部,呼叫了_run_instance方法來實現虛擬機器的建立。來看一下_run_instance方法
class ComputeManager(manager.SchedulerDependentManager):
def _run_instance(self, context, request_spec,
filter_properties, requested_networks, injected_files,
admin_password, is_first_time, node, instance):
...
try:
#檢查虛擬機器是否存在
self._check_instance_exists(context, instance)
#更新資料庫中虛擬機器的狀態
try:
self._start_building(context, instance)
except exception.InstanceNotFound:
...
#檢查磁碟映象大小
image_meta = self._check_image_size(context, instance)
#選擇執行虛擬機器的節點
if node is None:
node = self.driver.get_available_nodes()[0]
...
rt = self._get_resource_tracker(node)
try:
limits = filter_properties.get('limits', {})
#為虛擬機器預留磁碟、記憶體、CPU等硬體資源
with rt.instance_claim(context, instance, limits):
#獲取虛擬機器的MAC地址的約束
macs = self.driver.macs_for_instance(instance)
#為虛擬機器分配網路
network_info = self._allocate_network(context, instance,
requested_networks, macs, security_groups)
...
#呼叫_spawn方法,進一步處理虛擬機器的建立請求
instance = self._spawn(context, instance, image_meta,
network_info, block_device_info,
injected_files, admin_password,
set_access_ip=set_access_ip)
except exception.InstanceNotFound:
#虛擬機器在建立過程中被刪除
with excutils.save_and_reraise_exception():
try:
#釋放分配的網路資源
self._deallocate_network(context, instance)
except Exception:
...
except exception.UnexpectedTaskStateError as e:
...
except Exception:
exc_info = sys.exc_info()
#請求重新執行排程演算法
self._reschedule_or_reraise(context, instance, exc_info, ...)
expect Expection:
...
這個方法首先完成虛擬機器建立前的一些準備工作,然後呼叫_spawn方法做進一步的處理。
我們先來分析一下這所謂的建立前的一些準備工作,主要分下面四步進行
1. 檢查要建立的虛擬機器的uuid是否被佔用
2. 更新Nova資料庫中虛擬機器的狀態,主要是更新vm_state和task_state這兩個欄位的值
3. 檢查虛擬機器的映象檔案大小是否超出虛擬機器規格的限制
4. 選擇一個可用的計算節點作為執行虛擬機器的節點,併為虛擬機器預留硬體資源
_spawn方法涉及的內容較多,我們放在下篇文章來分析~~
相關推薦
OpenStack之Nova分析——建立虛擬機器(五)
上篇兩篇文章分析了Nova Scheduler服務,這篇文章我們繼續來分析建立虛擬機器的過程。先來回顧一下。 class FilterScheduler(driver.Scheduler): def scheduler_run_instance(self, cont
OpenStack之Nova分析——建立虛擬機器(七)——建立虛擬機器映象檔案
虛擬機器的映象檔案主要是指磁碟映象檔案,當然有的還包括ramdisk和kernel映象來配合磁碟映象檔案使用,這篇文章我們來重點分析一下建立虛擬機器磁碟映象的整個過程。 虛擬機器磁碟映象是虛擬機器正常執行不可缺少的映象檔案,它是虛擬機器的主磁碟。先來概述一下建立虛擬機器磁碟
OpenStack中nova元件建立虛擬機器的原始碼流程
此處以OpenStack mitaka版本為例,實際最新的Ocata版本也差不多,以建立一個虛擬機器為例來分析nova原始碼中執行流程,該流程有助於二次開發,閱讀原始碼前最好先熟悉一下pastedeploy、webob、stevedore等openstack中的
Java程式設計師從笨鳥到菜鳥之(九十六)深入java虛擬機器(五)——java本地介面JNI詳解
對於java程式設計師來說,java語言的好處和優點,我想不用我說了,大家自然會說出很多一套套的。但雖然我們作為java程式設計師,但我們不得不承認java語言也有一些它本身的缺點。比如在效能、和底層打交道方面都有它的缺點。所以java就提供了一些本地介面,他主要的作用就是提供一個標準的方式讓
如何使用指令碼批量建立虛擬機器(下)
上篇文章我們介紹瞭如何使用VMware來克隆虛擬機器,克隆雖然能夠使我們避免了繁瑣的建立過程、大大簡化我們的操作,但在需要建立數量巨大的虛擬機器的情況下其步驟依然較多,顯然並不能滿足我們這種高效化
深入拆解虛擬機器(五)JVM是如何執行方法呼叫的?(下)
虛方法呼叫 (1)Java中所有非私有例項方法呼叫都會被 編譯成invokevirtual指令,而介面方法呼叫會被編譯成invokevirtualface指令。這兩種指令,均屬於Java虛擬機器中的虛方法呼叫 (2)Java虛擬機器採用了一種用空間換時間的策略實現動態繫結。它為每個方
JAVA虛擬機器(五)垃圾收集器與物件分配和回收策略
可達性分析演算法的效率 可達性分析中從GC Roots節點找引用鏈,可作為GC Roots的節點主要在全域性性的引用(常量或類靜態屬性)與執行上下文(棧幀中的本地變量表),如果要逐個檢查,必然會消耗很多時間。 另外,可達性分析對執行時間的敏感還體現在GC停頓上,
JAVA虛擬機器(五):Javac編譯原理
1、Javac編譯器的基本結構 Javac主要有4個模組:詞法分析、語法分析、語義分析、程式碼生成。 2、詞法分析 (1)功能:讀取原始檔的字元流,解析出符合Java語言規範的Token序列。 (2)關鍵類: com.sun.tools.javac.pars
OpenStack之管理虛擬機器(七)
OpenStack的三個元件(四個節點)已安全搭建完成,本篇博文為大家帶來基本管理,使平臺化管理更為方便、有效。 一、映象管理 1、掛載/上傳映象到控制節點 mkdir /abcmount.cifs //192.168.37.1/rhel7/KVM/CentOS-7-x86_64-DVD
Nova建立虛擬機器(指定IP地址和生成節點)
1. 背景需求 在openstack中,nova負責openstack虛擬機器的生命週期的管理,neutron則負責虛擬機器的網路管理工作,預設情況下,建立一臺虛擬機器,nova會根據nova-scheduler排程演算法,選擇一臺最合適的compute節點,同時會從neutr
OpenStack原始碼分析之Nova-Compute服務啟動過程(icehouse)
學習OpenStack有半年多了,一直都停留在使用和trouble shooting的階段,最近有時間來好好研究了一下程式碼,因為以前是C++/Windows出生的,所以對Linux下面的Python開發不是很熟悉,本文適合一些已經使用過OpenStack並且想要初步瞭解程
Java程式設計師從笨鳥到菜鳥之(九十三)深入java虛擬機器(二)——類載入器詳解(上)
分享一下我老師大神的人工智慧教程!零基礎,通俗易懂!http://blog.csdn.net/jiangjunshow 也歡迎大家轉載本篇文章。分享知識,造福人民,實現我們中華民族偉大復興!  
Java程式設計師從笨鳥到菜鳥之(九十四)深入java虛擬機器(三)——類的生命週期 下)類的初始化
分享一下我老師大神的人工智慧教程!零基礎,通俗易懂!http://blog.csdn.net/jiangjunshow 也歡迎大家轉載本篇文章。分享知識,造福人民,實現我們中華民族偉大復興!  
JAVA虛擬機器(JVM)劃重點 第二章 Java記憶體區域與記憶體溢位異常 之 虛擬機器物件
本部落格參考《深入理解Java虛擬機器》(第二版)一書,提取重點知識,再加以個人的理解編寫而成。轉載請標明來源。 JAVA虛擬機器(JVM)劃重點 第二章 Java記憶體區域與記憶體溢位異常 之 虛擬機器物件 Java物件的建立 1、類載入過程
JAVA虛擬機器(JVM)劃重點 第二章 Java記憶體區域與記憶體溢位異常 之 執行時資料區域
本部落格參考《深入理解Java虛擬機器》(第二版)一書,提取重點知識,再加以個人的理解編寫而成。轉載請標明來源。 JVM劃重點 第二章 Java記憶體區域與記憶體溢位異常 之 執行時資料區域 概述 執行時資料區域 程式計數器 Java虛擬機
Linux學習筆記之Python3的安裝以及建立虛擬環境(CentOS)
body { background: #f4f4f4 } .title { width: 100%; background: #5cb85c; padding: 5px; font-size: 20px; margin: 5px } .sub_title { width: 99%; background: #
k8s搭建之初始環境準備-vagrant部署虛擬機器(一)
k8s搭建之初始環境準備-虛擬機器篇(一) 我相信很多搭建k8s 叢集的小夥伴最頭疼的一件事情就是,我沒有那麼多機器啊,別說高可用,就算是一個master一個node 用VM都煩的很,安裝的哪個圖形化就要點老半天,snapshot 快照要是沒有準備,環境搞得亂七
【PHP7原始碼分析】如何理解PHP虛擬機器(一)
順風車運營研發團隊 李樂 1.從物理機說起 虛擬機器也是計算機,設計思想和物理機有很多相似之處; 1.1馮諾依曼體系結構 馮·諾依曼是當之無愧的數字計算機之父,當前計算機都採用的是馮諾依曼體系結構;設計思想主要包含以下幾個方面: 指令和資料不加區別混合儲存在同一個儲
Java程式設計師從笨鳥到菜鳥之(九十三)深入java虛擬機器(二)——類的生命週期(上)類的載入和連線
類載入器,顧名思義,類載入器(class loader)用來載入 Java 類到 Java 虛擬機器中。一般來說,Java 虛擬機器使用 Java 類的方式如下:Java 源程式(.java 檔案)在經過 Java 編譯器編譯之後就被轉換成 Java 位元組程式碼(.class 檔案)。類載
Java虛擬機器(二)物件的建立與OOP-Klass模型
相關文章 Java虛擬機器系列 前言 在前一篇文章中我們學習了Java虛擬機器的結構原理與執行時資料區域,那麼我們大概知道了Java虛擬機器的記憶體的概況,那麼記憶體中的資料是如何建立和訪問的呢?這篇文章會給你答案。 1.物件的建立 物件的建立通常是通過new一個物件而