最近发现服务端 MongoDB 经常链接异常,但是 mongoDB 服务并没有挂掉。
本地命令链接 MongoDB 服务端出现异常,提示如下。
[root@iZbp17nmmwr83guotvjxvzZ ~]# mongo
MongoDB shell version v4.4.6
connecting to: mongodb://127.0.0.1:27017/?compressors=disabled&gssapiServiceName=mongodb
Error: network error while attempting to run command 'isMaster' on host '127.0.0.1:27017' :
connect@src/mongo/shell/mongo.js:374:17
@(connect):2:6
exception: connect failed
exiting with code 1
PHP 错误日志
ERR: No suitable servers found (`serverSelectionTryOnce` set): [connection closed calling hello on '127.0.0.1:27017']
重启 mongoDB,发现 mongoDB 当前连接数和 php 当前的进程数成正比。
分析原因为当前 php 的进程数超过 mongoDB 的最大连接数。导致 mongoDB 的可用链接数被拉满,以致无法与其他客户端正常建立连接。
# 查询 mongo 链接数
> mongo
> db.serverStatus().connections;
{
"current" : 3310,
"available" : 49118,
"totalCreated" : 52224,
"active" : 3,
"exhaustIsMaster" : 2,
"exhaustHello" : 0,
"awaitingTopologyChanges" : 2
}
> db.serverStatus().connections;
{
"current" : 3323,
"available" : 49105,
"totalCreated" : 52523,
"active" : 3,
"exhaustIsMaster" : 2,
"exhaustHello" : 0,
"awaitingTopologyChanges" : 2
}
# 查询 PHP 进程数
[root@iZbp17nmmwr83guotvjxvzZ ~]# netstat -napo |grep "php-fpm" | wc -l
3349
[root@iZbp17nmmwr83guotvjxvzZ ~]# netstat -napo |grep "php-fpm" | wc -l
3380
[root@iZbp17nmmwr83guotvjxvzZ ~]# netstat -napo |grep "php-fpm" | wc -l
3346
[root@iZbp17nmmwr83guotvjxvzZ ~]# netstat -napo |grep "php-fpm" | wc -l
3353
根本原因:php 的 MongoDB 驱动扩展在每次 $conn=new MongoDB\Client("mongodb://localhost:27017");
的时候都会建立一个新连接,但该驱动扩展并未提供关闭连接的方法。参考 GitHub 的 issues 链接:https://github.com/mongodb/mongo-php-driver/issues/393
解决方法:找到原因那么就要解决问题,要么增加连接数限制,要么在代码中显式关闭创建的 MongoClient。要么使用连接池管理程序端与 mongoDB 的链接。同类问题参考链接:https://learnku.com/articles/34780?#reply262009
我这里将 PHP-Fpm 的运行模式由 static(静态)模式修改为了 dynamic(动态)模式。具体效果观察中。
正文完
有偿技术支持加微信