Привет, ребята. У меня есть следующая программа на 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})
Я запускал эту программу на двух разных машинах
- Облачная виртуальная машина Google с процессором Cent OS 7.x, работающим на 8 VCPU Процессор Intel
- Cent OS 7.X Linux с 48-ядерным процессором Intel
График зависимости производительности от количества используемых ядер приведен ниже. Из этого я наблюдаю, что выходная мощность увеличивается до тех пор, пока число процессов не достигнет числа ядер / 2 и не уменьшится после этого. Может кто-нибудь объяснить это поведение?