標籤:
測試環境:
作業系統:CentOS7、openstacknova-docker啟動的centos7、openstack環境啟動的centos7虛擬機器
CPU:Intel(R) Xeon(R) CPU E5-2690 v3 @ 2.60GHz * 2
記憶體:Micron 2133MHz 16G * 8
網卡:Intel Corporation 82599ES 10-GigabitSFI/SFP+ Network Connection
關鍵字:Linpack、netperf、iometer
docker與虛擬機器計算效率比較
在測試中是通過運算Linpack程式來獲得計算能力資料的。結果如所示:
圖中從左往右分別是物理機、docker和虛擬機器的計算能力資料。可見docker相對於物理機其計算能力幾乎沒有損耗,而虛擬機器對比物理機則有著非常明顯的損耗。虛擬機器的計算能力損耗在50%左右。
為什麼會有這麼大的效能損耗呢?一方面是因為虛擬機器增加了一層虛擬硬體層,運行在虛擬機器上的應用程式在進行數值計算時是運行在Hypervisor虛擬CPU上的;另外一方面是由於計算程式本身的特性導致的差異。虛擬機器虛擬cpu架構不同於實際cpu架構,數值計算程式一般針對特定的cpu架構有一定的最佳化措施,虛擬化使這些措施作廢,甚至起到反效果。比如對於本次實驗的平台,實際的CPU架構是2塊物理CPU,每塊CPU擁有16個核,共32個核,採用的是NUMA架構;而虛擬機器則將CPU虛擬化成一塊擁有32個核的CPU。這就導致了計算程式在進行計算時無法根據實際的CPU架構進行最佳化,大大減低了計算效率。
docker與虛擬機器記憶體訪問效率比較
記憶體訪問效率的比較相對比較複雜一點,主要是記憶體訪問有多種情境:
(1)大批量的,連續地址塊的記憶體資料讀寫。這種測試環境下得到的效能資料是記憶體頻寬,效能瓶頸主要在記憶體晶片的效能上;
(2)隨機記憶體訪問效能。這種測試環境下的效能資料主要與記憶體頻寬、cache的命中率和虛擬位址與物理地址轉換的效率等因素有關。
以下將主要針對這兩種記憶體訪問情境進行分析。在分析之前我們先概要說明一下docker和虛擬機器的記憶體訪問模型差異。是docker與虛擬機器記憶體訪問模型:
可見在應用程式記憶體訪問上,虛擬機器的應用程式要進行2次的虛擬記憶體到實體記憶體的映射,讀寫記憶體的代價比docker的應用程式高。
是情境(1)的測試資料,即記憶體頻寬資料。左圖是程式運行在一塊CPU(即8核)上的資料,右圖是程式運行在2塊CPU(即16核)上的資料。單位均為GB/s。
資料可以看出,在記憶體頻寬效能上docker與虛擬機器的效能差異並不大。這是因為在記憶體頻寬測試中,讀寫的記憶體位址是連續的,大批量的,核心對這種操作會進行最佳化(資料預存取)。因此虛擬記憶體到實體記憶體的映射次數比較少,效能瓶頸主要在實體記憶體的讀寫速度上,因此這種情況docker和虛擬機器的測試效能差別不大;
記憶體頻寬測試中docker與虛擬機器記憶體訪問效能差異不大的原因是由於記憶體頻寬測試中需要進行虛擬位址到物理地址的映射次數比較少。根據這個假設,我們推測,當進行隨機記憶體訪問測試時這兩者的效能差距將會變大,因為隨機記憶體訪問測試中需要進行虛擬記憶體地址到實體記憶體地址的映射次數將會變多。結果如所示。
左圖是程式運行在一個CPU上的資料,右圖是程式運行在2塊CPU上的資料。從左圖可以看出,確實如我們所預測的,在隨機記憶體訪問效能上容器與虛擬機器的效能差距變得比較明顯,容器的記憶體訪問效能明顯比虛擬機器優秀;但出乎我們意料的是在2塊CPU上運行測試程式時容器與虛擬機器的隨機記憶體訪問效能的差距卻又變的不明顯。
針對這個現象,IBM的論文給出了一個合理解釋。這是因為當有2塊CPU同時對記憶體進行訪問時,記憶體讀寫的控制將會變得比較複雜,因為兩塊CPU可能同時讀寫同一個地址的資料,需要對記憶體資料進行一些同步操作,從而導致記憶體讀寫效能的損耗。這種損耗即使對於物理機也是存在的,可以看出右圖的記憶體訪問效能資料是低於左圖的。2塊CPU對記憶體讀寫效能的損耗影響是非常大的,這個損耗佔據的比例遠大於虛擬機器和docker由於記憶體訪問模型的不同產生的差異,因此在右圖中docker與虛擬機器的隨機記憶體訪問效能上我們看不出明顯差異。
docker與虛擬機器啟動時間及資源耗費比較
上面兩個小節主要從運行在docker裡的程式和運行在虛擬機器裡的程式進行效能比較。事實上,docker之所以如此受到開發人員關注的另外一個重要原因是啟動docker的系統代價比啟動一台虛擬機器的代價要低得多:無論從啟動時間還是從啟動資源耗費角度來說。docker直接利用宿主機的系統核心,避免了虛擬機器啟動時所需的系統引導時間和作業系統啟動並執行資源消耗。利用docker能在幾秒鐘之內啟動大量的容器,這是虛擬機器無法辦到的。快速啟動、低系統資源消耗的優點使docker在彈性雲平台和自動營運系統方面有著很好的應用前景。
docker與虛擬機器網路效能比較
採用netperf軟體,分別使用TCP_STREAM | UDP_STREAM | TCP_RR | UDP_RR 四中模式測試效能和延遲
docker與虛擬機器儲存效能比較
採用iometer分別以順序讀、隨機讀、順序寫、隨機寫四中模式對如下3中情境進行測試,測試過程中檔案系統採用ext4 測試前預熱30s,每一種測試案例測試時間3分鐘
參考文獻
cbl709《docker與虛擬機器效能比較》2015-02-26
@線超博《Native、Docker容器和KVM虛擬機器網路效能對比測試》
docker效能測試