当我在 python 中有 8 个逻辑核心时,将我的程序分成 8 个独立的进程是否是最好的方法(性能方面)?
Is spliting my program into 8 separate processes the best approach (performance wise) when I have 8 logical cores in python?
简介
我重写了我以前的顺序算法之一以并行方式工作(我们谈论的是真正的并行性,而不是并发或线程)。我 运行 一个批处理脚本 运行 我的“工作人员” python 节点,每个节点将执行相同的任务,但偏移量不同(进程之间没有数据共享)。如果它有助于形象化,请想象一个带有 API 端点的虚拟示例,该端点在 [GET] 请求时向我发送一个数字,我必须猜测它是偶数还是奇数,所以我 运行 我的工人。这个例子说明了这一点,因为我不能分享算法,但假设单个进程的例程已经优化到最大值。
重要: 进程在 Windows10 上执行,具有管理员权限和 real_time 优先级
诊断
最佳工作节点进程数是否等于逻辑核心数(即8)?当我使用任务管理器时,我看到我的 CPU 在所有内核上都达到了 100% 的限制,但是当我查看进程时,它们每个占用大约 6%? 6% * 8 = 48% 这有什么意义?在闲置时(没有进程),我的 CPU 大约占总数的 0-5%。
我尝试使用性能监视器对其进行诊断,但结果更加令人困惑:
推理
我不知道如何配置 Performance Manager 来跨不同的核心跟踪我的进程,所以我使用总 CPU 时间作为 Y 轴。我怎样才能在 8 个进程上至少使用 20%,这意味着 120% 的利用率?
问题一
这没有多大意义,而且数字与任务管理器显示的不同。更糟糕的是,粗体蓝线显示所有内核的总(平均)CPU 性能,当任务管理器说我的所有内核 运行 为 100% 时,这似乎不超过 70% ?我在这里混淆了什么?
问题二
运行ning X 进程,其中 X 是系统上在 real_time 优先级下的逻辑核心数,我能做的最好吗? (并让 OS 处理调度逻辑)?在条形图中的第二张图片中,我可以看到它做得很好,理想情况下,所有这些条形图的高度都相等,这大致是正确的。
我找到了这个问题的答案并决定 post 而不是删除。我使用 psutil 库手动设置每个工作进程的亲和力并分发它们而不是 OS。我在网络上和调试打印中进行了很多 IO 操作,这导致我的处理器核心无法达到 100% 的最大值(毕竟 windows 不是实时操作系统)
除此之外,由于我在我的笔记本电脑上测试了代码,我遇到了热节流问题,这导致了 %usage 计算的干扰。
简介
我重写了我以前的顺序算法之一以并行方式工作(我们谈论的是真正的并行性,而不是并发或线程)。我 运行 一个批处理脚本 运行 我的“工作人员” python 节点,每个节点将执行相同的任务,但偏移量不同(进程之间没有数据共享)。如果它有助于形象化,请想象一个带有 API 端点的虚拟示例,该端点在 [GET] 请求时向我发送一个数字,我必须猜测它是偶数还是奇数,所以我 运行 我的工人。这个例子说明了这一点,因为我不能分享算法,但假设单个进程的例程已经优化到最大值。
重要: 进程在 Windows10 上执行,具有管理员权限和 real_time 优先级
诊断
最佳工作节点进程数是否等于逻辑核心数(即8)?当我使用任务管理器时,我看到我的 CPU 在所有内核上都达到了 100% 的限制,但是当我查看进程时,它们每个占用大约 6%? 6% * 8 = 48% 这有什么意义?在闲置时(没有进程),我的 CPU 大约占总数的 0-5%。
我尝试使用性能监视器对其进行诊断,但结果更加令人困惑:
推理 我不知道如何配置 Performance Manager 来跨不同的核心跟踪我的进程,所以我使用总 CPU 时间作为 Y 轴。我怎样才能在 8 个进程上至少使用 20%,这意味着 120% 的利用率?
问题一
这没有多大意义,而且数字与任务管理器显示的不同。更糟糕的是,粗体蓝线显示所有内核的总(平均)CPU 性能,当任务管理器说我的所有内核 运行 为 100% 时,这似乎不超过 70% ?我在这里混淆了什么?
问题二
运行ning X 进程,其中 X 是系统上在 real_time 优先级下的逻辑核心数,我能做的最好吗? (并让 OS 处理调度逻辑)?在条形图中的第二张图片中,我可以看到它做得很好,理想情况下,所有这些条形图的高度都相等,这大致是正确的。
我找到了这个问题的答案并决定 post 而不是删除。我使用 psutil 库手动设置每个工作进程的亲和力并分发它们而不是 OS。我在网络上和调试打印中进行了很多 IO 操作,这导致我的处理器核心无法达到 100% 的最大值(毕竟 windows 不是实时操作系统)
除此之外,由于我在我的笔记本电脑上测试了代码,我遇到了热节流问题,这导致了 %usage 计算的干扰。