問題
一天運維報告說,MongoDB
連線數報警了,個人比較鬱悶,因為我們業務併發不大,平時併發請求才10個不到,而MongoDB
連線數有400個,服務有10個。按照常理說連線數不超過100才對噻。
我們的服務架構:nginx+php-fpm
。php版本是7.1.16php-fpm
配置採用了pm = dynamic
配置
後來運維給出MongoDB
連線數客戶端分佈,發現確實是php佔用了大量的連線,一個服務高達40左右。現在可以確定是確實是php佔用了大量連線。只有排查原因。
原因
最後在一位公司同事閱讀了php7
相關原始碼才發現,php7
的MongoDB
擴充套件中,php客戶端是長連線(及時請求結束,只要php-fpm程式沒有殺掉,連線就一直保持,目的是下次請求時減少連線帶來的效能消耗),並且沒有關閉連線的函式。
解決辦法
而我們php-fpm配置中,pm.min_spare_servers = 100
,pm.max_spare_servers = 200
,空閒程式是至少開了100,所以大量空閒連線佔用了MongoDB
連線。
然後我們根據實際情況,配置改為pm.min_spare_servers = 5
,pm.max_spare_servers = 10
。重新部署後解決問題。連線數降了下了,沒有超過100.
總結
在PHP7中,MongoDB
是長連線,一個請求完,對應得php-fpm
程式沒有被kill掉化,這個連線不會斷開,會一直保持。所以要減少連線個數,需要合理設定php-fpm
空閒程式數
本作品採用《CC 協議》,轉載必須註明作者和本文連結