【问题标题】:Is my performance issue WCF or network related?我的性能问题是 WCF 还是网络相关?
【发布时间】:2014-09-24 17:58:06
【问题描述】:

我有一个程序可以从可视化 foxpro 表中检索数千行数据,并将其显示给用户。然后,用户可以根据需要选择任意数量的支票,我将反向金额写入 10 个不同的 foxpro 表。

根据用户选择的信息,我为每个选择创建一条记录,并使用 WCF 将其写入表中。

下面是我用来写回表格的一段代码:

Task head = new TaskFactory().StartNew(() =>
       {

           CreateVoidHistHead(curChecks, i);
           //pass in _i which is defined within this routine.  Cannot have _i global.

           CreateApHead(curChecks, i);


           var checkRecAdjustment = CreateAdjustmentRec(curChecks, ckdate);
           var checkRecVoidChks = CreateVoidChksRec(curChecks);
           var checkGjAdj = CreateGjAdj(curChecks);
           var checkApSnpSht = CreateApsnpRec(curChecks);

           using (var coatsService = factory.CreateCoatsService())
           { 
               coatsService.InsertPrsnapc(_path, checkRecAdjustment);
               coatsService.InsertVoidchk(_path, checkRecVoidChks);
               coatsService.InsertGjadj(_path, checkGjAdj);
               coatsService.InsertApsnpsht(_path, checkApSnpSht);
           }
       });

正如您在上面的代码中看到的,我正在创建一个任务来处理此调用。我总共创建了 3 个任务。第一个任务是插入一个表,上面的任务是插入6个表,最后一个任务是插入3个表(都使用与上述类似的逻辑)。

这是我遇到的速度问题。当我选择10 checks 时,写入这些表的平均时间是10 seconds。如果我选择20 checks,平均时间是25 seconds50 checks = 1 分钟,100 checks10+ minutes。我什至将其分解为每个选定的项目级别。使用10 checks 选择的每个项目的平均值是1.48sec 20 checks2.6sec50 checks6.8 seconds,超过此值的任何内容都是12 seconds per check,但程序会停止几分钟,然后再次开始插入并停止并继续,等等,直到插入所有支票。 (每次检查的秒数是基于秒表类的,我已将其写入调试窗口。我没有将总时间除以检查次数。)

我尝试了 3 种不同的场景:

  1. 如上所述,我使用所有插入创建了 3 个任务。我选择了 100 个检查,并且我有一个后台计时器,它将检查所有任务的状态(在本例中为 300),它会在任务完成时通知我。这花了十多分钟。

  2. 如上所述,我使用所有插入创建了 3 个任务。我选择了 100 个检查,并等待所有任务完成,然后再进行下一个检查。这也花了十多分钟。

  3. 我选择了 100 个检查,但没有任何任务正在运行。我只是使用主线程将信息写回表中。它与我上面任务中的代码相同,减去任务。写入所有表的时间超过 10 分钟。

如您所见,无论我有任务和后台计时器、任务并等待所有任务或没有任务,我的速度都没有提高。

其他信息 - 我已将应用配置更改为 ma​​xconnections = 300listenbacklog = 300。我不确定这是否会影响我正在做的任何事情,但我想我会把它扔掉。

问题:

  1. 谁能解释为什么每张支票的平均插入时间会根据所选支票的数量而变化?在我看来,我认为如果我选择 10 个检查或 100 个检查,则每个检查应该更加一致,而不是 1.48sec 用于 10 组,12 seconds 用于 100 组。

  2. 间歇性写 15 次左右检查,然后停止 1 到 3 分钟,然后继续处理,然后停止等,为什么当我查看输出窗口时,我看到线程' ' 以代码 259 退出?我看过Why am I seeing multiple "The thread 0x22c8 has exited with code 259 (0x103)." messages,但我无法真正解决我的问题。当我单击该问题的解决方案中的链接时,它会将我带到一个 Microsoft 论坛,上面说该问题已在 Visual Studio 的未来版本中得到解决。

  3. 这可能是网络问题吗?由于我正在尝试通过 WCF 处理 100 次插入,这可能是导致我的性能问题的原因吗?

非常感谢任何帮助我指出如何解决此性能问题的正确方向,无论是网络还是 WCF 相关。如果需要其他信息,请告诉我,我会更新票证。

【问题讨论】:

  • 使用分析器。有多少并发操作和任务?
  • 正如@usr 指出的,使用分析器。它将准确地告诉您每种方法需要多长时间以及瓶颈可能在哪一行。至少,您应该对这些调用中的每一个进行计时,以查看哪个调用的增长速度越来越慢,并且呈指数级增长。这至少会给你一个关于问题可能出在哪里的小概念。但是,是的,分析器将是您最好的朋友。
  • 您为什么要使用 WCF 来执行此操作 - VFP 数据是远程的吗?
  • 我在我的代码中发现了一个问题。我正在为每个连接调用 WCF 服务(因为它们正在写入不同的表),并且在每次调用后我都没有处理这些服务。我每次都在启动一项新服务,而且它一直在堆积。这就解释了为什么 10 或 20 次检查很快但 100 次检查很慢......(即打开 1000 多个连接并进行 100 次检查!)。在我对这些调用进行了使用之后,我正在体验一个更快的程序。
  • 我们的网络遇到了问题,而且没有处理,这只是一个糟糕的交易。感谢您对探查器@usr 的建议,这将有很大帮助。

标签: c# multithreading performance wcf visual-foxpro


【解决方案1】:

我的问题的答案是两者兼而有之。

我确实建议使用分析器(感谢 usr 的建议)来查看瓶颈在哪里。

我的公司遇到了网络问题,导致整个网络速度变慢,但如果其他人遇到此问题,请确保您正在处理所有连接。

我的主要问题是我正在创建 100 到 1000 个连接,而不是用 using 将它们全部包围...我进行了更改并将所有连接包装在 using 中,中提琴问题解决了。现在,我在 50 次检查和 100 次检查到 350 次检查之间获得了相似的性能。

对于那些不知道如何使用 using 的人来说,这里是:

C#

    using (var coatsService = _factory.CreateCoatsService())
    {
        var cls = coatsService.GetPrdedtxts(_path);
        return cls.ToList();
    }

VB

    Using coatsService = _factory.CreateCoatsService()
        Dim cls = coatsService.GetPrdedtxts(_path)
        return cls.ToList()
    End Using

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-12-01
    • 1970-01-01
    • 1970-01-01
    • 2020-07-15
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多