Subversion 性能調優

Subversion (SVN) 是一種開源的版本控制系統,它爲源文件、腳本、二進制文件和其它文件類型的存儲、訪問和並行開發提供便利。雖然 Subversion 非常流行,但是很多用戶在導入或簽入二進制文件,以及導出或簽出二進制文件時,都體驗到難於接受的長時間的等待。幸運的是,一旦理解了導致該性能問題的原因,就可以在您的系統中避免它。

在本文中,我將介紹在調查實際 Subversion 文件系統中與二進制文件相關的性能退化問題時的經驗。我會解釋系統用戶和管理員所遇到的一些基本問題,然後展示對造成這些問題的起因的調查結果。最後,對調查結果作一個概述,並就優化 Subversion,以縮短訪問時間和/或減少服務器消耗的空間提出一些建議。

本文主要面向將 Subversion 用於版本控制,並且希望提高存儲二進制文件時的性能的系統管理員。此外,本文也適用於希望設置一個用於存儲二進制文件的 Subversion 系統的任何人。如果需要閱讀對 Subversion 的介紹,請參閱 參考資料

爲什麼存儲二進制文件?

版本控制系統通常用於文件備份、並行開發和變更管理。開發小組常常用版本控制系統來管理應用程序源文件。有時候,版本控制系統也被用於管理工具,偶爾也用於存儲二進制文件。使用像 Subversion 這樣的系統來存儲二進制文件的一個缺點就是訪問時間:從版本控制系統中取出二進制文件通常比從另一臺機器或一個共享驅動器中複製或通過 FTP 傳送 二進制文件要慢得多。另一方面,與其它類型的文件系統相比,版本控制系統通常需要的存儲空間更少。

Subversion 和其它版本控制系統可以使用只存儲新版本與之前版本之間的差異,而不是整個文件的一種算法來保存文件。這裏保存的差異數據被稱作增量(delta),或者文件的增量。由於版本控制系統無需完整地存儲每個新版本,因而用於數據存儲的磁盤空間比標準文件系統要少。

大多數版本控制系統不能將二進制文件存儲爲增量,但 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 存儲、訪問和檢索二進制文件所需時間的影響。我們仍然需要調查以不同存儲格式存儲二進制文件所需的大量服務器磁盤空間。





存儲格式與空間消耗

表 2 顯示了很多將二進制文件存入 Subversion 的方法。它還顯示分別使用 import 命令和高效簽入腳本時在 Subversion 服務器上使用的磁盤空間。表 2 中的第 1 列描述當把二進制文件放到服務器中時, Subversion 用戶如何存儲它們。第 2 列顯示二進制文件在本地系統上的大小。最後兩列顯示二進制文件在服務器上的大小,首先使用 Subversion import 命令,然後使用 Subversion 高效簽入腳本。

同樣,我們收集大量結果,以確定結論,但是這裏只展示一個有代表性的例子。


表 2. 不同方法花費的輸入和輸出時間
本地存儲格式 本地大小(Mb) 服務器上的大小(Mb)
導入 高效簽入
目錄 285 128 61
Tar 文件 219 103 102
壓縮的 tar 文件 75 75 75

空間測試結果

表 2 表明,在服務器空間方面,當使用 import 命令時,空間效率最高的方法是以單個壓縮文件的形式存儲二進制文件。這種方法使用的空間大約是單個未壓縮文件所佔空間的 75%,大約是以常規目錄結構形式導入二進制文件時所使用的空間的 60%。不過,使用高效簽入方法可以得到更好的結果。高效簽入一個目錄結構所用的空間少於導入常規目錄結構時所使用的空間的 50%。也就是說,與導入相比,以單個未壓縮文件形式高效簽入二進制文件只能少用少許空間,而以壓縮的 tar 文件的形式簽入二進制文件則根本不能節省空間。

這些結果表明,Subversion 自有的壓縮算法在壓縮二進制文件方面略強於使用本地壓縮文件的 gzip 命令。還有一點也很明顯,Subversion 不能壓縮已經壓縮過的文件。也許最有趣的是,在 Subversion 中存儲一組二進制文件的空間效率最高的方法是在常規目錄結構上使用高效簽入。





認證與性能

接下來,我們調查不同服務器認證方法對將二進制文件移入和移出 Subversion 所需時間的影響。表 3 顯示了 Subversion 服務器上的多種認證方法。對於每種方法,我們分別測出以完整目錄結構形式、以未壓縮 tar 文件形式和以壓縮的 tar 文件形式導入二進制文件所花的時間。下面展示了這些認證方法(注意,這些方法是遞增的,所以 “ldap_group” 包括 “no_path_auth disabled” 和 “Basic” 的設置):

  • No auth 只使用文件系統認證,在本地訪問。
  • Basic 意味着使用 HTTP 通過 Apache Web 服務器訪問 Subversion。
  • no_path_auth disabled 意味着大量路徑處理被關閉。
  • ldap_group 意味着設置並使用 LDAP 組。
  • ssl 使用 HTTPS 協議。

表 3 提供了一個代表性的例子。


表 3. 不同認證方法所需的輸入時間
認證方法 目錄 tar 文件 壓縮的 tar 文件
No auth 29m 25s 2m 20s 1m 17s
Basic 44m 23s 2m 51s 1m 25s
no_path_auth disabled 44m 28s 2m 53s 1m 24s
ldap_group 45m 21s 2m 53s 1m 24s
ssl 45m 27s 2m 52s 1m 25s

認證測試結果

如表 3 所示,如果在 Subversion 服務器上不進行認證,則可以取得最快的導入時間。然而,在大多數情況下,總需要某種形式的認證。我們發現,使用的認證方法對將二進制文件移入和移出 Subversion 所需的時間影響不大。





硬件與性能

我們想要確定,在解決 Subversion 性能問題時,是否需要重點考慮硬件。爲進行這個測試,我們將 Subversion 服務器宿主在各種不同的機器上,並比較將二進制文件導入每種機器上的 Subversion 服務器所需的時間。由於可用的機器類型多不勝數,我們將調查侷限於更常規的考慮,如表 4 所示。注意,Desktop 1 是一臺共享機器,這意味着除了宿主 Subversion 儲存庫之外,它還被用於其它任務。Desktop 2 是一臺專用機器,只用於 Subversion 儲存庫。


表 4. 不同機器對應的輸入時間
機器類型 機器規格 時間
Desktop 1,共享 CPU: 2x500MHz PIII, RAM: 500Mb 28m
Desktop 2,專用 1x3200MHz P4, RAM: 2000Mb 2m
Server,共享 0.2 CPUs 28m 0s
Server,共享 1 CPU 13m 19s
Server,共享 2 CPUs 13m 19s

硬件測試結果

表 4 中的結果表明,用於運行 Subversion 服務器的機器對於導入二進制文件所需時間有巨大的影響。比較兩臺臺式機,專用的、強大的 Desktop 2 比共享的、處理能力較弱的 Desktop 1 快 14 倍。實際上,這臺專用臺式機甚至比大型服務器還要快得多,不過增加服務器的 CPU 處理能力可以使導入速度快上一倍。

顯然,爲了減少將二進制文件移入和移出 Subversion 所需的時間,選擇適當的機器非常重要。





結果評估

這項調查的發現只適用於被調查的特定系統,所以這裏顯示的實際值對於其它系統可能意義不大。而模式纔是更重要的,因爲它們將在任何 Subversion 系統中被複制。根據我們的調查,當將一組二進制文件存儲到 Subversion 中時:

  • 時間效率最高的方法是創建一個單獨的、壓縮的、包含二進制的文件。
  • 空間效率最高的方法是在常規目錄結構上使用 Subversion 的高效簽入腳本。
  • 在 Subversion 服務器上使用任何形式的認證都將損失性能。
  • 使用專用的、處理能力強的機器來運行 Subversion 效果最佳。

通常來講,這些結論可以作爲存儲和檢索二進制文件時優化 Subversion 性能的一個框架。但是,基於以下考慮,這些結論變得複雜起來:

  • 對硬件的調查只適用於被調查的特定系統。與很多項目使用的二進制文件相比,測試系統中使用的二進制文件非常大。我們調查的模式仍然適用,但是使用範圍要小一些。由於其中一些結論處理時差異較大,需要根據調查中的結論來制定明智的決策。

  • 對認證方法的調查是使用不同認證方法時比較將二進制文件移入 Subversion 所需的時間。這個度量對於被測試的系統來說是最重要的,但是實際上認證方法對文件移入 Subversion 這個過程的影響很小。諸如 svn log 之類的訪問很多路徑的命令對認證方法的依賴則強得多。因而值得注意的是,雖然認證方法的選擇對於提高二進制文件輸入性能並不是特別重要,但是在其它領域可能比較重要。

  • 使用高效簽入腳本的好處還取決於項目的性質。使用高效簽入時, Subversion 服務器上所需的很多空間在很大程度上取決於簽入的每個版本之間有多大的差異。如果各個版本之間的差異較小(例如所測試的開發系統),則高效簽入的空間效率則會大大增加。

  • 值得懷疑的是,如果將一個目錄結構組合成單個的文件,不管壓縮與否,是否對於每個系統都可行呢?這種方法的一個缺陷是,它爲在大多數環境中瀏覽二進制文件造成了不便。而且不便於直接在 Subversion 中處理二進制文件。在修改二進制文件之前,必須從 Subversion 中移出二進制文件,然後將它轉換成原有的格式。在某些情況下,這些問題將排除目錄方法,或者使之與被考慮的系統無關。




優化 Subversion

本文中的性能結論廣泛適用於大多數使用 Subversion 存儲和檢索二進制文件的系統。但是,如何優化 Subversion 的決策必須以給定系統的環境和資源爲基礎。例如,拿被測試的系統來說,時間要遠遠優先於服務器空間。因此,在將二進制文件導入 Subversion 或從中導出它們之前,可以將二進制文件存儲爲壓縮的 tar 文件。壓縮二進制文件可以使等待時間最短,因而符合項目需求。服務器空間的使用對系統的影響可以忽略不計,在任何情況下,與使用高效簽入相比,壓縮的 tar 文件只佔用略微多一點的空間。

如果只考慮時間,那麼使用快速的專用機器,結合最小的二進制文件的壓縮 tar 文件,可能是最理想的優化。禁用認證可以節省更多的時間,但是大多數系統都要求認證。認證方法的選擇對存儲和檢索二進制文件所需的時間影響不大。

如果只考慮服務器空間,那麼在常規目錄結構上使用高效簽入這種方法將佔用最少的空間。如果二進制文件各個版本之間的差異很小,那麼這種方法就更加有益。在包含大型二進制文件的系統中,時間因素很難影響這種方法成爲最佳解決方案。

在很多系統中,可以採取折中的方法。如果時間很重要,則儘量導入單個的壓縮文件。這樣便於儘快將文件放入 Subversion 中,同時也便於其他人快速從 Subversion 中導出該文件。然而,如果速度不是問題,那麼可以採用高效簽入。如果二進制文件用得不多,但是必須存儲起來,以防將來需要,那麼這種方法就很有效。





結束語

如果知道如何有效地將二進制文件存儲到 Subversion 中,就可以節省小組成員數百個小時的時間和以千兆計的服務器空間。根據系統的細節和需求做出明智的決定,這是最可取的方法。本文應該可以幫助有類似需求的用戶和系統管理員。

 
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章