IIS、Web 服務、負載平衡、工作程序,我們一團糟
好吧,讓我們從說幾件事開始。我以這種方式配置了一些東西,並採取了一些(未知的)步驟來達到這一點,首先提高可靠性,其次提高性能。
現在我們兩者都有問題。
事實:
Windows 2003 企業虛擬機(VMWare,我們無權訪問 VM 控制台)
8 個 CPU(它們是較新的 XEON)
16 GB 記憶體(我相信 12 GB 專用,其餘可爆)
24 GB 頁面文件在自己的磁碟捲上(所有磁碟都是 SAN,通過光纖連接)
最高可達 .NET 4.0,儘管一切本質上都是 2.0
在 ASMX Web 服務中一切都是用 C# 編寫的
這正在執行一個內部開發的應用程序“框架”,以支持連接不良的使用者進行離線數據收集/操作
- 根據“上次同步日期”收集數據並下載到本地 SQL Express 數據庫
- 使用者可以離線編輯,然後在連接時發送更改備份
除了“框架”應用程序池外,每個應用程序都有自己的應用程序池
我們有大約 1700 名使用者分佈在各個應用程序中,其中許多使用者擁有多個應用程序。
大約 400 名“重度”使用者使用多個應用程序
“框架”應用程序池有 1 個工作程序,應用程序 1、應用程序 2 和應用程序 3 都有 10 個工作程序。
應用程序 4 到 6 有 1 個工作程序
應用程序 1 是一個 24x7x365 應用程序,它必須一直處於執行狀態。
應用程序 1-3 配置為每 240 分鐘回收一次
根據趨勢數據,我們發現如果我們在一小時內維持超過 80-90 次“同步”,就會出現很多超時問題。
許多工作程序似乎沒有做任何事情
- 我覺得我們可以將每個應用程序池減少到大約 4 WP
- 早期程序鎖定存在很多問題。不確定 10 個 WP 的合理性,除此之外是他們選擇的,並且工作了很長一段時間
應用程序 1 在 peek 時間,每小時同步 50 次以上,將迅速攀升至大約 5.5 GB 的記憶體。
- 隨著事情的進展,最終一些使用者會收到“超時”錯誤
- 我寧願看到該應用程序池的 3 個程序(暫時)每個 2.5 GB,而不是一個擁有所有記憶體的程序。
- 這向我表明只有一個程序正在處理請求。
我們根據記憶體限制等更頻繁地嘗試回收。我們收到更多以下錯誤:
- System.IO.IOException:無法從傳輸連接讀取數據:現有連接被遠端主機強行關閉。
今年我們已經禁用了 App 1 的應用程序池(由於快速故障保護?)大約 3 次,而 App 2 已經發生過一次。
我們需要做的是控制這整個混亂,更好地利用我們擁有的資源,並儘可能快地改善這個應用程序的平衡。
理想情況下,我認為我們需要使用適當的負載平衡器和 ASP.NET 狀態伺服器轉移到多伺服器情況。我們確實可以訪問我們現在可以使用的狀態伺服器,所以如果跨工作程序使用它有什麼好處,我們可以這樣做。還想提一下,添加伺服器(甚至是虛擬伺服器)並不是一個快速的過程(新虛擬機至少需要 6 週的時間才能完成),而且該公司正在評估遷移到新的數據中心,因此他們將抵制設置任何東西新的,特別是如果它是一個物理系統。
我們確實在伺服器上有管理員訪問權限,並且可以做我們作為開發人員/架構師需要做的任何事情,而不是重新啟動伺服器。我們必須獲得特別許可/通知伺服器監控團隊重啟。
我承認這開始超出我的知識範圍,我們需要一些指導。請盡可能多地提出您認為有必要的問題,以便更好地了解我們正在發生的事情。任何最佳實踐或一般性建議也很有幫助。
如果需要,我還可以提供有關 Web 服務之間通信等的更多詳細資訊。
**編輯1:**我應該解釋一個通用的“同步”。使用者 A 連接到框架伺服器以進行身份驗證/記錄。然後根據需要連接到每個 App Web 服務。數據是從一組來源(第 3 方 WS、Oracle 和 SQL 數據庫、文件共享等)收集的,然後使用數據集傳遞給客戶端。每次同步都有不同的步驟(每個步驟呼叫應用程序服務來完成工作,呼叫框架服務來記錄日誌),每個步驟對於應用程序都是唯一的。
聽起來好像可伸縮性問題出在應用程序伺服器上,而不是數據庫伺服器上。因此,最好的辦法是對應用程序伺服器進行負載平衡。
負載平衡非常簡單,可以在網路級別完成。這允許您將 X 數量的物理或虛擬機放在一個 VIP 後面,並單方面在機器之間分配負載。給定的使用者將針對每個請求訪問不同的機器。
負載均衡時,最好避開會話狀態資訊。但是,如果無法避免,則需要所有機器都可以連接的會話狀態伺服器。這在 .NET 中相當簡單,因為可以使用 Web.config 輕鬆插入會話狀態提供程序。這允許應用程序伺服器本身是無狀態的,因此,VIP 可以將傳入流量引導到它想要的任何伺服器。
如果機器出現問題或需要部署維護,負載平衡還允許您停止服務。這在部署過程中也會派上用場,因為您可以讓一半的機器停止服務並進行部署,然後交換它們。這可以防止同時執行 2 個版本的應用程式碼。