一段时间后,.NET Parallel Tasks变慢

时间:2015-02-25 07:09:50

标签: c# .net task-parallel-library windows-server-2012

我有一个应用程序通过执行ICR识别并根据坐标剪切tiff文件的某些字段来处理tiff图像,然后将每个图像块保存到数据库中。我们需要每分钟处理大量图像,因此我们需要同时处理图像的各种线程。

运行应用程序的环境是具有256GB RAM的Windows Server 2012 DataCenter版本,2个Intel Xeon处理器,每个处理器18个核心,以及RAID 0配置中的7个SSD驱动器等等。

因此,我们希望并行运行最多28个线程。为此,我们使用TPL库来启动并行任务。这是代码示例:

private void btnIniciar_Click(object sender, EventArgs e) {    
    if (managerTokensCancelacion != null)
        managerTokensCancelacion.Dispose();

    managerTokensCancelacion = new CancellationTokenSource();
    tokenCancelacion = managerTokensCancelacion.Token;

    for (int cnt = 0; cnt < 28; cnt++) {
        Task.Factory.StartNew(myAction(cnt+1), tokenCancelacion);
    }

}

private Action myAction(int numThread) {
    return () => {
        try {
            while (true) {
                (new BusinessClass()).splitAndReadImage(numThread)); 
                tokenCancelacion.ThrowIfCancellationRequested();
            }
        }
        catch (OperationCanceledException ex) {
            Console.WriteLine("Cancelled process");
        }
    };
}

我们有一个BusinessClass来完成所有逻辑,但基本功能是在数据库中搜索图像(我们有并发机制,以避免各种线程处理相同的图像)。我们处理所有对象以避免内存泄漏。

问题是,应用程序在前一两分钟运行正常,具体取决于我启动的进程数。它使用了图中所示的所有内核(这不是生产服务器,但它有8个内核)。

但是,当我处理近400张图像时,它会变慢并且任务可能只使用一个核心顺序运行。

我的代码中出现了一些问题?正如我之前提到的,我们没有内存泄漏问题,它使用相同的内存运行而不是不断增加,我们在每次迭代时处理所有对象,但突然它减速并停止使用所有可用内核。也许是关于Windows Server的东西?还是TPL库的错误?数据库查询在每次迭代时运行良好。

1 个答案:

答案 0 :(得分:0)

我建议你在&#34; Timeline&#34;中尝试使用JetBrains dotTrace探查器。模式。 https://www.jetbrains.com/profiler/help/Analyzing_Concurrency_Profiling_Results_Timeline_.html

它会向您展示您的应用程序减慢速度的准确性 - 这是因为垃圾收集或任何IO操作而发生的。