[英]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 内核/需要多少个? ...
你 state AWS 或类似的东西。 答案取决于您的子进程做什么,以及每个子进程需要多少 vCPU 或派系 vCPU。 通常,vCPU 类似于可以在其上执行线程的逻辑处理器。 vCPU 的一小部分将是 vCPU 的一些有限使用(而不是一些其他“完全”或完全“使用”)。
一个或多个 vCPU(或其中的部分 vCPU)对您的子进程的含义实际上取决于这些子进程,它们做什么。 如果一个子进程大部分时间都在等待 I/O,那么您几乎不需要专门的 vCPU 来处理它。
我建议从一些最低成本的配置开始,看看它如何与您的应用程序的预期工作负载一起工作。 如果您不满意,请根据需要增加配置。
如果有帮助...
如果我需要通过将事物分解为子进程来避免 Python 的 GIL 限制的同时执行,我通常会使用子进程。 我通常为每个子进程使用一个活动线程,其中同一子进程中的任何其他线程通常处于等待状态,等待 I/O 或不与子进程的主要活动线程竞争。 当然,如果您想将 I/O 与放置在其他子进程中的其他线程分开,则子进程可以专用于 I/O。
由于我们不知道您的应用程序的用途、架构和许多其他因素,因此很难说比上面的概括性更多。
简而言之,您可能有数百个进程正在运行,但这并不意味着您将使用数百个内核。 这完全取决于利用率和流程的工作量。
您还可以从 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.