什么导致SocketException(9001)在node.js app和MongoDB ReplicaSet中处理请求?

我有一个简单的node.js应用程序,使一个调用连接调用到我的副本集。 事情今天早些时候工作正常,应用程序没有任何改变,现在我的连接失败(默默),我在我的mongod日志中看到以下内容。

Thu Apr 18 17:16:56 [conn1782026] end connection 10.xxx:50720 (40 connections now open) Thu Apr 18 17:16:57 [initandlisten] connection accepted from 10.xxx:50721 #1782027 (41 connections now open) Thu Apr 18 17:16:57 [initandlisten] connection accepted from 10.xxx:50722 #1782028 (42 connections now open) Thu Apr 18 17:16:57 [initandlisten] connection accepted from 10.xxx:50723 #1782029 (43 connections now open) Thu Apr 18 17:16:57 [initandlisten] connection accepted from 10.xxx:50724 #1782030 (44 connections now open) Thu Apr 18 17:16:57 [initandlisten] connection accepted from 10.xxx:50725 #1782031 (45 connections now open) Thu Apr 18 17:16:57 [initandlisten] connection accepted from 10.xxx:50736 #1782032 (46 connections now open) [conn1782028] SocketException handling request, closing client connection: 9001 socket exception [2] server [10.xxx:50722] 

我一直无法find是什么原因或如何解决这个问题。

这是我的连接代码:

 var _ = require("underscore"); var db_options = { db:{ w:1, native_parser: false }, server:{ auto_reconnect:true, socketOptions: {} }, replSet:{ rs_name: "my_replset_name", readPreference: "secondary" }, mongos: {} }; db.client.connect("mongodb://server1:27017,server2:27017,server3:27017/my_database", db_options, function(err, _db){ if(err){ console.log(err); }else{ _db.collection("my_collection", function(err, collection){ collection.find({q:1}).toArray(function(err,item){ if(err){ console.log(err); }else{ _.each(item, function(r){ if(!_.isEmpty(r)){ // do something with this item! console.log(r._id); } }); console.log("Finished."); } }); }); } }); 

我正在EC2上运行我的ReplicaSet,一切都可以成功地连接到对方,有一个简单的node.js应用程序,可以对我的ReplicaSet进行单个调用连接调用 – 就像我说的,这个工作,然后停止工作,恕不另行通知。

有没有人有任何见解呢? 是什么造成的? 如何预防呢? 如何解决它?

提前致谢。

使用所提供的信息很难诊断,但可能的线索是您打开的连接数(数字以1 – conn1开始 – 每增加一个连接)。 conn1782026表示自从此mongod启动以来,您已经开启了近180万个连接。 在并发连接数为40的情况下,我希望这个mongod已经等了长时间才能看到这个连接的数目已经打开和closures了。

如果不是的话,那么这可能是一个暗示。 你每次运行一个查询或者类似的时候都创build新的连接吗? 如果是这样,你可能需要调整你的代码池连接,而不是(见这里的各种选项 )。

从理论上讲,无论如何你都应该能够做到这一点 – 本身有很多联系是不会引起问题的,但是这里stream失的数量可能会有意想不到的后果。 尝试重新启动mongod ,testing,如果仍然有重新启动实例并再次testing。 如果任何一个人清除了这个问题,那么它就不可能与networking相关(系统的重置会重置networking接口,所以仍然有一个小的机会),尽pipe它performance为套接字exception。

顺便说一句,如果你想知道你创build了多less个连接,请看这里:

 > db.serverStatus().connections { "current" : 1, "available" : 2047, "totalCreated" : NumberLong(1) } 

totalCreated是特定mongodmongos进程生命周期的计数器。 如果按正常运行时间划分,则还可以获得每秒创build的平均值等。

如果您想更进一步,您可以使用优秀的工具来绘制一段时间内连接stream失的图表,并查看连接创build/销毁是否有特别高的峰值。

如果重置没有任何效果,并且您仍然看到exception,那么现在是查看您的networking的时候了。 检查netstat -s (多个样本)的输出,并寻找递增的重发和快速重传,运行ifconfig在接口上查找错误,ping,traceroute等等 – 所有常见的事情,你会试图确定是否存在一个networking问题。