获取Python中忙碌CPU的数量

时间:2014-07-14 09:05:55

标签: python multiprocessing

我正在编写一个multiprocessing例程,在具有大量CPU的服务器上运行。但是,服务器有多个用户,其用途可能会有所不同。所以我想根据当前负载调整使用的处理器数量。

  • 有没有办法估计当前在Python中忙碌的CPU数量?我只找到了multiprocessing.cpu_count()
  • 加分问题:如果服务器上的负载在一段时间后发生了变化,是否可以在活动期间更改multiprocessing.Pool(processes=no_cpus)

3 个答案:

答案 0 :(得分:4)

有许多并发症......

  • 您无法确定哪些CPU正忙

进程(和线程)由Linux内核在任何CPU上进行调度。甚至确定当前的CPU"很尴尬 - 见How can I see which CPU core a thread is running in?

  • 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)

因此,您可以在系统繁忙时(高负载平均值)增加因子,并在系统空闲时(低负载;即冲浪)使延迟更短。游泳池的大小相同。

答案 1 :(得分:3)

我按照 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)

答案 2 :(得分:1)

我认为你问题最好的图书馆是 psutil,您可以使用它来管理某些不同操作系统中的CPU和内存使用情况:

  

psutil是一个模块,提供了一个接口,用于通过使用Python以可移植的方式检索有关正在运行的进程和系统利用率(CPU,内存)的信息,实现ps,top和Windows任务管理器等工具提供的许多功能。

     

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