本發明涉及云計算領域,具體是涉及一種提高虛擬機資源利用率的裝置及方法。
背景技術:
當前云計算領域大量使用了分布式存儲,當分布式存儲可以作為云主機后端的塊存儲時,通常分布式存儲都要提供一個私有的客戶端程序,應用程序通過存儲客戶端連接到存儲的server端。為了提高客戶端訪問存儲的性能,客戶端程序會啟用大量的線程,通過大量線程來提高訪問存儲的并發性。
在云計算的環境下,每個虛擬機進程在連接和使用分布式存儲時,都需要占用大量的線程資源和文件描述符,如圖1所示。分布式存儲中每塊硬盤對應一個OSD(Object Storage Daemon,對象存儲設備),一個存儲容量在PB(Peta Byte,千萬億字節)級別的生產環境中,磁盤的數量會有幾千塊,每一個存儲客戶端都會啟用幾百個線程處理IO(Input/Output,輸入/輸出),例如500個,同時每個client(客戶端)都會和所有OSD建立連接,以保證客戶端能夠正常讀寫數據。
為了提高資源的利用率,一臺物理主機上會運行盡可能多的虛擬機,當虛擬機較多時,例如30個以上的虛擬機,那么占用的系統線程數就達到了30×500=15000,在進行讀寫操作時,操作系統會占用大量的CPU(Central Processing Unit,中央處理器)處理線程切換,此時會降低虛擬機的讀寫性能,并且隨著物理機上虛擬機數目的增加,導致系統額外的開銷,對虛擬機性能的影響會進一步加劇。
技術實現要素:
本發明的目的是為了克服上述背景技術的不足,提供一種提高虛擬機資源利用率的裝置及方法,當同一臺物理機上的虛擬機增加時,系統占用的線程資源保持不變,不會因為虛擬機的增加而導致系統額外的開銷,不影響虛擬機的性能。
本發明提供一種提高虛擬機資源利用率的裝置,該裝置包括若干代理模塊和一個執行模塊,其中,代理模塊位于虛擬機內部,執行模塊位于虛擬機外部;
所述代理模塊用于:將原有的輸入/輸出IO處理部分從虛擬機內移除,只通過一個單線程接收虛擬機磁盤的IO請求,然后轉發給執行模塊;
所述執行模塊用于:啟動時創建用于處理IO請求的線程池,并與每一個對象存儲設備OSD建立鏈接,用于將IO請求發送到OSD節點;將代理模塊發來的IO請求數據按照固定長度進行分片,對分片后的IO請求數據進行計算,計算出分片后的IO請求數據需要保存到的OSD的位置,然后通過已經建立的鏈接,將分片后的IO請求數據發送到對應的OSD上。
在上述技術方案的基礎上,所述執行模塊與每一個OSD建立傳輸控制協議鏈接。
在上述技術方案的基礎上,所述代理模塊作為虛擬機進程的一部分,接收每個虛擬機的IO請求,但是不處理這些IO請求,也不需要連接到所有的OSD;當虛擬機需要訪問存儲時,代理模塊將需要訪問的IO請求轉發到執行模塊。
在上述技術方案的基礎上,所述執行模塊啟用多線程并發處理代理模塊發送過來的IO請求,當同一臺物理機上的虛擬機增加時,系統占用的線程資源保持不變。
本發明還提供一種應用于上述裝置的提高虛擬機資源利用率的方法,包括以下步驟:
S1、在虛擬機訪問存儲之前,執行模塊先啟用執行服務,創建用于處理輸入/輸出IO請求的線程池,并與每一個OSD建立鏈接,用于將IO請求發送到OSD節點;
S2、用戶創建虛擬機時,生成一個虛擬機進程,虛擬機進程中包括代理模塊,代理模塊僅僅作為一個虛擬機進程中的一個線程存在,且代理模塊對虛擬機提供的IO接口保持不變;
S3、代理模塊接收虛擬機的IO請求后,直接將IO請求放入隊列中,代理模塊將隊列中的IO請求按照順序逐一取出,發送給執行模塊;
S4、執行模塊將代理模塊發來的IO請求數據按照固定長度進行分片,對分片后的IO請求數據進行計算,計算出分片后的IO請求數據需要保存到的OSD的位置,然后通過已經建立的鏈接,將分片后的IO請求數據發送到對應的OSD上。
在上述技術方案的基礎上,步驟S1中,所述執行模塊與每一個OSD建立傳輸控制協議鏈接。
在上述技術方案的基礎上,步驟S3中,所述代理模塊作為虛擬機進程的一部分,接收每個虛擬機的IO請求,但是不處理這些IO請求,也不需要連接到所有的OSD;當虛擬機需要訪問存儲時,代理模塊將需要訪問的IO請求轉發到執行模塊。
在上述技術方案的基礎上,步驟S4中,所述執行模塊啟用多線程并發處理代理模塊發送過來的IO請求,當同一臺物理機上的虛擬機增加時,系統占用的線程資源保持不變。
與現有技術相比,本發明的優點如下:
(1)本發明通過在虛擬機內增加代理的方式,將多個虛擬機所需要的線程資源進行整合,減少了虛擬機所屬節點的線程使用,當同一臺物理機上的虛擬機增加時,系統占用的線程資源保持不變,不會因為虛擬機的增加而導致系統額外的開銷,不影響虛擬機的性能。
(2)每個虛擬機不再需要和每個OSD都建立網絡連接,避免OSD太多時,系統資源不足的情況。
(3)在存儲的服務端,每個OSD只需要和每個物理主機建立一條數據傳輸通道,數據傳輸的效率會更高。
附圖說明
圖1是現有虛擬機進程在連接和使用分布式存儲時占用大量線程資源和文件描述符的示意圖。
圖2是本發明實施例中提高虛擬機資源利用率的裝置的結構框圖。
具體實施方式
下面結合附圖及具體實施例對本發明作進一步的詳細描述。
參見圖2所示,本發明實施例提供一種提高虛擬機資源利用率的裝置,該裝置包括若干代理模塊和一個執行模塊,其中,代理模塊位于虛擬機內部,執行模塊位于虛擬機外部,代理模塊的邏輯相對簡單,執行模塊用于真正的數據處理。
代理模塊用于:將原有復雜的IO(input/output,輸入/輸出)處理部分從虛擬機內移除,只通過一個單線程接收虛擬機磁盤的IO請求,然后轉發給執行模塊。
執行模塊用于:啟動時創建用于處理IO請求的線程池,并與每一個OSD建立TCP(Transmission Control Protocol,傳輸控制協議)鏈接,用于將IO請求發送到OSD節點;將代理模塊發來的IO請求數據按照固定長度進行分片,對分片后的IO請求數據進行計算,計算出分片后的IO請求數據需要保存到的OSD(Object Storage Daemon,對象存儲設備)的位置,然后通過已經建立的鏈接,將分片后的IO請求數據發送到對應的OSD上。
代理模塊作為虛擬機進程的一部分,負責接收每個虛擬機的IO(Input/Output,輸入/輸出)請求,但是代理模塊不再處理這些IO請求,也不需要連接到所有的OSD。當虛擬機需要訪問存儲時,代理模塊將需要訪問的IO請求轉發到執行模塊。
執行模塊一方面接收所有代理模塊發送過來的IO請求,另一方面負責連接到存儲后端的所有OSD。在執行模塊上啟用多線程并發處理代理模塊發送過來的IO請求,當同一臺物理機上的虛擬機增加時,系統占用的線程資源保持不變,操作系統進行線程切換的開銷不會隨著虛擬機的增加而增大,同時物理機上和OSD的連接數也大大減少了。
本發明實施例還提供一種應用于上述裝置的提高虛擬機資源利用率的方法,包括以下步驟:
S1、啟動執行服務。執行模塊作為一個獨立的服務存在,在虛擬機訪問存儲之前,需要先啟用執行服務,執行服務在啟動時創建用于處理IO請求的線程池,并與每一個OSD建立TCP(Transmission Control Protocol,傳輸控制協議)鏈接,用于將IO請求發送到OSD節點。
S2、創建虛擬機。用戶在創建虛擬機時,生成一個虛擬機進程,虛擬機進程中包括代理模塊,代理模塊僅僅作為一個虛擬機進程中的一個線程存在。同時,代理模塊對虛擬機提供的IO接口保持不變,所以上層的虛擬機不用感知代理模塊的存在。
S3、代理模塊轉發數據。代理模塊接收虛擬機的IO請求后,直接將IO請求放入隊列中,代理模塊將隊列中的IO請求按照順序逐一取出,發送給執行模塊。
代理模塊作為虛擬機進程的一部分,接收每個虛擬機的IO請求,但是不處理這些IO請求,也不需要連接到所有的OSD;當虛擬機需要訪問存儲時,代理模塊將需要訪問的IO請求轉發到執行模塊。
S4、數據處理。執行模塊收到代理模塊發來的IO請求后,將代理模塊發來的IO請求數據按照固定長度進行分片,對分片后的IO請求數據進行計算,計算出分片后的IO請求數據需要保存到的OSD的位置,然后通過已經建立的鏈接,將分片后的IO請求數據發送到對應的OSD上。
執行模塊啟用多線程并發處理代理模塊發送過來的IO請求,當同一臺物理機上的虛擬機增加時,系統占用的線程資源保持不變。
本領域的技術人員可以對本發明實施例進行各種修改和變型,倘若這些修改和變型在本發明權利要求及其等同技術的范圍之內,則這些修改和變型也在本發明的保護范圍之內。
說明書中未詳細描述的內容為本領域技術人員公知的現有技術。