【问题标题】:Excessive memory usage with C# client in CouchbaseNetClient 2.0.3.1CouchbaseNetClient 2.0.3.1 中 C# 客户端的内存使用过多
【发布时间】:2015-04-24 19:18:25
【问题描述】:

我正在为 C# 客户端使用 CouchbaseNetClient 2.0.3.1,当我开始线程化我的应用程序时遇到了内存不足的情况。虽然我没有尝试找出所有可疑情况,但我创建了一个简单的场景来演示我认为内存使用过多的情况。

我的 Couchbase 服务器有一个完全空的存储桶。在我的 C# 客户端中,我打开一个存储桶,惊讶地发现我的应用程序的内存使用量此时已超过 340 MB。现在存储桶已打开,我尝试从数据库中删除 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.

【问题讨论】:

  • 也许是因为Task.WaitAll 等待所有进程完成,并且一些正在运行的进程比其他进程花费更长的时间,这就是我能想到的全部......但我正在拍摄乍一看在黑暗中...Task.WaitAll
  • 使用内存分析器。

标签: c# memory couchbase


【解决方案1】:

过多的内存使用是因为你配置的缓冲池的大小:1024 * 1024 * 20(乘以 MaxSize)

 poolConfig.BufferSize = 1024 * 1024 * 20;

默认是1024*16,有什么理由增加这个吗? Couchbase Server 支持的最大文档大小为 20MB。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-04-05
    • 2012-08-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多