提高应用程序性能和智能化

5

我有一个关于应用程序性能和智能的问题。

我创建了一个窗口服务,如果我在三台不同配置的机器上运行它。我希望它能够利用机器的适当资源(CPU 和内存)。

比如说机器1(M1)只有单核和1GB的内存;

机器2(M2)有两个核心和2GB的内存;

机器3(M3)有4个核心和4GB的内存。

现在,当我的服务在这些机器上运行时,它应该利用适当的资源。比如说,如果机器的 CPU 使用率为1%,它应该使用最多达到50%或更高。如果已经使用了50%,则只使用30%。内存也是如此。但绝不能超过90%或其他限制。

基本上,我编写了一个多线程服务,目前不关心机器资源并继续利用它。我想在其中包含这种智能。

请帮我提供你的想法。

谢谢


我提出这个问题是因为我的应用程序可以在任何配置的机器上运行。如果它在单线程的机器上运行,它几乎会访问所有资源,如100%和70到80%的内存。我不希望这样。我想创建一个完美的资源管理器,可以在任何类型的配置机器上运行,并且仍然可以完美地工作。 - sunder
你能否将线程设置为低优先级,这样它只会在没有其他程序需要使用系统资源时才会利用它们? - Archeg
我并不使用线程优先级,只使用普通线程。因为这可能会导致资源匮乏。我想要避免这种情况,并手动处理以便我的服务可以在任何系统配置下优雅地运行。 - sunder
据我所知,Windows只提供了一个拉杆来控制线程的活跃度 - 优先级。你只能通过这个参数来调整CPU使用率。但我不认为你希望这是答案,所以我会和你一起等待有人证明我错了 :) - Archeg
我不否认你试图向我传达的信息,Archeg。但我想说,提高线程优先级并不是良好的线程设计。我试图通过使用线程监视器和资源管理器来根据CPU使用情况增加线程数量。我已经有了线程监视器,现在需要创建一个资源管理器,它将指导我是否增加或减少正在执行的线程。我脑海中正在考虑类似于这样的东西。我正在等待那些以前做过这种事情的人给出更好的反馈。 - sunder
1
不,我认为那并不对。线程计数不应该因系统负载而减少/增加。这样你就试图欺骗Windows调度程序,但Windows调度程序非常聪明,能够找出哪个进程可以增加或减少。合理的做法是,在有多个处理器时增加线程计数。您可以在书籍“并行编程模式”(Stephen Toub)中了解更多信息。TPL具有应自动解决此问题的构建,因此您无需考虑此问题。 - Archeg
2个回答

4
正如Archeg所说,基于处理器数量,您可以增加线程数。但是根据CPU活动增加线程数是错误的方法。
从这个角度来看——CPU调度程序以毫秒粒度分配时间片。如果系统中其他进程的负载较低,它会给予您的进程更多时间。如果有很多进程,则您将更少地获得时间片。您不应该使用比必要更多的线程来破坏它。
您需要做的是决定您想要做什么。服务是否对时间敏感?如果是这样,在高负载系统中,您拥有更少的CPU时间来操作,在空闲系统中,您可以在相同的一秒钟内使用更多的CPU时间。请注意:如果您的服务执行I/O操作,可能会限制您的服务本身可以使用多少CPU。
对于RAM,您可以进行某些操作,例如根据系统的可用空闲RAM量,切换算法以使用更少的处理或更快地处理,但需要更多的内存(反之亦然)。
重点是,除了更好的调度程序(这是许多聪明人多年来一直在研究的内容)外,没有“服务无关”的智能缩放方式。但是,您可以编写意识到当前系统限制并相应更改行为的服务。

2
构建高性能的.NET应用程序,如果您从一开始就考虑性能,则会更加容易。确保您在项目开始时制定性能计划。不要试图将性能作为后期构建步骤添加。此外,请使用迭代式开发过程,在迭代之间进行不断的测量。
通过遵循最佳实践设计准则,您可以显著提高创建高性能应用程序的机会。请考虑以下设计准则:
- 考虑安全性和性能。 - 逻辑上分区应用程序。 - 评估亲和力。 - 减少往返次数。 - 避免长时间运行任务的阻塞。 - 使用缓存。 - 避免不必要的异常。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接