漫談虛擬化--內核和IO
前言
時光如流水,來去匆匆,有的時候你并不知道你是虛擬的環境中還是在真實的環境中,一切只是內核kernel的感受而已。。。
一種不同的體驗,幾種不同的實現方式,那么。。。你又在娜里。。。
虛擬化的分類
虛擬化場景其實和現實一樣一樣的。。。。
在虛擬化的場景中,虛擬機有的時候知道自己運行在虛擬化環境之中,那么這種就需要修改內核,從而也就是1型虛擬化,例如vmware ESX和ESXI,直接由hypervisor來管理硬件,從而提供給上層的虛擬機使用,這個時候,虛擬機使用的內核調用方式就是hyper call,而不是常規的system call了,這種相對于其他的虛擬化技術,效率高了不少(虛擬機必須修改內核才能發起hypervisor call)。
在二型虛擬化中,也就是硬件上面運行的是一個宿主機,然后在其中運行了一個用戶空間的程序,用來提供上層虛擬機的管理,這種可以稱之為VMM(virtual machine monitor)或者hypervisor,在虛擬機進行調用相關指令的時候,都是發送請求到宿主機,然后被vmm捕獲到,然后再進行運行或者調用外部的硬件指令。這種由于指令都要進行最少一次的轉換,從而效率損失不少(虛擬機可以運行各種操作系統)。
在現實中,我們進公司的時候,到底是選擇外包呢,還是不選外包呢,在使用外包的時候,其實就是***種類型的虛擬化了,所有人都明確的知道自己在外包之中,從而直接調用外包公司的接口提供服務,這種效率可能很高,但是硬件環境肯定是差的,從而。。。。我也不知道到底是好不好,哈哈、。。。。
在不選擇外包的時候,每個人都生活在一個虛擬的空間之中,以為自己使用的是所有的CPU資源,以為自己使用的是所有的物理內存,以為自己能驅動所有的硬件,其實。。。。到底有多少資源能夠使用,這個也是不確定的,,,沒準,也只是生活在一種虛擬化的場景之中。。。夢中夢。。。
內存的虛擬化
在虛擬化場景中,CPU和內存其實是不可分割的,基本上使用的是哪個物理機的CPU,那么就必然會使用其內存,為啥呢?
CPU的硬件中,實現了兩種主要的芯片,一個是MMU,內存管理單元,主要是用來管理內存的,其實也就是從線性地址轉換到物理地址,在進程中,使用的線性地址,也就是每個進程能看到的內存地址其實是整個的物理地址,其中劃分了一部分為內核使用,剩余的都是進程使用的內存空間,而每次在進程使用變量的時候,那么這些變量值都是保存在內存之中,那么就要將這個地址在CPU中去找,然后就經過MMU,找到物理地址,而CPU的速度遠遠大于內存的速度,那么為了匹配這種速度,從而也就有了另外一種芯片,也就是TLB,主要就是用來緩存線性地址到物理地址轉換的物理結果,從而每次在尋找地址的時候,都是先找TLB,如果沒有那么就會經過MMU轉換,然后找到物理內存。
在CPU的物理結構中,有一級緩存,有二級緩存,有三級緩存,三級緩存一般是各個CPU共享的,從而有可能發生資源占用,從而也就從SMP的架構轉換到了NUMA架構,從而也就是非一致性內存訪問。主要的目的也就是為了提高性能,那么在使用CPU的時候,不可能去別的物理機上找到內存地址,然后讀取數據,從而為了提高速度和性能,也就是CPU和MEM基本上是綁定的,在同一個物理機上使用。
超賣的概念,CPU是虛擬的,內存也是虛擬的,其實VCPU也就是虛擬CPU,其實也就是物理機上的一個進程,其實你虛擬的cpu個數可以超過物理的核心數,但是一般超賣的比是1.5,看性能而定,并且要看服務器的壓力,也就是CPU的平均負載。內存也是虛擬的,而且有的類庫是每個進程或者每個虛擬機都會使用的,從而也可以超過物理內存,但是。。。好像沒有一個比例。
在模擬的場景中,一般的步驟就是虛擬機的的虛擬內存轉換成虛擬機的物理內存,然后轉換成宿主機的虛擬內存,然后找到真正的物理內存,需要經過兩次轉換,而且存在多個虛擬機的時候,每個虛擬機的TLB基本上都不能***,從而導致性能大大降低。
從而在硬件層面,提供了硬件輔助的虛擬化技術,例如tagged TLB,也就是對TLB加了一個字段,表示為是哪個虛擬機的線性地址到物理地址的轉換;例如提供了MMU的內存單元管理功能,也就是直接將虛擬地址換到物理機的虛擬地址,從而省略了轉換到虛擬機的物理地址的步驟,從而能大大的提高性能。
硬件支持的內存虛擬化(AMD Nested Page Tables[NPT]和Intel Extended Page Tables[EPT])
I/O的虛擬化
I/O設備,一般分為驅動器和設備本身,而驅動程序運行在內核中,在虛擬話的場景中,如果進程需要調度外部的IO設備,那么首先進程會調用虛擬機的驅動程序,驅動虛擬機的硬件,然后被物理機的vmm捕獲,然后將調用物理機的驅動程序,然后才真正的調用物理設備。也就是也分為兩步走。
在IO設備的虛擬化場景中,一種是使用模擬的方式,也就是通過軟件的模擬,在linux中,一切皆文件,從而也就是提供了一堆的文件進行調用。
一種是使用半虛擬化的方式,這種也是需要硬件的支持的,也就是虛擬機驅動程序直接調用的是物理機的驅動程序,然后驅動硬件,從而省略了虛擬機的驅動調用虛擬機的設備步驟。
***一種就是IO透傳技術,其主要使用的方式就是直接將一些網卡設備或者硬盤設備直接綁定給虛擬機使用,從而基本上達到物理硬件的性能,不過這些硬件的管理還是需要使用hypervisor來進行管理。
硬件支持的設備和I/O虛擬化(Intel VT-d,AMD IOMMU)
總結
虛擬化的出現不過是為了更好的利用物理主機的資源,例如CPU,內存,I/O。