天天看點

比較虛拟機檔案系統的性能

基于虛拟機并使用 Vagrant

(譯注:Vagrant用于建立和部署自動化虛拟化開發環境)開發環境主要瓶頸是檔案系統的性能。各平台的CPU差別是很小的,甚至可以忽略不計,而且RAM隻有在很多虛拟機(譯注:指同一台實體機上的虛拟機)都活躍時才會成為性能瓶頸。昨天我花了大部分時間測試并分析了通用的檔案系統機制,現在把我結果分享給大家。

我将以對結果的分析開始,因為這是絕大部分人最感興趣的部分。其他諸如具體測試方法、使用的軟體、我所得到結果的原始資料等可以在分析的後面看到。

在下面呈現的每一個圖表中,我們以不同的方式測試讀寫一個檔案。對于每一個圖表,寫入檔案總大小是固定的。Y軸是以KB/s為機關的吞吐率,X軸是“記錄大小”或者一次性被讀/寫的大塊資料大小,以KB為機關。

不同的測試環境如下:本地、VirtualBox本地、VMware本地、VirtualBox共享檔案夾(vboxsf)、VMware共享檔案夾(vmhgfs)、NFS。”本地“是指用測試環境中自己的檔案系統。”本地“是在主控端器上,” VirtualBox本地“是在VirtualBox虛拟機跟裝置上,諸如此類。NFS隻在VirtualBox上進行測試,因為VirtualBox和VMware的性能特點應該很相近。

對于所有圖示,吞吐率(Y軸)越高越好。

小檔案的順序讀取

首先,是一個對64KB檔案的串行讀取操作,測試了讀取各種記錄大小。在真實環境中對小檔案進行串行讀取的操作一般有運作時加載應用程式的源碼,編譯,或者測試。

比較虛拟機檔案系統的性能

第一件你注意到的但無力改變的事情莫過于,NFS對于小檔案的讀取性能簡直無法相信。NFS性能很強悍很可能是因為由于大量預讀和緩存操作。我對于NFS性能比本地虛拟檔案系統好沒有很好地理論解釋。

這裡的VMware共享檔案夾正好可以幹掉VirtualBox共享檔案夾。VirtualBox共享檔案夾的讀取性能簡直糟透了。如果你看過原始資料,你會發現吞吐率從沒超過100MB/s,然後VMware從沒低于500MB/s,甚至高峰時是900MB/s。

有意思的是,有時候虛拟中的本地檔案系統性能竟然比主控端的好。這個測試用的是原始不帶使用者空間緩存的read()系統調用。很可能虛拟機管理器會為虛拟機的讀操作進行提前緩存,是以它們的性能會比需要進行上下文交換的主控端作業系統核心要好。以上理論也可以從調用fread()的基準測試程式的原始資料中得出。在那些測試中,主控端的本地檔案系統每次都能打扮虛拟機的檔案系統(譯注:fread()和read()的很大不同之一是,前者帶緩沖,後者不帶緩沖,是以這裡如果都有緩沖,顯然本地檔案系統性能要好)。

大檔案的随機讀取

這裡測試随機從64MB檔案讀取任意大小的塊的吞吐量,和上面一樣是讀取各種記錄大小。這個檔案是之前測試檔案的1000倍。這種類型的操作可以在處理資料庫的讀請求時見到。

比較虛拟機檔案系統的性能

對比上一個針對小檔案串行讀取的試驗,VMware共享檔案夾和VirtualBox共享檔案夾的性能差别變得非常大。VirtualBox表現得十分差,以至于你都不容易在上圖中看到它。再一次地,VirtualBox的吞吐量從沒超過100MB/s,另一方面,VMware的峰值卻是7GB/s。因為VirtualBox的吞吐量在各種測試中基本沒差别,我推斷在VirtualBox共享檔案夾系統裡有一個代碼熱路徑限制了其性能,很明顯VirtualBox有地方做的不對。

NFS變得沒有之前的試驗突出了,很可能因為它的預讀取在該測試裡受益有限。盡管如此,相比其他選擇,NFS仍然表現得非常好。

但是,就像之前的實驗一樣,我們仍然能發現在虛拟機裡的性能比主控端的要好,這還是因為虛拟機管理器會很聰明的做緩存操作,然而主控端的原始的系統調用是不會允許這種事情發生的。

小檔案串行寫

讓我們看看針對小檔案的串行寫操作。這種情況很精确的描述了存儲段狀态、臨時檔案,或者編寫新的源代碼檔案。

比較虛拟機檔案系統的性能

第一個值得注意的事情是,針對這種寫操作NFS性能變得十分差。這裡可沒有供NFS做的緩存操作,是以你必須支付因為網絡開銷帶來的代價,以及在主控端那裡再寫到磁盤,最後還要等待VM(虛拟機)寫操作成功信号。天哪!

各種”本地“檔案系統表現得都非常好,又一次虛拟機打敗了主控端,再一次,這還是因為虛拟機管理器的緩存操作。

共享檔案系統表現相近,但是本次試驗的VirtualBox明顯地擊敗了VMware。

大檔案随機寫

我們要看的最後一張表是測試随機寫一個大檔案(64MB)。就像我們的大檔案随機讀測試一樣,這是一個針對資料庫如何表現的很好地測試。

比較虛拟機檔案系統的性能

這裡真的和小檔案串行寫的實驗差不多,因為這裡測試的是大檔案,是以不同測試之間的差別會大一些,但是除此之外,結果基本上一樣。

NFS在寫的時候表現依然糟糕。VirtualBox共享檔案夾在寫操作上繼續打敗VMware,并且虛拟機管理器性能還是比主控端好。

虛拟機管理器表現得比主控端好是我最感興趣的地方。測試結果明顯的标示,虛拟機管理器一定是謊稱同步寫(譯注:而非真實同步寫)。這也就證明了我用

Packer

看到的,如果虛拟機沒有被正确的關閉,你送出的那些寫操作就會丢失。虛拟機的fsync()調用不是表示資料被寫到了主控端硬碟上,隻是将寫操作送出給了虛拟機管理器。

整體分析

置于共享檔案系統,VMware有你想要的虛拟機管理器。加載web頁面,運作測試用例,編譯軟體等都屬于繁重讀操作。VMware共享檔案夾的讀性能會幹掉VirtualBox,盡管VirtualBox共享檔案夾的寫性能稍微比VMware好一點。

如果你可以選擇使用NFS,那麼就用NFS。再次強調,讀性能要比寫性能有價值的多。

虛拟機管理器讀/寫性能都很出色(因為它作弊)。由于以上資料,我肯定會專注于Vagrant新的隻用本地檔案系統的同步檔案夾實作(例如rsync,或者用本地檔案系統作為NFS用戶端而不是服務端)。

更直接地:如果你用虛拟機進行開發,如果可能的話,把資料庫檔案移出共享檔案系統。你會看到很大的性能提升。

最後,我不認為以上結果有令人非常驚訝的地方,自從2010年後,Vagrant已經支援NFS同步檔案夾,因為我們很早就意識到共享檔案夾的性能很差。但是,用一些資料去标示不同的行為是值得做的,并且,這也為每一個系統在做什麼提供了一些有意思的見解。

測試軟體,配置,原始資料

主控端是一個2012年的Retina MacBook Pro,硬碟256G SSD,運作Mac OS X10.9.1作業系統,這裡标示成本地。

VirtualBox版本是4.3.4,運作Ubuntu12.04虛拟機,其中安裝并使用了VirtualBox客戶插件。測試中的VirtualBox的跟裝置被格式化城ext3檔案系統。在跟裝置上的測試被标示成VirtualBox本地。然而在共享檔案系統(vboxsf)上的測試被标示成VirtualBox共享檔案夾(vboxsf)。

VMware Fusion版本是6.0.2運作Ubuntu12.04,其中安裝并使用了VMware Tools 5.0。測試中VMware中的跟裝置被格式化城ext3檔案系統。在跟裝置上的測試被标示成VMware本地。然而在共享檔案系統(vmhgfs)上的測試被标示成VMware共享檔案夾(vmhgfs)。

NFS伺服器是OS X 10.0.1附帶并建構的。NFS用戶端來自于Ubuntu12.04中的nfs-common安裝包,在UDP之上采用NFS協定3,在NFS上的測試被标示成NFS in VirtualBox。

基準測試軟體是

Iozone Filesystem Benchmark

從用于64位linux的源碼中編譯而來。同樣的二進制被用于每一個測試場景,除了本地測試是用的一個從源碼編譯而來的lozone 32位OS X二進制。Lozone的參數是-Racb。

除了以上提及的,剩餘的設定和沒提到的都是預設或者沒有用到。

以上測試的原始資料可以在這個

Excel workbook

中擷取。還有很多其他圖示在這個

imgur album

中。