【问题标题】:C# Windows Service Threading Process Improve PerformanceC# Windows 服务线程处理提高性能
【发布时间】:2016-02-20 21:44:36
【问题描述】:

我们开发了windows服务,使用线程来消费数据库记录(一般是.Net 2.0)。代码块在下面展示。

for(int i=0;i<ThreadCount;i++)
{
   ParameterizedThreadStart pts=new ParameterizedThreadStart(MyCode.DoWork)
   Thread t=new Thread(pts);
    t.Start(someObject);
}

ThreadCount 从 app.config.MyCode.DoWork(Object someObject) 代码块中读取 SQL server 中的一些数据,以及一些操作。除了我们调用 sp,查询还包含 with(rowlock) vs.

while(someObject.Running)
{
   */select some data
}

主要问题是如何改进我的 Windows 服务。一些与手动创建线程相关的文章增加了 CPU 成本与如何提高我的应用程序性能。如果我使用并行任务库带来任何优势。创建任务而不是创建线程。任务是否手动创建线程以查看可用的 CPU 计数,或者我转换为喜欢。

for(int i=0;i<ThreadCount;i++){

   Task t=new Task(=>MyCode.Work());
}

【问题讨论】:

  • 你确定 CPU 是这里的问题,对我来说看起来 DB 是瓶颈吗?你衡量绩效吗?对于初学者,您可以尝试并行。因为它会自动调整胎面数量。
  • 没有CPU问题,但我正在努力提高我的性能。(有时CPU和DB探索编程,因为我们有很多windows服务,做一些操作db)。因为我们想要尽快操作我们的数据。

标签: c# multithreading performance


【解决方案1】:

要提高应用程序的性能,您需要找出性能不足的地方,然后找出不足的原因。很遗憾,我们无法为您执行此操作,因为它需要访问正在运行的 C# 和 SQL 代码。

我建议使用分析器工具(我使用Redgate's tool)或通过将分析代码添加到您的应用程序来进行一些性能分析。一旦您发现了瓶颈,您就可以对造成这些瓶颈的原因提出理论。

我会先从数据库开始——查看缓存的执行计划,看看是否有任何线索。尝试独立于服务运行存储过程。

【讨论】:

  • 特别是,没有恒定的CPU或DB问题。我只想提高我的性能。我对此很感兴趣,因为我们尽快操作数据。如果我们使用并行库会出现任何问题。
  • 如果没有CPU或数据库问题,那么代码慢在哪里?
  • 我很好奇如果我处理大约 5 分钟的一些数据操作,如何减少到 3.5 分钟。
  • 也许你有过度锁定数据库行的问题。你检查你的数据库服务器是如何执行的(特别是因为你使用了独占锁)
【解决方案2】:

为了让事情更简单,并假设 Windows 服务是唯一访问数据库的客户端。 1.尝试从一个线程访问数据库。假设在访问数据时存在争用,这减少了 db 表上的锁争用。 2. 将检索到的数据放入队列中,让 TPL 任务处理数据以利用所有 CPU 内核,假设您的性能瓶颈是 cpu 3.然后买多少你买得起的cpu核心。

这是一个直观的模式,其中有很多假设。您需要分析和分析您的程序,以了解这是否合适。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-04-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多