共用方式為


延展性

詞彙延展性通常會誤用。 本節提供雙重定義:

  • 延展性是能夠充分利用多處理器系統上可用的處理能力(2、4、8、32 或更多處理器)。
  • 延展性是服務大量用戶端的能力。

這兩個相關定義通常稱為 相應增加。 本主題結尾提供 相應放大的秘訣。

此討論著重於撰寫可調整的伺服器,而不是可調整的客戶端,因為可調整的伺服器是較常見的需求。 本節也只會解決 RPC 和 RPC 伺服器內容中的延展性。 此處不會討論延展性的最佳做法,例如減少爭用、避免全域記憶體位置上的頻繁快取遺漏,或避免誤共用。

RPC 線程模型

伺服器收到 RPC 呼叫時,會在 RPC 提供的線程上呼叫伺服器例程(管理員例程)。 RPC 會使用隨著工作負載變動而增加和減少的自適性線程集區。 從 Windows 2000 開始,RPC 線程集區的核心是完成埠。 RPC 的完成埠及其使用方式會針對零到低競爭伺服器例程進行調整。 這表示如果某些線程遭到封鎖,RPC 線程集區會積極增加服務線程的數目。 它會在假設中作封鎖是罕見的,而且如果線程遭到封鎖,這是快速解決的暫時性狀況。 此方法可讓低競爭伺服器的效率。 例如,在透過高速系統局域網路 (SAN) 存取的八個處理器 550MHz 伺服器上運作的 void 呼叫 RPC 伺服器,每秒從 200 個以上的遠端用戶端提供超過 30,000 個 void 呼叫。 這代表每小時超過1.08億個通話。

結果是當伺服器爭用很高時,主動式線程集區實際上會妨礙。 為了說明,想像一下用來遠端訪問檔案的繁重伺服器。 假設伺服器採用最簡單的方法:它只會在 RPC 叫用伺服器例程的線程上同步讀取/寫入檔案。 此外,假設我們有一部四個處理器的伺服器,提供許多用戶端。

伺服器會以五個線程開頭(這實際上有所不同,但五個線程用於簡單起見)。 一旦 RPC 挑選第一個 RPC 呼叫,就會將呼叫分派至伺服器例程,而伺服器例程會發出 I/O。 不常發生,它會遺漏檔案快取,然後封鎖等候結果。 一旦封鎖,就會釋放第五個線程以挑選要求,而第六個線程會建立為熱待命。 假設每十個 I/O 作業遺漏快取,且會封鎖 100 毫秒(任意時間值),並假設四個處理器伺服器每秒提供大約 20,000 個呼叫(每個處理器 5,000 個呼叫),則簡化模型會預測每個處理器將產生大約 50 個線程。 這假設呼叫會每隔 2 毫秒封鎖一次,並在 100 毫秒之後,第一個線程再次釋放,因此集區會穩定在大約 200 個線程(每個處理器 50 個)。

實際行為比較複雜,因為大量線程會導致額外的內容切換讓伺服器變慢,也減緩新線程的建立速度,但基本概念是清楚的。 當伺服器上的線程開始封鎖和等候某個專案時,線程數目會快速上升(無論是 I/O 或資源的存取權)。

RPC 和閘道連入要求的完成埠會嘗試維護伺服器中可用 RPC 線程的數目,以等於電腦上的處理器數目。 這表示,在四個處理器伺服器上,一旦線程傳回 RPC,如果有四個以上的可用 RPC 線程,則不允許第五個線程挑選新的要求,而是在目前可使用的線程區塊之一時處於熱待命狀態。 如果第五個線程等候足夠長的時間作為熱待命,而沒有可用 RPC 線程數目低於處理器數目,則會釋放,也就是說,線程集區將會減少。

想像一下具有許多線程的伺服器。 如先前所述,RPC 伺服器最後會有許多線程,但前提是線程經常封鎖。 在線程經常封鎖的伺服器上,會很快將傳回 RPC 的線程從熱待命清單中取出,因為所有目前可使用的線程區塊,並已獲得處理要求。 當線程封鎖時,核心中的線程發送器會將內容切換至另一個線程。 此內容切換本身會取用CPU週期。 下一個線程將會執行不同的程式碼、存取不同的數據結構,而且會有不同的堆疊,這表示記憶體快取命中率(L1 和 L2 快取)會降低很多,導致執行速度變慢。 執行的許多線程會同時增加現有資源的爭用,例如堆積、伺服器程序代碼中的重要區段等等。 這進一步增加了對資源形式的車隊的爭用。 如果記憶體不足,則大量且不斷增加的線程所施加的記憶體壓力會導致頁面錯誤,進一步增加線程區塊的速率,並造成更多線程建立。 視它封鎖的頻率和可用的物理記憶體數量而定,伺服器可能會以較高的內容切換速率穩定在較低層級的效能,或者可能會惡化到只重複存取硬碟和內容切換而不執行任何實際工作的位置。 當然,這種情況不會在輕量工作負載下顯示,但繁重的工作負載會迅速使問題浮出水面。

如何防止這種情況? 如果線程預期會封鎖、將呼叫宣告為異步,而且一旦要求進入伺服器例程,請將它排入使用 I/O 系統和/或 RPC 異步功能的背景工作線程集區。 如果伺服器接著進行 RPC 呼叫,請進行這些異步作,並確定佇列不會成長太大。 如果伺服器例程執行檔案 I/O,請使用異步檔案 I/O 將多個要求排入 I/O 系統的佇列,而且只有少數線程將它們排入佇列,並挑選結果。 如果伺服器例程再次執行網路 I/O,請使用系統的異步功能來發出要求,並以異步方式挑選回復,並盡可能使用最少的線程。 完成 I/O 或伺服器所進行的 RPC 呼叫完成時,請完成傳遞要求的異步 RPC 呼叫。 這可讓伺服器盡可能以最少的線程執行,這會增加伺服器可服務的效能和客戶端數目。

相應放大

如果已設定 NLB,則 RPC 可以設定為使用網路負載平衡 (NLB),讓來自指定客戶端位址的所有要求都移至相同的伺服器。 因為每個 RPC 用戶端都會開啟連線集區(如需詳細資訊,請參閱 RPC 和網路),因此,來自指定用戶端集區的所有連線都最後都位於相同的伺服器計算機上。 只要符合此條件,NLB 叢集就可以設定為具有潛在良好延展性的大型 RPC 伺服器。