Iis 7 IIS 7.0 Web Garden中的MongoDB C套接字异常(例如:每个套接字地址(协议/网络地址/端口)通常只允许使用一次)

Iis 7 IIS 7.0 Web Garden中的MongoDB C套接字异常(例如:每个套接字地址(协议/网络地址/端口)通常只允许使用一次),iis-7,mongodb-.net-driver,web-garden,Iis 7,Mongodb .net Driver,Web Garden,我有一个ASP MVC应用程序,它使用10gen Mongo C驱动程序连接到特定端口上的数据库服务器。我在一个IIS7.0WebGarden中部署了它,它有3个工作进程。在加载时,每隔几分钟就会引发以下异常,并将500返回给用户: Only one usage of each socket address (protocol/network address/port) is normally permitted <database-ip>:<database-port>

我有一个ASP MVC应用程序,它使用10gen Mongo C驱动程序连接到特定端口上的数据库服务器。我在一个IIS7.0WebGarden中部署了它,它有3个工作进程。在加载时,每隔几分钟就会引发以下异常,并将500返回给用户:

Only one usage of each socket address (protocol/network address/port) is normally permitted <database-ip>:<database-port>

Stack Trace:    

   at System.Net.Sockets.Socket.DoConnect(EndPoint endPointSnapshot, SocketAddress socketAddress)
   at System.Net.Sockets.Socket.Connect(EndPoint remoteEP)
   at System.Net.Sockets.TcpClient.Connect(IPEndPoint remoteEP)
   at MongoDB.Driver.Internal.MongoConnection.Open() in C:\work\10gen\mongodb\mongo-csharp-driver\Driver\Internal\MongoConnection.cs:line 266
   at MongoDB.Driver.Internal.MongoConnection.GetNetworkStream() in C:\work\10gen\mongodb\mongo-csharp-driver\Driver\Internal\MongoConnection.cs:line 409
   at MongoDB.Driver.Internal.MongoConnection.SendMessage(MongoRequestMessage message, SafeMode safeMode) in C:\work\10gen\mongodb\mongo-csharp-driver\Driver\Internal\MongoConnection.cs:line 377
   at MongoDB.Driver.Internal.MongoConnection.RunCommand(String collectionName, QueryFlags queryFlags, CommandDocument command) in C:\work\10gen\mongodb\mongo-csharp-driver\Driver\Internal\MongoConnection.cs:line 296
   at MongoDB.Driver.Internal.MongoConnection.Authenticate(String databaseName, MongoCredentials credentials) in C:\work\10gen\mongodb\mongo-csharp-driver\Driver\Internal\MongoConnection.cs:line 98
   at MongoDB.Driver.Internal.MongoConnection.CheckAuthentication(MongoDatabase database) in C:\work\10gen\mongodb\mongo-csharp-driver\Driver\Internal\MongoConnection.cs:line 195
   at MongoDB.Driver.MongoServerInstance.AcquireConnection(MongoDatabase database) in C:\work\10gen\mongodb\mongo-csharp-driver\Driver\Core\MongoServerInstance.cs:line 185
   at MongoDB.Driver.MongoServer.AcquireConnection(MongoDatabase database, Boolean slaveOk) in C:\work\10gen\mongodb\mongo-csharp-driver\Driver\Core\MongoServer.cs:line 893
   at MongoDB.Driver.MongoCursorEnumerator`1.AcquireConnection() in C:\work\10gen\mongodb\mongo-csharp-driver\Driver\Core\MongoCursorEnumerator.cs:line 184
   at MongoDB.Driver.MongoCursorEnumerator`1.GetFirst() in C:\work\10gen\mongodb\mongo-csharp-driver\Driver\Core\MongoCursorEnumerator.cs:line 194
   at MongoDB.Driver.MongoCursorEnumerator`1.MoveNext() in C:\work\10gen\mongodb\mongo-csharp-driver\Driver\Core\MongoCursorEnumerator.cs:line 126
   at System.Linq.Enumerable.FirstOrDefault[TSource](IEnumerable`1 source)
   at MongoDB.Driver.MongoCollection.FindOneAs[TDocument](IMongoQuery query) in C:\work\10gen\mongodb\mongo-csharp-driver\Driver\Core\MongoCollection.cs:line 493
   at MongoDB.Driver.MongoCollection.FindOneByIdAs[TDocument](BsonValue id) in C:\work\10gen\mongodb\mongo-csharp-driver\Driver\Core\MongoCollection.cs:line 529
   at MongoDB.Driver.MongoCollection`1.FindOneById(BsonValue id) in C:\work\10gen\mongodb\mongo-csharp-driver\Driver\Core\MongoCollection.cs:line 1462
我花了很多时间在谷歌上搜索这个异常,几乎让自己相信我的套接字已经用完了,如中所述

但我增加了可用套接字的最大数量并降低了TIME_WAIT值,这并没有影响问题

我最近想到,尽管Mongo驱动程序进行连接池,但每个工作进程都有自己的池。这些池要么一起工作以使系统的套接字耗尽,要么只是试图同时使用相同的套接字地址。后一种情况似乎更可能出现,因为这正是异常所暗示的,并且当站点部署到单个进程时,问题不会发生。但是在web花园之外,性能的降低是非常明显的,如果进程崩溃,回收延迟是不可接受的。也就是说,用户得到500条回复同样是不可接受的

我曾考虑过以下几点:

在try/retry-n-times/fail结构中包装所有数据访问调用,这是一个丑陋的错误做法 过渡到多机器而不是多进程在当前用户负载下成本高昂且不必要 问题:

有没有办法让这些工作进程优雅地共享地址/端口? 有没有一种方法可以执行某种类型的“端口触发”,我确信这不是正确的术语,每个工作进程的传出连接可以使用不同的本地端口连接到同一个远程端口?远程计算机可以在同一端口上处理多个传入连接,而不会出现问题。 如果您认为我的套接字用完了,是否有办法限制每个进程的套接字连接数,以便它们可以共享65536个套接字。