1. 程式人生 > >nginx子請求數量過多導致的記憶體洩漏

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

最近線上的全部lua介面響應時間突然增長了好幾倍,甚至達到不可用的狀態,看了一下監控,發現全部openresty伺服器的記憶體佔用率都在快速的往上漲: 
 
我們試著重啟nginx,雖然記憶體佔用率恢復到正常水平,但馬上又會繼續快速往上漲,重啟了好幾次都是同樣的情況,所以基本上可以確定是發生了記憶體洩漏。

接著檢視介面日誌,發現了下面兩個報錯: 
failed to issue subrequest: -1 
subrequests cycle while processing "xxxxx" 
網上google一下,發現報這個錯是因為nginx的子請求數量太多了。我們使用的nginx版本是1.9.3,每個主請求下面最多隻能同時跑200個的子請求,超過就會報上面的錯誤。

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

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

至此,問題已經解決,下面總結一下: 
1)nginx 1.9.5之前的版本,有對子請求的數量做限制,每個主請求下面最多隻能同時跑200個子請求;1.9.5之後的版本,取消了這個數量限制,改成了對子請求遞迴深度的限制,最多遞迴50層 
2)如果子請求數量超過200的限制,會報 failed to issue subrequest: -1 的錯誤,並且會引起nginx記憶體洩漏
--------------------- 
作者:自由de單車 
原文:https://blog.csdn.net/ljfrocky/article/details/52539776 
版權宣告:本文為博主原創文章,轉載請附上博文連結!