Subversion (SVN) 是一種開源的版本控制系統,它為源文件、腳本、二進制文件和其它文件類型的存儲、訪問和并行開發提供便利。雖然 Subversion 非常流行,但是很多用戶在導入或簽入二進制文件,以及導出或簽出二進制文件時,都體驗到難于接受的長時間的等待。幸運的是,一旦理解了導致該性能問題的原因,就可以在您的系統中避免它。
在本文中,我將介紹在調查實際 Subversion 文件系統中與二進制文件相關的性能退化問題時的經驗。我會解釋系統用戶和管理員所遇到的一些基本問題,然后展示對造成這些問題的起因的調查結果。最后,對調查結果作一個概述,并就優化 Subversion,以縮短訪問時間和/或減少服務器消耗的空間提出一些建議。
本文主要面向將 Subversion 用于版本控制,并且希望提高存儲二進制文件時的性能的系統管理員。此外,本文也適用于希望設置一個用于存儲二進制文件的 Subversion 系統的任何人。如果需要閱讀對 Subversion 的介紹,請參閱參考資料。
為什么存儲二進制文件?
什么是二進制文件?在本文的上下文中,二進制文件是指已經被編譯過的文件。也可以將二進制文件看作沒有被存儲為可讀文本的文件?蓤绦形募、本地庫和 Java™ 類文件都是二進制文件。移入和移出 Subversion 的一組文件有時候也被稱作 “二進制文件”。二進制文件不能像可讀文件那樣執行diff命令,因此當被存儲到版本控制系統中時,會具有不同于標準文件的特征。
版本控制系統通常用于文件備份、并行開發和變更管理。開發小組常常用版本控制系統來管理應用程序源文件。有時候,版本控制系統也被用于管理工具,偶爾也用于存儲二進制文件。使用像 Subversion 這樣的系統來存儲二進制文件的一個缺點就是訪問時間:從版本控制系統中取出二進制文件通常比從另一臺機器或一個共享驅動器中復制或通過 FTP 傳送二進制文件要慢得多。另一方面,與其它類型的文件系統相比,版本控制系統通常需要的存儲空間更少。
Subversion 和其它版本控制系統可以使用只存儲新版本與之前版本之間的差異,而不是整個文件的一種算法來保存文件。這里保存的差異數據被稱作增量(delta),或者文件的增量。由于版本控制系統無需完整地存儲每個新版本,因而用于數據存儲的磁盤空間比標準文件系統要少。
大多數版本控制系統不能將二進制文件存儲為增量,但 Subversion 卻可以。很多系統管理員既希望節省磁盤空間,同時又希望將源文件和二進制文件保存在同一個系統中,并保持同步。要是現實中的 Subversion 的二進制存儲能像理論中所說的那樣工作就太好了。
回頁首
現實中的情況
最近我調查了現實開發系統中 Subversion 與二進制存儲相關的一些性能問題。當我開始調查時,這個系統已經運行了幾個月。開發小組全體人員都受益于將源文件、腳本和二進制文件一起存儲在同一個版本控制文件系統中并保持同步的做法。通過一條命令就能獲得整個開發環境,這將大大減少出現錯誤的機會。這也有助于降低新開發人員入門的門檻。
然而,開發小組越來越擔心兩個問題。第一個問題是簽出或導出二進制文件所需的時間,這是系統所有用戶都有過體驗的。與直接從另一臺機器或一個共享的大磁盤上復制文件相比,使用 Subversion 要慢好幾個數量級。而第二個問題只有系統管理員清楚,那就是二進制文件所占的大量空間。
發現這兩個問題之后,我們開始調查情況。我們希望繼續將二進制文件存儲在 Subversion 文件系統中,但是首先需要發現一種辦法來解決時間和空間問題。
調查的細節開發系統是一個異構環境,由多個平臺和操作系統組成,但是系統的所有部分都不能避免由于 Subversion 對二進制文件的處理而導致的性能問題。因此,我們首先以不同的方式將各種不同的二進制文件移入或移出 Subversion,以不同的格式存儲它們,并且使用各種形式的認證。我們在一個受控的環境中執行這些操作,以便能夠估計每種變化的影響。在本文中,我不會描述調查的內部工作,但是我會解釋結果和結論。
二進制存儲格式比較
調查的第一步是考察各種不同的存儲方法對將二進制文件放入 Subversion、從中取出以及按原始格式放回等操作所需時間的影響。我們嘗試了四種方法:將二進制文件以大型目錄結構的形式放入 Subversion,創建一個包含目錄結構的文件然后將該文件放入 Subversion 中,壓縮單個文件,以及以增量形式保存二進制文件,而不是每次將整個新版本存入 Subversion 中。
表 1顯示了多種在 Subversion 中存儲二進制文件的方法。它還顯示了將二進制文件移入和移出 Subversion 所花的時間。這些存儲方法的細節如下:
壓縮的 tar 格式 - 導入 - 導出:將二進制目錄組合成單個壓縮的 tar 文件(一個 tar.gz 文件),然后使用import命令將其存入 Subversion 中。之后,使用export命令從 Subversion 中取出該文件,然后從壓縮的 tar 文件中檢索原始目錄(也就是說,文件被解壓。) tar 格式 - 導入 - 導出:與前一種方法幾乎相同,但是在這里,文件沒有被壓縮,所以它是 tar 文件,而不是 tar.gz 文件。 導入 - 導出:使用import命令將二進制目錄原樣存入 Subversion 中。然后,使用export命令檢索它們。 高效簽入:使用一個高效簽入腳本將二進制目錄存入 Subversion 中。然后使用export命令檢索二進制文件。(關于高效簽入腳本,請參閱下面的內容。)我們收集了很多結果,以確定被證實的發現。表 1 顯示了一個代表性的例子:
表 1. 比較不同存儲格式消耗的時間
方法輸入時間輸出時間 壓縮的 tar 格式 - 導入 - 導出 1m 28s 0m 30s tar 格式 - 導入 - 導出 1m 51s 0m 47s 導入 - 導出 28m 0s 9m 30s 高效簽入 - 導出 2h 15s 9m 30s
注意,每當使用import命令將一項內容存入 Subversion 中,就是存儲該項的整個副本,而不會嘗試以增量形式存儲它。因此,import命令比較快,但是空間效率不高。Subversion 附帶有一個腳本,該腳本嘗試以高空間效率簽入文件。高效簽入腳本將要存入 Subversion 的版本與已有的版本進行比較。然后,以兩者之間的增量的形式存儲新版本。
時間測試結果
表 1 顯示的結果清楚地表明,所使用的二進制存儲格式對于將二進制文件移入和移出 Subversion 所需的時間有很大的影響。時間效率最高的方法就是創建一個壓縮的包含二進制的文件。即使創建一個單獨的、不壓縮的包含二進制的文件,所花的時間也仍然少于以初始結構導入二進制文件所需時間的十分之一。
這些結論之所以正確,是因為很多 Subversion 的導入處理時間都花在要處理的目錄的重現上,所以創建單個文件反而可以大大節省時間。使用 Subversion 的高效簽入腳本會導致難于接受的等待時間。該腳本之所以要花費那么多時間,是因為它實際上要將整個二進制文件的副本導出到本地磁盤,以進行比較。
這些研究只考慮不同的存儲方法對向 Subversion 存儲、訪問和檢索二進制文件所需時間的影響。我們仍然需要調查以不同存儲格式存儲二進制文件所需的大量服務器磁盤空間。
文章來源于領測軟件測試網 http://www.kjueaiud.com/