軟件系統(tǒng)可擴展性背后的爭用、一致性和數(shù)學
譯文【51CTO.com快譯】本文將介紹如何通過數(shù)學方程來描述系統(tǒng)——至少在某種程度上是這樣的。人們將熟悉諸如爭用、一致性和相關性延遲之類的術語。此外,還將展示可以幫助計算這三種機制對應用程序影響的定律及其數(shù)學方程。
這篇文章側(cè)重于整體系統(tǒng)設計和架構,并將嘗試回答“可以無限地擴展系統(tǒng)嗎?”這個問題。
然而,為了充分理解這個主題,將首先回答一個更簡單的問題:什么是可擴展性?
什么是可擴展性?
可擴展性的最佳定義之一可以在維基百科中找到,可以這樣引用:通過添加更多資源來處理越來越多的工作的系統(tǒng)屬性(...)
從這樣的聲明中,可以預期,如果軟件系統(tǒng)被認為是可擴展的,可以添加越來越多的資源(線程、CPU、節(jié)點),并可能處理任何增加的傳入流量。然而,這僅適用于理想世界。在令人失望的現(xiàn)實中,必須考慮以上提到的三個概念。在開始解釋它為什么采用這種方式之前,先介紹有關線性可擴展性的細節(jié)。
線性可擴展性
一般來說,這是想要實現(xiàn)的最佳情況。在這里,當向系統(tǒng)添加資源時,它總是會導致其性能提升。更重要的是,可以無限期地做到這一點,而不會受到任何負面影響??梢杂脕碛嬎憔€性可擴展性影響的數(shù)學方程非常小且簡單。
線性可擴展性方程
S→整體任務的執(zhí)行時間整體提升
N→改進的資源(線程、CPU、節(jié)點)
現(xiàn)在可以看到,執(zhí)行時間的整體改進只取決于改進的資源,所以添加的資源越多,獲得的性能提升就越大。不幸的是,如上所述,在更復雜的系統(tǒng)中幾乎不可能出現(xiàn)這種情況。
在對線性可擴展性進行了簡要介紹之后,可以進一步探討其他主題,先從爭用開始。
什么是爭用?
簡單地說,這是對共享資源訪問權的競爭。幾乎所有東西都可以是這樣的資源,從像CPU周期這樣的低級資源到像數(shù)據(jù)庫訪問線程這樣的高級資源,甚至是更高的抽象資源(例如系統(tǒng)套接字)。
就像每場比賽一樣都只有一名獲勝者一樣,但更重要的是,在“獲勝者”勝出之后,其余的“參與者”必須等待,仍在利用和封鎖他們的資源,等待“獲勝者”完成任務之后,然后從頭開始進行比賽。
同樣,與任何其他比賽一樣,擁有的競爭者越多,成為最終獲勝者所需的時間就越多。在面向軟件的世界中,這意味著當將系統(tǒng)置于足夠的負載時,可以預期所有可接受的時間限制都將被打破。與此同時,系統(tǒng)將繼續(xù)利用其他地方可能需要的資源,這可能會導致越來越多的故障。
在任何類型的線程池的情況下,情況似乎更加復雜。在那里,可以看到最終有多個贏家的情況,因為有很多線程在線程池中,并且有多個輸家。此外,在這種情況下選擇下一個獲勝者的過程與特定的線程池實施密切相關。
現(xiàn)在,當知道什么是爭用以及它可能如何影響應用程序之后,繼續(xù)描述第一條定律。
什么是阿姆達爾定律?
阿姆達爾定律是由吉恩·阿姆達爾于1967年提出的。它描述了在資源得到改進的系統(tǒng)中,在固定負載下任務執(zhí)行延遲的理論改進——例如在多線程的情況下,這里指的是添加更多線程。
簡而言之,它可以用來計算通過向系統(tǒng)添加更多資源而獲得的最大改進。在這里至關重要的是,只有使用特定資源的代碼才能從這種資源改進中獲益,這是一個非常合乎邏輯的結論,因此受到非獲益部分的執(zhí)行時間的限制。
例如:
如果想向系統(tǒng)添加更多線程,只有多線程的部分才能從這些操作中受益,而且將會受到單線程部分的執(zhí)行時間的限制。
阿姆達爾定律方程
S→整體任務執(zhí)行時間整體提升
σ→未受益于改進資源的部分最初占用的執(zhí)行時間比例
N→改進的資源(線程、CPU、節(jié)點)
當參數(shù)(σ)設置為0時,阿姆達爾定律將自身簡化為線性可擴展方程形式。
可以將σ替換為(1-p),并在轉(zhuǎn)換后得到另一個與上述公式類似的方程:
p→受益于改進資源的部分原先占用的執(zhí)行時間比例。
與p=1時的σ=0類似,阿姆達爾定律將自身簡化為線性可擴展方程形式。這兩種情況都描述了當整個應用程序受益于改進資源時的最大潛在好處。
需要記住的是,這兩個方程是相等的,并且應該為各自的數(shù)據(jù)返回相同的結果。將在示例中包括計算。
例子:
例如有一項工作運行了9個小時。假設5小時長的部分可以并行化和改進,改進后的速度將是之前的三倍。
現(xiàn)在知道:
N=3
p=5/9=0.56
σ=4/9=0.44
所以
如上所見,在這種情況下,將能夠比以前快0.59倍(大約6小時3分鐘)完成任務。
這里有兩個值得注意的事情:
(1)如果整個程序受益于系統(tǒng)資源改進,S最多可以等于3;σ=0|p=1。
(2)受益部分越大,改善越大。
在上圖中,可以看到N從0到10的繪制圖,σ=0.44,這適用于阿姆達爾定律。
阿姆達爾定律和爭用
由于爭用使每個請求者的可用資源越來越少,從而限制了系統(tǒng)的并行化,因此可以看到,代碼庫越有爭議,改進所產(chǎn)生的整體影響就越小。
在解釋了爭用、爭用對軟件的影響以及如何計算爭用之后,可以轉(zhuǎn)向需要討論的第二個概念。
什么是一致性?
一致性是指處理讀/寫的順序,以確保以合理的順序查看這兩個操作。它是整個系統(tǒng)設計中最重要的主題之一。這就是它在字母C下的CAP定理中找到了其表示的原因。兩個最重要的一致性模型是最終一致性和強一致性。還有其他一致性模型,但它們不那么重要。
什么是相關性?
相關性是一個與一致性密切相關的術語,是關于確保任何相關方在給定時刻看到處于相同狀態(tài)的同一特定數(shù)據(jù)段。對于在兩個或多個節(jié)點之間共享其部分狀態(tài)的所有系統(tǒng)來說,這是一個至關重要的概念。
什么是相關性延遲?
如果相關性是為了確保對狀態(tài)特定部分的任何請求返回相同的值,那么相關性延遲可以被視為達到系統(tǒng)范圍一致性所需的時間。
這里值得一提的是,向系統(tǒng)添加更多節(jié)點會增加相關性延遲的時間。
相關性延遲和岡瑟定律
岡瑟定律或通用可擴展性定律(USL)由尼爾·岡瑟于1993年制定。它建立在阿姆達爾定律之上,但另外,它考慮了由于進程間通信引起的開銷。
通俗地說,它允許計算系統(tǒng)的可擴展性,同時考慮并發(fā)性、爭用(阿姆達爾定律)和相關性延遲,使最終結果更符合實際情況。事實上,由于在方程中引入了相關性延遲,能夠看到嘗試擴大系統(tǒng)的負面結果。
岡瑟定律方程
S→整體任務執(zhí)行時間整體提升。
σ→未受益于改進資源的部分最初占用的執(zhí)行時間比例。
κ→系統(tǒng)用于實現(xiàn)一致性的執(zhí)行時間比例,即相關性延遲;沒有辦法計算它,必須測量它或者只是通過在等式中放置不同的值來試驗它,查看系統(tǒng)可以擴展的程度。
N→改進的資源(線程、CPU、節(jié)點)
當描述相關性延遲(κ)的參數(shù)設置為0時,岡瑟定律將自身簡化為阿姆達爾定律方程形式。
例子:
數(shù)據(jù)與阿姆達爾定律的數(shù)據(jù)相同,但此外,系統(tǒng)將其正常運行時間的7%用于使其狀態(tài)保持一致。
N=3
σ=4/9=0.44
κ=0.07
那么根據(jù)上面的計算可以做什么呢?
(1)性能改進有所下降,而不是0.59改進,只有0.30的提升。
(2)如果繼續(xù)給系統(tǒng)增加資源,可以看到性能下降而不是增加,這里可以看到當將N縮放到10時,性能下降了0.11。
(3)從計算中可以看出,相關性延遲(κ)對整體改進的影響比爭用大得多。
可以在下面找到岡瑟定律的繪圖,其中N從0到10,σ=0,44κ=0.07??梢钥吹剑瑢τ贜等于9,開始注意到性能下降。
如何選擇最優(yōu)的N?
這個答案很簡單,但需要做一些數(shù)學運算,本文中的大部分內(nèi)容也是如此。首先,可以將岡瑟定律視為一個函數(shù)S(N),對于任何函數(shù)(實際上只是一部分),可以計算S(N)具有最大值的點(N)。擁有這樣的價值提供了兩條非常重要的信息:
(1)知道在投入使用之前需要準備多少資源。
(2)可以計算系統(tǒng)在當前狀態(tài)下擴展的范圍。
所有這一切都可以使用普通的計算器或紙筆實現(xiàn),不包括計算機(取決于計算機的先進程度)。
最優(yōu)N方程:
例子:
正在計算所需的節(jié)點數(shù),以最大限度地改進岡瑟定律示例中的數(shù)據(jù)。
σ=4/9=0.44
κ=0.07
如上所見,最佳節(jié)點數(shù)為2.83,但由于無法添加部分節(jié)點,因此會添加3個節(jié)點并最終得到p=3。
為了驗證它,將計算S(4),并查看使用4個節(jié)點而不是3個節(jié)點。將實現(xiàn)多大的改進。需要記住,S(3)=1.3。
S(4)=1.26
如上所見,S(4)比S(3)小(稍微小一些)。
回答最后的問題
可以無限擴展系統(tǒng)嗎?當然不是。
除非系統(tǒng)完全無狀態(tài)(這樣的情況很少),否則只能將其擴展到岡瑟定律所描述的程度。如果在該限制范圍內(nèi)添加更多資源,最終將降低系統(tǒng)性能,而不是提高性能。
即使在幾乎沒有相關性延遲的最佳情況下,最終也會受到阿姆達爾定律的限制,這仍然遠遠不能達到線性可擴展性的程度,要實現(xiàn)這樣的可擴展性,基本上必須沒有狀態(tài),并且完全并行化的軟件沒有串行瓶頸。
在上圖中,可以看到繪制的圖表:線性可擴展性(藍線)、阿姆達爾定律(綠線)和通用的可擴展性定律(紅線)從0到5??梢郧宄乜吹剿鼈冎g的差異,特別是它們與期望的可擴展性(線性)之間的距離。當然,N越大,這種差異就越明顯。根據(jù)研究,κ參數(shù)的值沒有通用規(guī)則。它的真正價值僅取決于系統(tǒng)的復雜性。
結論
希望通過本文可以學到有關整體系統(tǒng)設計的新知識,并且對將來有用。需要記住的是,可以計算可擴展性,而線性可擴展性是不可能的。
原文標題:Contention, Coherency, and Math Behind Software,作者:Bartłomiej Żyliński
【51CTO譯稿,合作站點轉(zhuǎn)載請注明原文譯者和出處為51CTO.com】