修正伺服器超載問題

如何判斷伺服器瓶頸、快速修正瓶頸、改善伺服器效能,以及避免迴歸問題。

凱蒂漢佩尼斯
Katie Hempenius

總覽

本指南將說明如何透過 4 個步驟,修正超載的伺服器問題:

  1. 評估:判斷伺服器的瓶頸。
  2. 穩定:執行快速修正以降低影響。
  3. 改善:擴增及最佳化伺服器功能。
  4. 監控:使用自動化工具防範日後的問題。

評估

當流量超載伺服器時,可能出現下列情況:CPU、網路、記憶體或磁碟 I/O。找出哪些是瓶頸,就可以將心力集中在最具影響力的緩解措施上。

  • CPU:應調查並修正持續超過 80% 的 CPU 使用率。通常,在 CPU 用量達到約 80% 至 90% 時,伺服器效能通常會降級,且隨著空間接近 100%,伺服器效能也更明顯。處理單一要求的 CPU 使用率是微不足道的,但在流量暴增時,以大規模的方式執行此作業,有時可能會讓伺服器受損。將服務卸載至其他基礎架構、減少高成本的作業及限制要求數量,可降低 CPU 使用率。
  • 網路:在高流量期間,完成使用者要求所需的網路處理量可能會超出容量。有些網站 (視代管服務供應商而定) 也可能達到累計資料傳輸上限。減少傳入或傳出伺服器的資料大小和數量,即可消除這個瓶頸。
  • 記憶體:如果系統的記憶體不足,資料必須卸載至磁碟才能儲存。磁碟的存取速度明顯比記憶體慢,而且可能會減慢整個應用程式的運作速度。如果記憶體完全耗盡,可能會導致「記憶體不足」 (OOM) 錯誤。調整記憶體配置、修正記憶體流失問題,以及升級記憶體,就能排除這個瓶頸。
  • 磁碟 I/O:磁碟讀取或寫入資料的速率受到磁碟本身限制。如果磁碟 I/O 出現瓶頸,增加記憶體中快取的資料量,即可減緩此問題 (但代價會增加記憶體使用率)。如果問題仍未解決,您可能需要升級磁碟。

本指南中的技巧著重於解決 CPU 和網路瓶頸。對於大多數網站來說,CPU 和網路是流量尖峰期間最具關聯性的瓶頸。

只要在受影響的伺服器上執行 top,即可著手調查瓶頸。在適用情況下,請以代管服務供應商或監控工具提供的歷來資料做為補充依據。

穩定

超載的伺服器可能快速導致系統其他位置連鎖故障。因此,請務必在嘗試進行更重大的變更之前,先將伺服器保持穩定。

頻率限制

頻率限制會限制傳入要求的數量,藉此保護基礎架構。隨著伺服器效能降低,這點變得越來越重要:隨著回應時間增加,使用者通常會積極重新整理網頁,使伺服器負載增加。

修正

雖然拒絕要求相對便宜,但保護伺服器的最佳方式是處理來自其上游位置的頻率限制,例如透過負載平衡器、反向 Proxy 或 CDN。

操作說明:

相關資源:

HTTP 快取

尋找方法以更積極地快取內容。如果資源可以從 HTTP 快取 (無論是瀏覽器快取或 CDN) 提供,則無須向原始伺服器發出請求,進而減少伺服器負載。

Cache-ControlExpiresETag 等 HTTP 標頭,指出 HTTP 快取應如何快取資源。稽核並修正這些標頭可改善快取。

雖然服務工作處理程序也可用於快取,但其使用獨立的快取且為補充 (而非替代),以便適當執行 HTTP 快取。因此,在處理超載的伺服器時,應專注於最佳化 HTTP 快取。

診斷

執行 Lighthouse,並查看「運用高效率快取政策提供靜態資產」稽核功能,即可檢視短至中存留時間 (TTL) 的資源清單。針對每個列出的資源,評估是否應增加存留時間。基本原則如下:

  • 靜態資源應使用較長的存留時間 (1 年) 快取。
  • 動態資源應設有較短的 TTL (3 小時) 快取。

修正

Cache-Control 標頭的 max-age 指令設為適當的秒數。

操作說明:

優雅降級

「安全降級」是指暫時縮減功能,以減少系統負載量的策略。這個概念可以透過多種不同方式應用,例如提供靜態文字網頁而非功能完整的應用程式、停用搜尋功能或減少搜尋結果,或是停用某些昂貴或非必要的功能。重點在於移除可以安全、輕鬆移除的功能,同時將業務影響降到最低。

改善

使用內容傳遞網路 (CDN)

提供靜態資產時,可以從伺服器卸載至內容傳遞聯播網 (CDN),進而降低負載。

CDN 的主要功能,是提供靠近使用者的大型伺服器網路,以便快速將內容傳遞給使用者。不過,多數 CDN 也會提供其他效能相關功能,例如壓縮、負載平衡和媒體最佳化。

設定 CDN

CDN 可以調度資源,因此操作自有 CDN 的機率並不高。基本的 CDN 設定很快 (約 30 分鐘) 就能設定完成,內含將 DNS 記錄更新為指向 CDN。

最佳化 CDN 用量

診斷

執行 WebPageTest,找出目前不應透過 CDN (但應該) 提供的資源。在結果頁面中,按一下 [有效使用 CDN] 上方的正方形,查看應從 CDN 提供的資源清單。

指向「有效使用 CDN」按鈕的箭頭
WebPageTest 結果

修正

如果 CDN 未快取資源,請確認符合下列條件:

調度運算資源

擴充運算資源時應謹慎決定。雖然規模通常必須擴充運算資源,但如果太過早設定,可能會產生不必要的架構複雜度和財務成本。

診斷

如果第一個位元組時間 (TTFB) 偏高,可能代表伺服器即將達到容量。您可以在 Lighthouse 的「減少伺服器回應時間 (TTFB)」稽核中取得這項資訊。

如要進一步調查,請使用監控工具評估 CPU 使用率。如果目前或預期的 CPU 使用率超過 80%,請考慮增加伺服器。

修正

新增負載平衡器可將流量分配至多個伺服器。負載平衡器位於伺服器集區的前面,並將流量轉送至適當的伺服器。雲端服務供應商提供自己的負載平衡器 (GCPAWSAzure),您也可以使用 HAProxyNGINX 自行設定負載平衡器。負載平衡器建立完成後,即可再增加其他伺服器。

除了負載平衡之外,大多數雲端服務供應商還提供自動調度資源功能 (GCPAWSAzure)。自動調度資源功能可搭配負載平衡運作,會隨時根據需求自動擴充或縮減運算資源。話雖如此,自動調度資源功能並不實用,因為新執行個體需要時間才能上線,而且必須大幅進行設定。由於自動調度資源功能會增加複雜度,因此應先考慮採用較簡單的負載平衡器設定。

啟用壓縮功能

文字資源應使用 gzip 或 brotli 壓縮。Gzip 可以縮減約 70% 的這些資源傳輸大小。

診斷

使用 Lighthouse 啟用文字壓縮稽核功能來識別需壓縮的資源。

修正

更新伺服器設定來啟用壓縮功能。操作說明:

最佳化圖片和媒體

大部分網站的檔案大小都以圖片為主;對圖片進行最佳化處理後,網站尺寸的最佳化速度可更快,並大幅縮小。

診斷

Lighthouse 具備各種稽核項目,可以標記潛在的映像檔最佳化作業。此外,您也可以使用開發人員工具找出最大的圖片檔案,這類圖片可能相當適合用於最佳化。

相關 Lighthouse 稽核:

Chrome 開發人員工具工作流程:

修正

如果您有空...

因此,您可以花點時間找出經常載入的大型圖片,並利用 Squoosh 等工具手動調整圖片品質。主頁橫幅通常很適合進行最佳化。

注意事項:

  • 大小:圖片不得大於必要大小。
  • 壓縮:一般來說,80-85 的品質等級對影像品質幾乎不會造成任何影響,但檔案大小也會減少 30-40%。
  • 格式:使用 JPEG 呈現相片,而不是 PNG;如果是動畫內容,請使用 MP4,而非 GIF。

如果方便的話...

如果圖片是你的網站的一部分,請考慮設定圖片 CDN。Image CDN 是用來提供及最佳化圖片,可卸載原始伺服器提供的圖片。設定圖片 CDN 相當簡單,但需要更新現有的圖片網址,使其指向映像檔 CDN。

相關資源:

壓縮 JS 和 CSS

壓縮功能會移除 JavaScript 和 CSS 中不必要的字元。

診斷

使用 Minify CSSMinify JavaScript Lighthouse 稽核功能,即可找出需要壓縮的資源。

修正

如果您有足夠的時間,不妨著重於壓縮 JavaScript。大多數網站的 JavaScript 比 CSS 還多,因此成效會比較顯著。

監控

伺服器監控工具可以提供資料收集、資訊主頁及有關伺服器效能的快訊。這些金鑰的用途有助於防範及減少日後的伺服器效能問題。

監控設定應盡可能簡單。「資料收集和快訊」的數量過多,因此產生費用:資料收集範圍或頻率越大,收集和儲存成本就越高;過多快訊會導致頁面遭到忽略。

快訊功能應使用可持續準確偵測問題的指標。伺服器回應時間 (延遲) 指標特別適合在此情況中:偵測到各種問題,並且與使用者體驗有直接關聯。根據 CPU 用量等較低層級指標發送快訊是相當實用的補充方法,但它只能找出一小部分的問題。此外,警示應依據在尾端觀察到的效能 (即第 95 或第 99 個百分位數),而不是平均值。否則,平均分數很容易混淆,並不影響所有使用者。

修正

所有主要雲端服務供應商都有自己的監控工具 (GCPAWSAzure)。此外,Netdata 是絕佳的免費開放原始碼替代方案,無論選擇哪種工具,都必須在要監控的每台伺服器上安裝工具的監控代理程式。完成後,請務必設定快訊。

操作說明: