簡體   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