為了讓你充分理解本章所討論的內容,我們會給出正規的性能概念定義。下面是性能工程師詞典裡最重要的一些術語:
- 等待時間(Latency)
- 吞吐量(Throughput)
- 利用率(Utilization)
- 效率(Efficiency)
- 容量(Capacity)
- 擴展性(Scalability)
- 退化(Degradation)
Doug Lea討論這些術語時都是放在多線程代碼的上下文中,但我們要考慮的範圍更廣:從一個多線程處理器到整個集群服務器平台。
6.1.1 等待時間
等待時間是在給定工作量下處理一個任務單元所消耗的時長。通常,都是在工作量「正常」的情況下提到等待時間的。但有價值的性能評測一般都是用一張圖形來顯示在工作量不斷增加的情況下等待時間隨之改變的函數關係。
圖6-1顯示了在工作量增加時,某一性能指標(比如等待時間)出現了一個突發的非線性退化。這通常被稱為性能肘。
圖6-1 性能肘
6.1.2 吞吐量
吞吐量是系統在限定資源、限定時長內能完成的單位工作量。用的最多的是在某一參考平台(比如指明了硬件配置、操作系統和軟件環境的特定品牌服務器)上的每秒事務處理數。
6.1.3 利用率
利用率表示可用資源中用來處理工作單元(而不是清理任務或處於空閒狀態)的資源百分比。人們通常會說服務器的利用率是10%,這其實是說在正常處理時間內處理工作單元的CPU百分比。注意,不同資源的利用率水平可能有非常大的差異,比如CPU和內存之間。
6.1.4 效率
系統的效率等於吞吐量除以所用資源。一個用更多資源產生相同吞吐量的系統效率更差。
比如比較兩個集群方案。如果為了達到相同的吞吐量,方案A需要的服務器數量是方案B的兩倍,則方案A的效率是B的一半。
別忘了,資源也可以用成本來衡量——如果方案X的成本是方案Y的兩倍或需要兩倍的員工運行生產環境,則方案X的效率是Y的一半。
6.1.5 容量
容量是任一時刻能通過系統的工作單元(比如事務)數量。也就是在特定的等待時間或吞吐量下,能夠得到同步處理的工作單元數量。
6.1.6 擴展性
當系統得到更多資源時,它的吞吐量或等待時間會發生變化。這種發生在吞吐量或等待時間上的變化就是系統的擴展性。
如果方案A可用的服務器數量翻倍,它的吞吐量也能翻倍,那我們就說它實現了完美的線性擴展。在大多數情況下,完美的線性擴展很難達到。
還應該注意,系統的擴展性取決於很多因素,而且這種擴展性還是變化的。系統能以線性方式向上擴展到某一點,然後開始退化。這是另外一種性能肘。
6.1.7 退化
如果在不增加資源的情況下增加工作單元或網絡系統的客戶端,一般等待時間或吞吐量都會發生變化。這是系統在負載增加時出現的退化。
正面退化與負面退化
在正常情況下,退化是負面的。也就是說給系統增加工作單元會對性能產生負面影響,比如導致處理等待時間變長。但某些情況下退化也有可能是正面的。
比如說,如果過重的負載導致系統某些部分超過了閾值,迫使系統切換到高性能模式,這會讓系統工作效率更高,縮短處理時間,儘管還要完成更多工作。JVM是個動態性非常強的運行時系統,並且有幾部分可以達成這種效果。
前面這些術語是最常用的性能指標,當然還有其他一些重要的指標,但這些是指導系統性能調優的基本統計數據。在下一節中,我們會給出一個以密切關注這些數值為基礎,並盡可能定量的性能調優方法。