【发布时间】:2010-07-07 08:15:40
【问题描述】:
规格
- C# 分布式应用程序。
- 客户端/服务器设计。
- 客户端(Winforms)、服务器(Windows 服务)、通过 .Net Remoting 进行通信。
- 以下问题与应用程序的服务器端有关。
- (编辑) 应用程序的服务器端 在具有 8 核 和 12Gb 的服务器上运行拉姆
- (编辑) 由于许多其他服务正在运行,此服务器的 CPU 始终达到 80% 使用率 左右在同一台服务器上运行。
场景
- 我继承了一个大型遗留应用程序。
- 它执行大量任务,其中一些是独立的,而另一些则不是。
- 此应用程序的当前设计涉及创建 14 个线程,每个线程运行 1 个任务或多个任务。
- 问题是我感觉这个设计元素对性能有影响。
代码示例 - 每个类/线程的设计和运行方式
public class ManageThreads
{
private Thread doStuffThread = null;
//Inside the constructor EVERY thread is instantiated and run.
//(I am aware that this example only shows the use of 1 thread).
public ManageThreads()
{
doStuffThread = new Thread(new ThreadStart(DoSomeStuff.Instance.Start));
doStuffThread.Start();
//Instantiate and run another thread.....
//Instantiate and run another thread.....
//Instantiate and run another thread.....etc.
}
}
public class DoSomeStuff
{
void Start()
{
while(true)
{
//Repeatedly do some tasks.....
Thread.Sleep(5000);
}
}
}
想法
- 我想做的是保留现有代码,但修改它的运行方式。
- 我曾考虑使用 线程池 来解决此问题,但鉴于当前的架构,我不确定如何去做。
问题
- 当前的设计会显着影响性能吗?
- 我是否可以在不改变底层功能但稍微改变设计的情况下提高此应用程序的性能?
- 谁能推荐任何东西/建议我以正确的方式改进它?
非常感谢您的帮助。
【问题讨论】:
-
如果你有超线程和四核CPU,就像有8个逻辑处理器,你应该
ThreadPool.SetMaxThreads=7。如果工作是reactive,您的DoSomeStuff中可能会有一些if (shouldWork) work,并且您可能在应用程序的某个位置设置shouldWork=true(伪代码)。你可以做ThreadPool.QueueUserWorkItem,而不是shouldWork=true。它可能需要一个包装器。 -
我看到了您的编辑,那么您可能有 16 个逻辑 CPU 可供您使用,因此上下文切换不应该发生太多(除非您已经在运行许多线程)。在您的应用程序的
ThreadPool版本中,您可能不会看到太大的性能差异(分析您的应用程序以识别您的性能问题)。
标签: c# design-patterns architecture multithreading