繁体   English   中英

Python:我的具有五个进程的 python 程序使用了多少个内核?

[英]Python: How many cores are used by my python program with five processes?

我有一个 python 程序,由主进程之外的 5 个进程组成。 现在我正在寻找一个 AWS 服务器或类似的东西,我可以在其上运行脚本。 但是我怎样才能知道脚本使用了多少个 vCPU 内核/需要多少个? 我看过:

import multiprocessing

multiprocessing.cpu_count()

但它似乎只返回系统上的 CPU 计数。 我只需要知道脚本使用了多少个 vCPU 内核。

谢谢你的时间。

编辑:

只是为了获得更多信息。 进程无限期地运行。

您的问题使用了一些通用术语并且未指定很多内容,因此答案必须是通用的。

假设您正在使用 Process 直接或 ProcessPoolExecutor 管理进程。

在某些情况下,vCPU 是一个逻辑处理器,但根据以下链接,有一些服务提供部分 vCPU 的配置,例如共享环境中的那些...

AWS 中的 vCPU 是什么

你提到/问...

...现在我正在寻找一个 AWS 服务器或类似的东西,我可以在其上运行脚本。 ...

...但是我怎样才能找出脚本使用了多少个 vCPU 内核/需要多少个? ...

你 state AWS 或类似的东西。 答案取决于您的子进程做什么,以及每个子进程需要多少 vCPU 或派系 vCPU。 通常,vCPU 类似于可以在其上执行线程的逻辑处理器。 vCPU 的一小部分将是 vCPU 的一些有限使用(而不是一些其他“完全”或完全“使用”)。

一个或多个 vCPU(或其中的部分 vCPU)对您的子进程的含义实际上取决于这些子进程,它们做什么。 如果一个子进程大部分时间都在等待 I/O,那么您几乎不需要专门的 vCPU 来处理它。

我建议从一些最低成本的配置开始,看看它如何与您的应用程序的预期工作负载一起工作。 如果您不满意,请根据需要增加配置。

如果有帮助...

如果我需要通过将事物分解为子进程来避免 Python 的 GIL 限制的同时执行,我通常会使用子进程。 我通常为每个子进程使用一个活动线程,其中同一子进程中的任何其他线程通常处于等待状态,等待 I/O 或不与子进程的主要活动线程竞争。 当然,如果您想将 I/O 与放置在其他子进程中的其他线程分开,则子进程可以专用于 I/O。

由于我们不知道您的应用程序的用途、架构和许多其他因素,因此很难说比上面的概括性更多。

这篇文章的答案可能在于以下问题:

多处理:比 cpu.count 更多的进程

简而言之,您可能有数百个进程正在运行,但这并不意味着您将使用数百个内核。 这完全取决于利用率和流程的工作量。

您还可以从 psutil 模块获取一些附加信息

import psutil

print(psutil.cpu_percent())
print(psutil.cpu_stats())
print(psutil.cpu_freq())

或使用操作系统接收 python 中的当前 CPU 使用情况:

import os
import psutil

l1, l2, l3 = psutil.getloadavg()
CPU_use = (l3/os.cpu_count()) * 100

print(CPU_use)
  • 学分:代尔夫特堆栈

编辑

以下媒体文章可能会为您提供一些信息。 也许也有一些用于 CPU 使用的工具。 https://medium.com/survata-engineering-blog/monitoring-memory-usage-of-a-running-python-program-49f027e3d1ba

在 Linux 上,您可以在命令行中使用“top”命令来监控进程 id 的所有线程的实时活动:

top -H -p <process id>

我将尝试对“我只需要知道脚本使用多少个 vCPU 内核”进行自己的总结。

除了运行您的应用程序并监控其资源使用情况之外,没有办法正确回答这个问题。 假设您的 Python 进程不会产生子进程(甚至可能是多线程应用程序),我们只能说您的应用程序不会使用超过 6 个内核(根据进程总数)。 程序有很多方法可以充分利用 CPU 内核,例如等待 I/O(磁盘或网络)或进程间同步(共享资源)。 因此,要了解 CPU 利用率,您确实需要测量实际性能(例如,使用 Linux 或 macOS 上的htop实用程序)并调查性能不佳的原因(如果有的话)。

希望能帮助到你。

您的计算机在任何给定点都有数百个(如果不是数千个)进程在运行。 如果它只有 5 个内核,它如何处理所有这些问题? 问题是,每个核心都需要一个进程一段时间,或者直到它在该进程中无事可做。

例如,如果我创建一个脚本来计算从 1 到十亿的所有数字的平方根,你会看到一个核心将达到最大使用率,然后一瞬间另一个核心达到最大使用率,而第一个核心下降到正常以此类推,直到计算完成。

或者如果进程在等待一个 I/O 进程,那么核心无事可做,所以它会丢弃该进程,然后转到另一个进程,当 I/O 操作完成时,核心可以重新选择该进程,并且回去工作。

您可以在单个内核或 100 个内核上运行您的多处理 python 代码,您真的无能为力。 但是,在 windows 上,您可以set affinity ,这使进程只能访问某些内核。 因此,当进程开始时,您可以将 go 设置为每个,并将关联设置为核心 1 或每个单独的核心。 不过,不确定你是如何在 Linux 上做到这一点的。

总之,如果您想要一个简短而直接的答案,我认为我们可以说它可以访问尽可能多的内核。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM