如何让服务器应用程序使用单独的核心

时间:2010-12-15 09:47:28

标签: c# .net

我们有一个数据库服务器应用程序,它包含以下组件: 1)具有接受Web服务调用的数据库的服务应用程序 2)工作者应用程序(exe),它向服务应用程序发出Web服务请求以获得一些工作。然后它做了一些工作并直接更新数据库,然后调用另一个Web服务请求让服务应用程序知道工作已经完成。

我们运行了许多工作者应用程序(换句话说,运行可执行文件几次,因此有多个实例运行),因此每个人都可以从服务应用程序请求工作,并在没有其他工作者应用程序干扰的情况下继续工作。

如果我将此应用程序移动到具有多个内核的计算机,是否有办法在不同的内核上拆分工作程序应用程序,同时在不同的内核上安装服务应用程序?

由于我多次运行相同的应用程序工作者,除了在其中放入一些代码检查它在不同内核上运行了多少个实例之外,我无法看到如何执行此操作。

在过去的测试中,我看到所有正在运行的工作程序应用程序和服务应用程序在同一个核心上运行,这使得我有3个内核无所事事时最大化。

有什么想法吗?

JD。

3 个答案:

答案 0 :(得分:4)

手动强制每个应用程序在特定核心上运行并不是一个好主意。 有很多问题。

如果您移动到另一台具有两个核心的计算机(更改代码不是一个好主意),该怎么办?

您将为您的应用程序创建瓶颈,因为操作系统还有其他系统任务,并且同一台计算机上还有其他应用程序,而核心3上的应用程序正在等待时间片,而核心2是免费的,但是您告诉OS在核心3上运行它。你无法控制外部因素。请记住,OS将使用复杂的算法进行任务调度,并且很难比OS做得更好。

我建议您在应用程序中使用Task Library .NET 4.0。它将决定如何以有效的方式使用机器的多个核心。

答案 1 :(得分:3)

  

在过去的测试中,我看到了所有工人   应用程序运行和服务   应用程序在同一个核心上运行,   当我有3时,这是最大限度的   核心无所事事。

这是编程中的一个基本问题。工作者是独立的进程=单独的线程,因此它们按照定义分布。

如果你有4个,其中1个正在完成所有工作,3个闲置,那可能是:

  • 你的工作人员正在阻止,所以当一个人为exampel工作时,db会锁定其他人,所以他们正在处理一个请求,但正在努力完成一个请求。因为数据库锁定而存在例外情况。
  • 您的工作分配有问题,例如服务器将所有请求发送给一个工作人员而不是分发它。在这种情况下,额外的工人基本上是随身携带的多余行李。

两者都不是操作系统问题。操作系统通常会将线程分配给治疗,而多个进程是多个线程,因此它们会默认分配。

例如,错误的一件事是您的服务应用程序不是多线程的,因此虽然它可以将负载分配给工作人员,但它始终只处理一个请求(这可能是配置/ Web服务设置问题)。这自然意味着只有一个过程总是从那里得到处理。看到发生了什么。

答案 2 :(得分:2)

老实说,如果你计划重写它以支持多个内核,那么在.NET4中使用多线程就可以了,这将是一个更好的应用程序抽象 - 而不是每个任务的应用程序的一个实例,一个应用程序使用异步线程执行所有任务,这将自动在多个核心上进行处理。 只是我/ 2c。