nginx子請求數量過多導致的記憶體洩漏

2021-08-29 18:04:45 字數 587 閱讀 7403

最近線上的全部lua介面響應時間突然增長了好幾倍,甚至達到不可用的狀態,看了一下監控,發現全部openresty伺服器的記憶體佔用率都在快速的往**: 

我們試著重啟nginx,雖然記憶體佔用率恢復到正常水平,但馬上又會繼續快速往**,重啟了好幾次都是同樣的情況,所以基本上可以確定是發生了記憶體洩漏。

接著檢視介面日誌,發現了下面兩個報錯: 

failed to issue subrequest: -1 

subrequests cycle while processing "***xx" 

網上google一下,發現報這個錯是因為nginx的子請求數量太多了。我們使用的nginx版本是1.9.3,每個主請求下面最多只能同時跑200個的子請求,超過就會報上面的錯誤。

而從1.9.5版本開始,nginx取消了子請求的數量限制,只有乙個對子請求遞迴深度(子請求裡再發出子請求)的限制,最多只能遞迴 50 層。這個遞迴深度在真實場景中不太可能突破,除非故意玩遞迴子請求。

知道報錯的原因之後,直接找到發出子請求的那段**(ngx.location.capture_multi),稍作修改限制子請求的數量之後,記憶體佔用率就再也沒有繼續飆公升了,所有介面服務也恢復正常。

linux 解決TIME WAIT數量過多的問題

1.檢視各狀態的埠數量 指令碼如下 while true do date netstat n awk tcp end i sleep 2 done ortime 5 while true donetstat ant grep 1433 awk established time wait listen...

Web優化 減少http的請求數量(前端)

使用image maps替換多張帶有超連結的,使用地圖這種方式可以減少http請求。實際使用的時,發現載入image maps的時間倒是很長,客戶端地圖可以使用map標籤實現操作。css sprites也可以合併,但更為靈活。css sprites是任何支援背景的html元素。使用css的backg...

nginx限制併發連線請求數的方法

簡介 限制併發連線數的模組為 http limit conn module,位址 限制併發請求數的模組為 http limit req module,位址 這兩個模組都是預設編譯進nginx中的。限制併發連線數 示例配置 limit conn zone key zone name size 定義併發...