Apache-2.2

試圖了解保持活力的工作原理

  • July 31, 2013

今天我們在伺服器上遇到了一個問題,文件/腳本的載入時間超過了 3 秒。解決方案很簡單——只需將 MaxClients 增加到估計的記憶體限制。但我擔心該解決方案的可擴展性,而且它似乎不太可靠——如果負載稍微增加,問題會再次發生。

我們正在開發的 Web 服務(小型線上遊戲)的性質要求我們嵌入 AJAX 機制,該機制每 15 秒發送一個信標,指示客戶端線上。

讓我們想像以下設置。Apache 2 (mpm_prefork), MaxClients = 150, KeepAlive = on, KeepAliveTimeout = 5. 有 300 個使用者線上。我是否理解正確——如果所有 300 個使用者將同時發送一個信標(僅通過使用 POST 檢索 beacon.php 腳本)——前 150 個客戶端幾乎會在瞬間得到答案,而其他 150 個客戶端將不得不等待 5 秒才能獲得回答?

第二個問題。就我而言,最好的解決方案是什麼?完全禁用保持活力?

apache 2 中的 MaxClients 是將在所有 apache 程序中提供的同時請求的最大數量。使用 prefork mpm,這也是將同時執行的 apache 程序的最大數量以及到您的 Web 伺服器的打開的傳入網路連接的最大數量。

KeepAlive 的全部意義在於減少在訪問站點時為每個 HTTP 請求啟動新 TCP 連接的成本,因為每個新頁面可能需要數十個文件(初始 html、css、javascript、圖像等)。最終結果是頁面載入速度更快。

MaxKeepAliveTimeout 指示 web 服務在關閉連接之前將等待來自空閒客戶端的額外 hHT 請求多長時間,使其能夠為新的傳入連接提供服務。

在您的情況下,如果您有 150 個客戶端在啟用 KeepAlive 的情況下一次發送信標,那麼是的,在其他使用者可以發送信標之前還需要 5 秒。假設要求每 15 秒發送一個信標,即最多 450 個並髮使用者。

解決方案:

  • 您可以將 MaxKeepAliveTimeout 減少到 2 秒,當它增加時收益遞減。最大的好處是初始頁面載入,並且這些請求之間幾乎沒有延遲。
  • 假設大多數使用者在遊戲中花費的時間最多,您可以完全禁用 KeepAlive,從而增加所有頁面的載入時間。
  • keepalive 必須啟用客戶端以及伺服器端才能使用。假設您控制您的客戶端javascript,可以使用以下方法在客戶端禁用特定請求的keepalive:
connection.setRequestProperty("Connection", "close");
  • 同樣,您可以通過操作 Connection 響應標頭在伺服器端禁用特定 http 請求的 Keepalive。

希望這可以幫助!

引用自:https://serverfault.com/questions/527570