【问题标题】:Why the performance drops if the number of process is greater than half the number of cores?如果进程数大于内核数的一半,为什么性能会下降?
【发布时间】:2018-05-12 05:01:21
【问题描述】:

大家好,我有以下 Python 程序,用于对多处理应用程序的性能进行基准测试。

#
# Date : 09/May/2018
# Platform : Linux
#

import os
import sys
import ctypes
import signal
import multiprocessing as mp

ncpu = 4
counter = 0
child_index = 0
process_list = []
shared_array = None

def HandleSignal(signum, frame) :

   total = 0
   print("Parent timeout hence terminate child")
   [hProc.terminate() for hProc in process_list]
   [hProc.join() for hProc in process_list]
   for each_count in shared_array :
      total += each_count
   print("{:,}".format(total))

def ChildHandleSignal(signum, frame) :

   # print("{} - {} : {:,}".format(child_index, os.getpid(), counter))
   shared_array[child_index] = counter
   sys.exit(0)

def entry_point(index, sarr) :

   global counter
   global child_index
   global shared_array

   child_index = index
   shared_array = sarr
   signal.signal(signal.SIGTERM, ChildHandleSignal)
   while True : counter += 1

   return

ncpu = int(sys.argv[1])
maxcpu = os.cpu_count()

if ncpu > maxcpu :

   print("Number of CPU greater than maximum CPU")
   print("Setting number of CPU to maximum")
   ncpu = maxcpu

shared_array = mp.Array(ctypes.c_int64, range(ncpu))
signal.signal(signal.SIGALRM, HandleSignal)
signal.alarm(5)

for I in range(ncpu) :

   p1 = mp.Process(target=entry_point, args=(I, shared_array, ))
   process_list.append(p1)
   p1.start()

   # I tried both with and with-out the below
   # statement. The outputs are much similar
   os.sched_setaffinity(p1.pid, {I})

我已经在两台不同的机器上运行了这个程序

  1. 在 8 个 VCPU 英特尔处理器上运行 Cent OS 7.x 的 Google 云虚拟机
  2. Cent OS 7.X Linux 机器,48 核 Intel 处理器

输出与使用的核心数量的关系图如下所示。我从中观察到输出增加,直到进程数达到核心数/ 2,然后下降。有人可以解释这种行为吗?

【问题讨论】:

  • 疯狂猜测 - 超线程
  • 但超线程应该会提高性能,但这里的性能下降了

标签: linux python-3.x concurrency multiprocessing centos7


【解决方案1】:

正如@IlyaBursov 所说,这里的“问题”是超线程。

超线程不仅仅是魔法。超线程的真正目的是能够在等待另一个进程的内存访问的延迟期间执行另一个进程或线程。

在您的情况下,您的代码过于简单,无法使用超线程获得性能。这只是一个在无限循环中递增的计数器。所有的代码都可以放在一级缓存中,肯定没有缓存未命中……

但是如果添加过多的进程,2个进程之间的上下文切换的成本是不可忽略的。

【讨论】:

    猜你喜欢
    • 2013-01-05
    • 1970-01-01
    • 1970-01-01
    • 2023-01-10
    • 2013-05-10
    • 2011-07-26
    • 2020-01-31
    • 2018-12-24
    • 2017-03-03
    相关资源
    最近更新 更多