PHP-fpm MongoDB 連線數爆了問題

jiangjun發表於2019-10-08

問題

一天運維報告說,MongoDB連線數報警了,個人比較鬱悶,因為我們業務併發不大,平時併發請求才10個不到,而MongoDB連線數有400個,服務有10個。按照常理說連線數不超過100才對噻。

我們的服務架構:nginx+php-fpm。php版本是7.1.16
php-fpm配置採用了pm = dynamic配置

後來運維給出MongoDB連線數客戶端分佈,發現確實是php佔用了大量的連線,一個服務高達40左右。現在可以確定是確實是php佔用了大量連線。只有排查原因。

原因

最後在一位公司同事閱讀了php7相關原始碼才發現,php7MongoDB擴充套件中,php客戶端是長連線(及時請求結束,只要php-fpm程式沒有殺掉,連線就一直保持,目的是下次請求時減少連線帶來的效能消耗),並且沒有關閉連線的函式。

解決辦法

而我們php-fpm配置中,pm.min_spare_servers = 100pm.max_spare_servers = 200,空閒程式是至少開了100,所以大量空閒連線佔用了MongoDB連線。

然後我們根據實際情況,配置改為pm.min_spare_servers = 5pm.max_spare_servers = 10。重新部署後解決問題。連線數降了下了,沒有超過100.

總結

在PHP7中,MongoDB 是長連線,一個請求完,對應得php-fpm程式沒有被kill掉化,這個連線不會斷開,會一直保持。所以要減少連線個數,需要合理設定php-fpm空閒程式數

本作品採用《CC 協議》,轉載必須註明作者和本文連結

相關文章