确保并行调用不使用太多 CPU

Posted

技术标签:

【中文标题】确保并行调用不使用太多 CPU【英文标题】:Ensure Parallel Invoke don't use to much CPU 【发布时间】:2018-06-26 11:20:08 【问题描述】:

我有一个带有 WCF 的 C# 程序,它使用了一些并行调用。

首先,每个客户端调用在服务端都与我的 WCF 服务并行。

我有一个包含 B 类列表的 A 类

我可以在不添加 A 的情况下添加 B 类的列表。

要插入我的元素 B 列表,我会并行执​​行,因为在添加之前我会进行大量验证。和 A 一样

一些客户一次性添加了非常大的 A 元素列表。

所以,我使用并行调用来添加每个 A 元素。

我使用并行选项对其进行配置,以使用不超过一半的 CPU。 让做其他事情的其他用户使用 CPU。

但是添加已经并行限制一半 CPU 的 A 类的任务创建另一个 Parallel Invoke 以添加 B 类

例如随叫随到 调用AddClassAList 创建两个线程 AddClassA。

而且每个 AddClassA 创建两个线程 AddClassB

所以,我现在有 4 个线程。

这 4 个线程是否限制为 CPU 的一半? 还是只有 The Two AddClassA 限制为一半 CPU,每个子线程可以使用任意数量的 CPU?

var pCount = Environment.ProcessorCount / 2;
var options = new ParallelOptions();
options.MaxDegreeOfParallelism = pCount > 0 ? pCount : 1;
Parallel.Invoke(options, actions.ToArray());

【问题讨论】:

你能分享你做过的任何代码示例吗? 并行执行允许在可用时使用 CPU 容量。它并不打算强制一个进程使用特定的分数。这只是意味着,如果有更多可用容量,则不必将活动限制为一个线程。 我的目的是限制任务列表的 CPU 使用率。即使有一些 cpu 可用,我也不希望它使用超过一半 关于代码示例......这是一个非常重要的方法,为什么我选择描述我的线程如何工作而不是给出一个凌乱的代码示例 您可能会想到使用 MaxDegreeOfParallelism 。它不会限制 CPU 的使用量,但您可以降低并行操作的程度,因此可能会降低 CPU 内核的利用率。 【参考方案1】:

您的 CPU 是一种应该使用的资源。如果它闲置,没有人会感谢你。所以限制你的过程是没有意义的。你甚至不知道当时是否有其他人在使用这台电脑。

可以使用您自己的TaskScheduler 实现来影响何时启动多少任务以及何时启动。

但同样,没有意义。您应该尽可能多地提出要求。如果您想对其他用户友好,请降低您的流程优先级,因此如果您想 100% 使用,他们仍然可以使用优先级较高的流程。

【讨论】:

嗯,我不确定 CPU 始终处于 100% 状态是否很好。但是,是的,主要目标是如果有人启动了非常长的东西并且他知道他会等待几秒钟/分钟。我想让 Cpu 为后面的人使用并启动一个非常短的动作。我不希望他等待可用性...当我知道一项任务是一项长期任务时。如果我的 CPU 以 100% 的速度使用,它会降低想要某些东西的用户的速度。我有大约 20 个人连接在同一台机器上。所以我想派人一点,如果有人推出了一件非常大的事情,让其他人的资源...... 这不是 MaxDegreeOfParallelism 的目的。减少线程的使用量? 你似乎认为,如果你想要 100%,你得到 100%。每个进程都有一个优先级。根据此优先级分配资源。因此,例如,如果您有一个无限循环和一个浏览器窗口,如果无限循环具有更高的优先级,您将无法处理该窗口。如果窗口作为更高的优先级,您将能够毫无问题地浏览,因为只有 剩余的 资源将被分配给 100% hog。因此,您的目标应该是使用 100%,但您应该将进程的 优先级 设置为低,这样您就只能获得 剩下的 100% 没有意义的是去争取正常的优先级,但低于 100%。您应该尽可能快地前进,并为更快的人让步,始终按照自己的速度前进,但为任何人让步意味着您总是会迟到,有时还会让别人感到沮丧。 我的服务是一个具有多个进程的应用程序......所以他得到了操作系统一次可以给它的最大值。但是在我的应用程序中,我想进行一些更改并定义该方法特别是永远不会授权一次允许使用 100% 的应用程序 T

以上是关于确保并行调用不使用太多 CPU的主要内容,如果未能解决你的问题,请参考以下文章

并行代码扩展性差

使用 OpenGL 绘图而不杀死 CPU 并且不并行化

以半并行方式运行多个任务

让Oracle高效并行执行的13个必备知识点

Java8实战使用并行流

torch中topk()无法gpu加速