在多线程分布式应用程序中提高性能成本

时间:2012-02-22 16:10:23

标签: .net multithreading performance memory-management

我设法将网络应用程序性能提高了10%。有了这个,我注意到内存使用量增加了一倍!!!

测试应用程序执行:调用Web服务,执行一些复杂的业务操作* [用户数] * [次数]

我检查了我的更改代码,但是没有什么可以使用更多的内存..(我所做的就是删除将DataSet序列化为byte []并将其保存在缓存中的代码行) 我在多线程测试中一次又一次地检查:

  1. 当我跳过越来越多的代码(性能提升 - 内存上升
  2. 因为我在一个循环中重复了错误的代码(性能不好 - 内存耗尽)
  3. 任何人都能解释为什么????

    以下代码:

    之前:(周期时间:100%记忆100%)

                outStream = new MemoryStream();
                new BinaryFormatter().Serialize(outStream, stateData); 
                outStream.Close();
                SessionSettings.StateData_Set(stateId, outStream.ToArray());
                outStream.Dispose();
    

    选项1之后:(周期时间:200%内存50%)

    for (int i = 0; i < 20; i++)
                {
                    outStream = new MemoryStream();
                    new BinaryFormatter().Serialize(outStream, stateData); 
                }
                outStream.Close();
                SessionSettings.StateData_Set(stateId, outStream.ToArray());
                outStream.Dispose();
    

    选项2之后:(周期时间:90%内存200%)

                    //outStream = new MemoryStream();
                    //new BinaryFormatter().Serialize(outStream, stateData); 
                //outStream.Close();
                SessionSettings.StateData_Set(stateId, null);
                //outStream.Dispose();
    

    SessionSettings.StateData_Set将对象放入

    dictionary<string,dictionary<string, object>>
    

    表示

    <Sessions<DataKey,DataObject>>
    

    在每个循环结束时,内部字典删除条目 并且在每个用户会话结束时,从外部字典中删除整个内部字典。

2 个答案:

答案 0 :(得分:4)

另一个猜测:如果您的应用程序分配了太多内存(可能通过频繁的序列化),CLR将更频繁地触发GC。通过观看性能计数器 - &gt;你会注意到GC的时间,GC占用了大量的CPU - 我看到场景高于40%。如果您的数据集很大并且byte []存储在LOH上结束,则尤其如此。

通过限制这些分配,GC的触发频率会降低,从而导致更好的应用程序性能。观察到内存增加的原因可能是托管堆现在在健康区域中工作得更多。

为了找到更可靠的解释,请发布一些性能对策:优化之前和优化之后。有趣的是:整体堆大小,GC中的时间花费。

答案 1 :(得分:3)

由于您没有提供任何代码,只提供简短的解释,因此它更像是一个谜语而不是一个问题。

因此,也许10个用户几乎同时访问了CACHED DATASET。用户同步锁定和查看CACHED DATASET(一次一个)。这在多线程测试中表现不佳,但会占用很少的内存。

也许10个用户几乎同时访问了REPLICATED DATASET(未缓存)。每个用户都有自己的REPLICATED DATASET副本。由于没有锁定/同步访问和DATASET的多个副本,内存会增加,但性能会提高。