我們最近將我們的Web應用程序升級到MongoDB C#Driver 2.0並部署到生產環境。在一定的負載下,應用程序運行良好。一旦生產服務器上的負載超過一定限度時,應用程序的CPU瞬間下降到0,約30秒後,這個記錄異常幾次:MongoDB C#2.0 TimeoutException
System.TimeoutException message: A timeout occured after 30000ms selecting a server using CompositeServerSelector{ Selectors = ReadPreferenceServerSelector{ ReadPreference = { Mode = Primary, TagSets = System.Collections.Generic.List`1[MongoDB.Driver.TagSet] } }, LatencyLimitingServerSelector{ AllowedLatencyRange = 00:00:00.0150000 } }. Client view of cluster state is { ClusterId : "1", Type : "Standalone", State : "Disconnected", Servers : [{ ServerId: "{ ClusterId : 1, EndPoint : "Unspecified/10.4.0.113:27017" }", EndPoint: "Unspecified/10.4.0.113:27017", State: "Disconnected", Type: "Unknown" }] }.
stack trace:
at MongoDB.Driver.Core.Clusters.Cluster.ThrowTimeoutException(IServerSelector selector, ClusterDescription description)
at MongoDB.Driver.Core.Clusters.Cluster.<WaitForDescriptionChangedAsync>d__18.MoveNext()
--- End of stack trace
我們使用的是單MongoClient對象,這是發起這樣的:
private static object _syncRoot = new object();
private static MongoClient _client;
private static IMongoDatabase _database;
private IMongoDatabase GetDatabase()
{
...
if (_client == null)
{
lock (_syncRoot)
{
if (_client == null)
{
_client = new MongoClient(
new MongoClientSettings
{
Server = new MongoServerAddress(host, port),
Credentials = new[] { credentials },
});
_database = _client.GetDatabase("proddb");
return _database;
}
}
}
return _database;
}
public IMongoCollection<T> GetCollection<T>(string name)
{
return GetDatabase().GetCollection<T>(name);
}
到數據庫中的典型調用如下:
public async Task<MongoItem> GetById(string id)
{
var collection = _connectionManager.GetCollection<MongoItem>("items");
var fdb = new FilterDefinitionBuilder<MongoItem>();
var f = fdb.Eq(mi => mi.Id, id);
return await collection.Find(f).FirstOrDefaultAsync();
}
我們怎樣才能找出原因和解決這個問題?
這是要花費更多的診斷。你可以在jira.mongodb.org的CSHARP項目下申請一張票嗎? 我可以告訴你,從異常告訴我們,我們不再連接到服務器。發生了一些事情,導致我們失去連接。所以,我希望看到的一件事是來自服務器的日誌(它看起來好像你只有一個在獨立模式下運行)。 –
我每次都在ASP.NET MVC應用程序中獲得相同的超時異常,但是從控制檯應用程序使用相同的庫,我從來沒有看到它。 –
你知道如何解決你的錯誤嗎? – RPDeshaies