SAS 系統管理 (98)

教學目標

初步了解 SAS 9 與 SAS Viya 有關 Apache HTTP Server 效能參數設定的重點概念。

重點概念

首先 SAS 9 平台或 SAS Viya 平台皆採用 Apache HTTP Server 網站伺服器,當我們完成 SAS 9 平台的安裝與設定之後,根據不同作業系統 Apache HTTP Server 網站伺服器將會採用不同的多執行緒處理模組 (Multi-Processing Module,MPM)。其中 Windows 作業系統主要是採用 mpm_winnt_module 多執行緒處理模組,而 Linux 作業系統主要是採用 mpm_worker_module 多執行緒模組為主。主要會根據伺服器大小選項自動設定不同的參數值,主要有五個重要的參數設定,分別為:

  1. MaxClients:設定同時處理最大請求數。(對於效能影響最大的參數)
  2. ServerLimit:設定占用系統伺服器數的限制。
  3. ThreadsPerChild:設定每個程序建立的執行緒數。
  4. ThreadLimit:設定占用系統執行緒數的限制。(對於效能影響最大的參數)
  5. MaxKeepAliveRequests:設定持續連線的最大數。

請注意 MaxClients <= ThreadsPerChild × ServerLimit ,MaxClients 必須為 ThreadsPerChild 的整數倍,否則 Apache 將會自動調整至一個相對應的值,以及 ThreadLimit <= ThreadsPerChild,當在 Windows 作業系統中主要設定就是 ThreadLimit 而非 MaxClients,簡單來說在 Windows 平台僅需設定以下參數值,理應就能夠同時服務最多 400 個使用者的請求。

1
2
3
4
5
<IfModule mpm_winnt_module>
ThreadLimit 3072
ThreadsPerChild 3072
MaxConnectionsPerChild 0
</IfModule>

接著 Apache HTTP Server 主要有多種多執行緒處理模組 (Multi-Processing Module,MPM),請注意 Windows 作業系統僅適用 Winnt MPM,而 Linux 作業系統才適用以下三種多執行緒處理模組,分別為:

模組名稱 功能特性 支援版本
prefork 一個程序回應一個請求。 2.2、2.4
worker 一個程序產生多個執行緒,一個執行緒回應一個請求。 2.2、2.4
event 一個程序產生多個執行緒,一個執行緒回應多個請求。 2.4

所謂 Prefork MPM 主要是在啟動時,就會預先 fork 一些子程序,然後等待請求進來,以利減少頻繁建立和移除程序。其中每個子程序只能有一個執行緒,並且在一個時間點內只能夠處理一個請求。優點在於成熟穩定兼容所有模組,以及不需要擔心執行緒的安全問題,缺點則是一個程序會占用更多的系統資源耗用更多的記憶體,同時不適合處理高並行的請求,因為所有請求皆會等待可用的程序才會被處理,否則僅能排隊等待。

1
2
3
4
5
6
7
<IfModule mpm_prefork_module>
StartServers 10
MinSpareServers 25
MaxSpareServers 75
MaxRequestWorkers 1024
MaxConnectionsPerChild 0
</IfModule>

所謂 Worker MPM 主要是使用多個程序和多個執行緒的混合模式,此外會會先預載幾個子程序,然後每個子程序皆會建建一些執行緒,並且包括一個監聽執行緒。每個請求皆會被分配至一個執行緒中進行服務。此外因為執行緒通常會共享程序的記憶體空間,所以記體空間佔用較少,因此在高平行的情境下,將會比 Prefork 有更多的可用執行緒。優點在於占用更少的記憶體,高並行下表現更好,缺點則是必須考慮執行緒的安全問題,因為共享記憶體。

1
2
3
4
5
6
7
8
9
<IfModule mpm_worker_module>
ServerLimit 32
StartServers 10
MaxRequestWorkers 1024
MinSpareThreads 25
MaxSpareThreads 75
ThreadsPerChild 32
MaxConnectionsPerChild 0
</IfModule>

所謂 Event MPM 主要是解決在 Keep-alive 情境下長期被占用執行緒資源浪費的問題,因此會有一個專門的執行緒來管理這些 Keep-alive 類型的執行緒,當請求進來時就會傳遞給服務執行緒,當執行完畢之後,就會允許釋放, 以利增強高並發情境下的請求處理能力。

1
2
3
4
5
6
7
8
 <IfModule mpm_event_module>
StartServers 10
MinSpareThreads 25
MaxSpareThreads 75
ThreadsPerChild 32
MaxRequestWorkers 1024
MaxConnectionsPerChild 0
</IfModule>

再來這三種穩定的多執行緒處理模組效能比較為 Prefork < Event < Worker,所以若我們要有高效能,首先就需要先採用 Worker MPM 多執行緒處理模組。此外除了 MaxClients、ServerLimit、ThreadsPerChild、ThreadLimit 和 MaxKeepAliveRequests 效能基本參數設定之外,還有以下幾個重要效能設定參數,分別為:

  1. StartServers:設定最初建立子程序數。
  2. MinSpareServers:設定最小空閒程序數,若空閒的程序小於設定值,則會自動建立程序,若伺服器平行負載較大時建議加大。
  3. MaxSpareServers:設定最大空閒程序數,若空閒的程序大於設定值,則會自動刪除程序,若伺服器平行負載較大時建議加大。
  4. MaxRequestWorkers:設定允許同時最大請求數,任何超過限制的請求將會等待排隊,這就是當系統資源還剩下很多,但 HTTP 存取卻很慢的主要原因。
  5. MaxConnectionsPerChild:設定每個子程序可以處理的請求數,設定為 0 代表子程序永遠不會被刪除,設定為 1 代表可以防止意外的記憶體外洩,設定為 2 代表伺服器負載下降時會自動減少子程序數。

最後目前若是 SAS 9.4 平台則預設安裝與設定的 Apache HTTP Server 的版本為 2.2,因此我們則需要手動安裝 Hot Fix 升級 2.2 版本至 2.4 版本,除了滿足企業的資訊安全政策和解決弱掃問題之外 (OpenSSL 資安議題),理應更能夠改善伺服器的效能,以利減少記憶體的利用,增強平行處理的能力,並且支援非同步的輸入和輸出。安裝 Hot Fix 時請注意三件事,分別為:

  1. 請確認正確的 SAS 平台的版本和作業系統版本再下載對應的 Hot Fix 檔案。
    (若是 Windows 作業系統請下載 VC++ libraries 函式庫。)
  2. 在套用 Hot Fix 之前最佳實務請先進行系統的備份。
    (尤其是修改過的 sas.conf 設定檔,當然部署工具套用 Hot Fix 時也會自動建立 WebServerBackup 資料夾儲存舊有的所有檔案。)
  3. 在套用 Hot Fix 之前最佳實務請針對設定進行網站安全和效能最佳化的設定。
    (尤其是 MaxClients、ServerLimit、ThreadsPerChild、ThreadLimit 和 MaxKeepAliveRequests 效能基本參數設定。)

(註:若是在 Windows 作業系統中套用 Hot Fix 完成之後我們要如何確認已經更新 2.4 版本完成,則主要可以參考 Windows 作業系統中的「SAS[Config-Lev1]httpd-WebServer」服務的描述是否已經更新為「Apache/2.4.27 (Win64) PivotalWebServer/6.2.4 OpenSSL/1.0.2l-fips mod_bmx/0.9.6」即可。)

相關資源