QEMU-KVM中的多執行緒壓縮遷移技術
導讀 | 目前的遷移技術,都是透過向QEMUFILE中直接寫入裸記憶體資料來達到傳送虛擬機器的目的端,這種情況下,傳送的資料量大,從而會導致更高的遷移時間(total time)和黑宕時間(downtime)。本文介紹的方法,在傳送前對客戶機記憶體進行壓縮,在目的端接收到記憶體後,進行對資料進行解壓縮,從而恢復客戶機的記憶體。 |
使用帶壓縮技術的遷移後,傳輸的資料總量會減少60%,總遷移時間減少70%+,同時當機時間減少50%以上。一方面,壓縮/解壓縮的過程會消耗CPU週期而加大了遷移的時間;另一方面,總傳輸資料量的銳減,又會減少遷移時間。為了能夠進行高速的壓縮,本技術中使用了多執行緒併發的方式,提高壓縮的目前虛擬機器中,使用ZLIB完成壓縮/解壓縮的工作。
在CPU相同的情況下,ZLIB官方給出,解壓縮的速度是壓縮速度的4倍。也就是說,如果遷移的源端和目的端處理器相同的情況下,使得壓縮執行緒數量是解壓縮執行緒數量的4倍就可以在資源消耗最小的情況下,取得最優的壓縮為了更多的適應網路狀況,虛擬機器中引入了壓縮級別 -- Compression level。Compression level可以用來控制壓縮速率和壓縮比例。高的壓縮比率會消耗更多的時間,level 0就代表不進行壓縮, 1級代表最優的壓縮速率, 9級代表了最好的壓縮比率(最多的壓縮時間)。我們可以選擇從0級到9級中的任意一個級別。
壓縮/解壓縮時間將會消耗CPU週期。所以,如果整個系統CPU都被壓得非常滿的情況下,避免使用這個特性。當網路頻寬有限,CPU資源又足夠充足的情況下,使用多執行緒壓縮動態遷移技術會帶來比較好的效果。當網路充足且CPU資源充足的情況下,使用本技術也將會減少總遷移時間。
1. 啟動虛擬機器
/home/liufeng/qemu-system-x86_64 -machine accel=kvm -hda ./disk0.img -m 2048 -vnc 192.168.2.106:0 -monitor stdio
2. 使能源端多執行緒壓縮動態遷移技術
a.) migrate_set_capabilitycompress on //使能壓縮 b.) migrate_set_parametercompress-threads 12 //12個壓縮執行緒 c.) migrate_set_parametercompress-level 1 //壓縮級別為1級
3. 開始遷移
migrate -d tcp:192.168.2.105:6666
1. 啟動虛擬機器
/home/liufeng/qemu-system-x86_64 -machine accel=kvm -hda /home/kvm/vm/disk/disk0.img -m 2048 -vnc 192.168.2.105:0 -monitor stdio -incoming tcp:192.168.2.105:6666
2. 使能目的端多執行緒壓縮動態遷移技術
a.) migrate_set_capabilitycompress on b.) migrate_set_parametercompress-level 1 c.) migrate_set_parameterdecompress-threads 3 //3個壓縮執行緒
3. 等待遷移完成
CPU: Intel(R) Xeon(R) CPU E5-2650 v3 @2.30GHz
Logic core: 40
Socket : 2
RAM: 128G
NIC: 1000baseT/Full
Host OS:
release 7.2.1511 (Core) 64-bit
Guest OS: CentOS Linux release 7.2.1511 (Core) 64-bit
|
原動態遷移 |
多執行緒壓縮技術動態遷移
壓縮級別: 1 壓縮執行緒數: 12 解壓縮執行緒數:3 |
遷移總時間(msec): | 9536 | 4466 |
Downtime時間(msec): | 34 | 22 |
傳輸資料量(KB) | 307783 | 140445 |
效果:總的遷移時間減少50%;downtime時間減少35%
|
原動態遷移 |
多執行緒壓縮技術動態遷移
壓縮級別: 1 壓縮執行緒數: 12 解壓縮執行緒數:3 |
遷移總時間(msec): | 11720 | 5652 |
Downtime時間(msec): | 169 | 21 |
傳輸資料量(KB) | 311554 | 140189 |
效果:總遷移時間減少了200%,downtime時間減少了800%
虛擬機器實現程式碼分析如下(本分析基於:QEMU 2.5):
有migration_thread()進行遷移工作,在iterator和complete階段,如果發現使能了多執行緒壓縮技術,則透過compress_page_with_multi_thread()完成資料的壓縮和傳送
最終在compress_page_with_multi_thread()中啟用壓縮執行緒,透過zlib的compress2()函式完成資料的壓縮,並透過QEMU-FILE傳送
1. 壓縮演算法
a. 目前使用的是開源zlib庫完成壓縮,還有其他壓縮庫的壓縮方式可以提供,以便適應更多的場景
b. 商業壓縮庫有著更好的效率
c. 透過FPGA進行硬體輔助壓縮
2. 壓縮策略
a. 虛擬機器遷移演算法自適應所有網路,對網路進行測試(是否滿足上面的公式),然後形成反饋因子輸入到遷移演算法中,遷移演算法根據反饋因子決定使用的壓縮演算法、壓縮級別或者根本不壓縮,達到在所有網路狀況下而縮短downtime的目的。
原文來自:
來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/69955379/viewspace-2912893/,如需轉載,請註明出處,否則將追究法律責任。
相關文章
- 遷移執行緒migration執行緒
- 多執行緒核心技術(1)-執行緒的基本方法執行緒
- iOS 多執行緒的四種技術方案iOS執行緒
- 【併發技術01】傳統執行緒技術中建立執行緒的兩種方式執行緒
- 多執行緒與併發-----Lock鎖技術執行緒
- Java中的多執行緒Java執行緒
- Android中的多程式、多執行緒Android執行緒
- Python中的多工:多執行緒Python執行緒
- 【併發技術02】傳統執行緒技術中的定時器技術執行緒定時器
- python多執行緒中:如何關閉執行緒?Python執行緒
- Linux中Bin檔案壓縮包解壓執行Linux
- Java中多執行緒的案例Java執行緒
- 多執行緒和多執行緒同步執行緒
- 保證執行緒安全的技術執行緒
- JSRE中的多工與多執行緒JS執行緒
- 執行緒以及多執行緒,多程式的選擇執行緒
- 執行緒與多執行緒執行緒
- 多執行緒【執行緒池】執行緒
- 多執行緒--執行緒管理執行緒
- 多執行緒伺服器壓力測試執行緒伺服器
- 細說 Android 下的多執行緒,學會了多執行緒,你就學會了壓榨CPU!Android執行緒
- 多執行緒(五)---執行緒的Yield方法執行緒
- 【Java多執行緒】執行緒安全的集合Java執行緒
- Java多執行緒-執行緒池的使用Java執行緒
- Qt中的多執行緒與執行緒池淺析+例項QT執行緒
- Java中的多執行緒詳解Java執行緒
- Java多執行緒中執行緒安全與鎖問題Java執行緒
- Java多執行緒-執行緒中止Java執行緒
- 多執行緒之初識執行緒執行緒
- 影片壓縮技術簡介
- 多執行緒------執行緒與程式/執行緒排程/建立執行緒執行緒
- 多執行緒系列(1),多執行緒基礎執行緒
- java多執行緒之執行緒的基本使用Java執行緒
- 【Java】【多執行緒】執行緒的生命週期Java執行緒
- 《Java 多執行緒程式設計核心技術》筆記——第3章 執行緒間通訊(三)Java執行緒程式設計筆記
- 《Java 多執行緒程式設計核心技術》筆記——第3章 執行緒間通訊(四)Java執行緒程式設計筆記
- a、多執行緒執行緒
- 多執行緒的概述執行緒