【问题标题】:Performance Improvement using multiple instances of an application使用应用程序的多个实例提高性能
【发布时间】:2010-10-12 15:27:32
【问题描述】:

我有一个性能敏感的 .net 应用程序。

它能够并行处理多达 32 个线程。我们需要进一步改进它。增加线程可能并没有真正的帮助,因为随着线程数量的增加,处理失败的次数也会增加。

我的问题是,

  1. 还有哪些可以提高性能的选项?

  2. 如果我运行同一个应用程序的两个实例,每个实例并行运行 32 个线程,会有任何可能的改进吗?考虑到每个应用程序都将在不同的 AppDomain 中运行,这只是一个疯狂的想法。

【问题讨论】:

  • 是 CPU 密集型还是 I/O 密集型?你的机器有多少个 CPU/内核?
  • 您的 CPU 利用率如何?你已经饱和了所有的核心吗?如果是,添加更多线程将无济于事;您必须优化代码的基本性能,或为计算机添加更多内核。
  • 应用程序必须调用 WCF 服务。所花费的时间和过程的成功以及所花费的时间主要取决于服务。服务调用同步发生。

标签: .net performance


【解决方案1】:

最好的办法是在进行任何更改之前严格衡量性能并确定瓶颈。在问题上抛出额外的线程或进程不太可能产生最佳解决方案。从这里开始extensive .Net profiler information

为什么 32 个线程是一个神奇的数字?这是否给您比 31/30/29 等更好的吞吐量?

这些线程不工作时在做什么?在任何给定时间,激活的线程数不能超过系统中的处理器内核数。如果您受 CPU 限制,那么添加更多线程会适得其反。

涉及多少上下文切换开销?

您的外部瓶颈候选者是什么 - 直接 I/O、网络、数据库?您还没有对应用程序的实际功能进行太多说明。

您的线程是否共享资源?单个共享数据项可能是一个重要的瓶颈,在这种情况下,添加线程也无济于事。如果可能,用线程本地替换共享数据。

【讨论】:

  • 瓶颈在于应用程序调用的 WCF 服务。该服务必须与 SQL Server 通信才能获得结果。
  • 听起来瓶颈在服务和/或数据库中,如果是这样,您就不能做太多事情(除非您还拥有系统的那部分)。如果是慢速数据库,服务是否可以缓存全部或部分数据以避免每次调用都访问数据库?另外-您可以更改为以异步模式调用服务吗?如果是这样,您应该能够以更少的线程获得类似的性能。
猜你喜欢
  • 1970-01-01
  • 2021-10-06
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2010-11-12
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多