我正在为C#客户端使用CouchbaseNetClient 2.0.3.1,但在我开始对应用程序进行线程处理时遇到了内存不足的情况。虽然我没有尝试识别每一种可疑的情况,但我创建了一个简单的场景来演示我认为的过度内存使用。
我的Couchbase服务器有一个完全空的存储桶。在我的C#客户端上,我打开了一个存储桶,惊讶地发现我的应用程序的内存使用量此时超过了340MB。现在存储桶已打开,我尝试从数据库中删除10个无效项。内存使用量保持不变。然后,我开始并发地运行项目的删除,开始看到内存使用量的增加,并看到它最终稳定在1 GB左右。
我担心周围的高内存使用率,但在我看到的情况下,并发处理似乎不是一种选择。我能做些什么来防止如此高的内存使用率,或者这是一个可以解决的问题吗?
class Program
{
static void PrintMemoryUsage(string label)
{
var mb = 1024 * 1024;
var gc = GC.GetTotalMemory(true) / mb;
var pm = Process.GetCurrentProcess().PagedMemorySize64 / mb;
Console.WriteLine($"{label}: GC={gc} MB PM={pm} MB");
}
static void ExampleOfThreadedMemoryIssue()
{
var cluster = new Couchbase.Cluster();
var poolConfig = cluster.Configuration.PoolConfiguration;
poolConfig.MaxSize = Environment.ProcessorCount;
poolConfig.BufferSize = 1024 * 1024 * 20;
PrintMemoryUsage("Created a cluster");
var bucket = cluster.OpenBucket("default");
PrintMemoryUsage("Opened a bucket");
for (int i = 0; i < 10; ++i)
{
bucket.Remove("CompletelyInvalidKey");
}
PrintMemoryUsage("Removed 10 items serially");
for (int concurrent = 1; concurrent <= 10; ++concurrent)
{
var tasks = new List<Task>();
for (int i = 0; i < concurrent; ++i)
{
tasks.Add(Task.Run(() =>
{
bucket.Remove("CompletelyInvalidKey");
}));
}
Task.WaitAll(tasks.ToArray());
PrintMemoryUsage($"Removed {concurrent} items concurrently");
}
Console.WriteLine("\nPress any key to continue.");
Console.ReadKey(false);
}
static void Main(string[] args)
{
ExampleOfThreadedMemoryIssue();
}
}以下是在我的机器上运行此示例的结果:
Created a cluster: GC=0 MB PM=18 MB
Opened a bucket: GC=321 MB PM=346 MB
Removed 10 items serially: GC=321 MB PM=346 MB
Removed 1 items concurrently: GC=321 MB PM=346 MB
Removed 2 items concurrently: GC=481 MB PM=508 MB
Removed 3 items concurrently: GC=641 MB PM=668 MB
Removed 4 items concurrently: GC=801 MB PM=829 MB
Removed 5 items concurrently: GC=961 MB PM=991 MB
Removed 6 items concurrently: GC=961 MB PM=991 MB
Removed 7 items concurrently: GC=961 MB PM=990 MB
Removed 8 items concurrently: GC=961 MB PM=990 MB
Removed 9 items concurrently: GC=961 MB PM=990 MB
Removed 10 items concurrently: GC=961 MB PM=990 MB
Press any key to continue.发布于 2015-05-05 06:55:31
内存使用率过高是因为您配置的缓冲池的大小: 1024 * 1024 * 20 (乘以MaxSize)
poolConfig.BufferSize = 1024 * 1024 * 20;默认值是1024*16,增加这个值有什么原因吗?Couchbase Server支持的最大文档大小为20MB。
https://stackoverflow.com/questions/29855734
复制相似问题