簡體   English   中英

獲取Python中忙碌CPU的數量

[英]Get number of busy CPUs in Python

我正在編寫一個multiprocessing例程,在具有大量CPU的服務器上運行。 但是,服務器有多個用戶,其用途可能會有所不同。 所以我想根據當前負載調整使用的處理器數量。

  • 有沒有辦法估計當前在Python中忙碌的CPU數量? 我只發現了multiprocessing.cpu_count()
  • 額外問題:如果服務器上的負載在一段時間后發生了變化,是否有可能在活動期間更改multiprocessing.Pool(processes=no_cpus)

有許多並發症......

  • 您無法確定哪些CPU正忙

進程(和線程)由Linux內核在任何CPU上進行調度。 即使確定“當前CPU”也很尷尬 - 請參閱如何查看線程正在運行的CPU內核?

  • multiprocessing.Pool旨在啟動“永遠”運行的N個工作人員。 每個人都接受隊列中的任務,做一些工作,然后輸出數據。 Pool不會改變大小。

兩個建議:

  • uptime命令輸出如下內容:

19:05:07 up 4 days, 20:43, 3 users, load average: 0.99 , 1.01, 0.82

最后三個數字是最后一分鍾,五分鍾和15分鍾的“平均負載”。 考慮使用第一個數字來對應用程序進行負載平衡。

  • 考慮讓你的應用程序在完成每項工作后做time.sleep(factor)

因此,您可以在系統繁忙時(高負載平均值)增加因子,並在系統空閑時(低負載;即沖浪)使延遲更短。 游泳池的大小相同。

我遵循了johntellsall的解決方案,這是一些實際的簡單原理圖。 有一個,因為Python(對我來說)將虛擬與實際的cpu混淆。 我決定校准過去15分鍾的平均負荷。

睡覺的數字很隨意。

def sleepForMultiCore():
    # divide by 2 since Python does not distinguish physical and virtual core
    cores = 0.5*mp.cpu_count()
    loadAvg = os.getloadavg()[2]

    if loadAvg > cores*1.3:
        sleepTime = 5*60
    elif loadAvg > cores:
        sleepTime = 2*60
    elif loadAvg > cores*0.9:
        sleepTime = 1*60
    else:
        sleepTime = 0
    print ('sleeping for ', sleepTime)
    time.sleep(sleepTime)

我認為你的問題最好的庫是psutil ,你可以在一些不同的操作系統中管理一些CPU和內存使用':

psutil是一個模塊,提供了一個接口,用於通過使用Python以可移植的方式檢索有關正在運行的進程和系統利用率(CPU,內存)的信息,實現ps,top和Windows任務管理器等工具提供的許多功能。

它目前支持Linux,OS X,FreeBSD和Windows,使用2.4到3.1的Python版本,使用獨特的代碼庫。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM