Amdahl定律和可伸縮性

2022-07-08 20:03:09 字數 2121 閱讀 2971

效能的思考

提公升效能意味著可以用更少的資源做更多的事情。但是提公升效能會帶來額外的複雜度,這會增加執行緒的安全性和活躍性上的風險。

我們渴望提公升效能,但是還是要以安全為首要的。首先要保證程式能夠安全正常的執行,然後在需要的時候進行效能優化,並且優化後的程式要盡可能保持併發性,讓多處理中每個cpu盡可能得不要空閒,但是如果程式的併發沒有設計好,那麼可能會出現併發程式沒有利用好現代多處理器的優勢而導致併發化後的效能還不如序列化效能。

相較於單執行緒,多執行緒有很多獨有的效能開銷因素:

(1)執行緒之間的協調(如,加鎖、記憶體同步等)

(2)增加的上下文切換

(3)執行緒的建立和銷毀

(4)執行緒排程

可伸縮性:

當增加計算機資源時(資源指:cpu、記憶體、硬碟),程式的吞吐量會得到提公升。

在增加計算資源的情況下,程式在理論上能夠實現最高的加速比,這個值取決於程式中可並行元件與序列元件所佔的比重。

假定f是必須被序列執行的部分,那麼根據amdahl定律,在包含n個處理器的機器中,最高的加速比為:sp

eedu

p<=1/

(f+(

1−f)

/n)'>speedup<=1/(f+(1−f)/n)

當n趨近於無窮大時,最大的加速比趨近於1/f。因此有50%的計算需要序列執行,那麼最高的加速比只能是2。

利用率:加速比除以處理器的數量。

隨著處理器數量的增加,可以很明顯地看到,即使序列部分所佔的百分比很小,也會極大地限制當增加計算資源時能夠提公升的吞吐率。

在所有的併發程式中都包含一些序列部分(比如工作執行緒從佇列拿取任務的時候,就需要加鎖(序列化))。

在各個框架中隱含的序列部分

上面說到,不管什麼樣的併發程式中,都必定有序列部分,那麼以任務隊列為例,比如工作執行緒從佇列拿取任務的時候,就需要加鎖(序列化)

圖中對兩種執行緒安全的queue進行了比較,乙個是同步容器synchronizedlinkedlist,乙個是併發容器concurrentlinkedqueue,這倆有啥區別呢?圖中顯示,當執行緒數越多時,併發容器concurrentlinkedqueue的吞吐率的增幅相當快,而同步容器synchronizedlinkedlist幾乎沒有任何變化!why?

(1)同步容器的同步方式幾乎都是在乙個方法上加鎖(鎖住整個方法),鎖住整個方法會帶來的問題:

(a)獨佔鎖會降低**的可伸縮性:因為大量的執行緒都會因為鎖而阻塞,那麼程式的序列化佔比會上公升,所以根據amdahl定律,加速比就會降低,可伸縮                    性降低。

(b)鎖的請求頻率:對乙個鎖請求的頻率越高,就說明發生競爭的可能性越大,會限制可伸縮性(可以採取分段鎖解決)。

(2)併發容器在安全處理上更為細粒度,因為採用的非阻塞式的演算法:

(a)基於cas(底層硬體提供併發機制)的併發程式,可伸縮性更好。

(b)摒棄了基於鎖的機制,所以每個執行緒進來後都不用在鎖上產生競爭而阻塞,並且不會產生執行緒的上下文的切換。

任務在執行和阻塞這兩個狀態之間轉換時,就相當於一次上下文切換。

多個執行緒同時記錄日誌:在輸出流的鎖上發生競爭。

i/o操作阻塞:作業系統將這個被阻塞的執行緒從排程佇列中移走並直到i/o操作結束。

請求服務的時間不應該過長:服務時間越長,意味著越多的鎖競爭。

通過將i/o操作從處理請求的執行緒中分離出來,可以縮短處理請求的平均服務時間。呼叫log方法的執行緒將不會再因為等待輸出流的鎖或者i.o完成而被阻塞,它們只需要要將訊息放入佇列,雖然在訊息佇列上可能會發生競爭,但put操作相對於記錄日誌的i/o操作(可能需要呼叫系統呼叫),是一種更為輕量級的操作,因此在實際上阻塞的概率更小,只要佇列沒填滿。由於發出日誌請求的執行緒被阻塞的概率降低,因此該執行緒在處理請求時被競爭的出去的概率也會降低。

通過將i/o操作移動了另乙個使用者感知不到開銷的執行緒上,通過把所有記錄日誌的i/o轉移到乙個執行緒,還消除了輸出流上的競爭,因此又去掉乙個競爭**。這將提公升整體的吞吐量。

可伸縮性搜尋框 Duration

最近在設計班級 的首頁,模仿別人部落格裡使用到的可伸縮的搜尋框,剛開始想想覺得挺奇妙的,後來發現這其實不難,利用之前 css 學過的 duration 就可以實現了。下面是我從班級首頁中抽出來的搜尋框製作成的 demo,跟大家分享下。我們先看看 css box assistive searchare...

什麼是可伸縮性測試

提到效能測試,大家馬上腦海裡馬上會出現負載測試 壓力測試 容量測試等概念,那麼大家知不知道還有可伸縮性測試。可伸縮性測試可以看成效能測試的乙個擴充套件,關注系統本身的可伸縮性,下面給大家具體介紹。系統的可伸縮性可以從硬體和軟體兩個方面來理解 1 硬體的可伸縮性 是不是可以通過硬體裝置的增加來支援更多...

什麼是可伸縮性測試

提到效能測試,大家馬上腦海裡馬上會出現負載測試 壓力測試 容量測試等概念,那麼大家知不知道還有可伸縮性測試。可伸縮性測試可以看成效能測試的乙個擴充套件,關注系統本身的可伸縮性,下面給大家具體介紹。系統的可伸縮性可以從硬體和軟體 兩個方面來理解 1 硬體的可伸縮性 是不是可以通過硬體裝置的增加來支援更...