我正在编写一个multiprocessing
例程,在具有大量CPU的服务器上运行。但是,服务器有多个用户,其用途可能会有所不同。所以我想根据当前负载调整使用的处理器数量。
multiprocessing.cpu_count()
multiprocessing.Pool(processes=no_cpus)
?答案 0 :(得分:4)
有许多并发症......
进程(和线程)由Linux内核在任何CPU上进行调度。甚至确定当前的CPU"很尴尬 - 见How can I see which CPU core a thread is running in?
multiprocessing.Pool
旨在启动 N 工作程序,这些工作程序将永远运行。"每个人都接受队列中的任务,做一些工作,然后输出数据。 Pool
不会改变大小。两个建议:
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版本,使用独特的代码库。