Почему производительность падает, если количество процессов превышает половину количества ядер? - PullRequest
0 голосов
/ 12 мая 2018

Привет, ребята. У меня есть следующая программа на 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. Облачная виртуальная машина Google с процессором Cent OS 7.x, работающим на 8 VCPU Процессор Intel
  2. Cent OS 7.X Linux с 48-ядерным процессором Intel

График зависимости производительности от количества используемых ядер приведен ниже. Из этого я наблюдаю, что выходная мощность увеличивается до тех пор, пока число процессов не достигнет числа ядер / 2 и не уменьшится после этого. Может кто-нибудь объяснить это поведение?

enter image description here enter image description here

1 Ответ

0 голосов
/ 12 мая 2018

Как сказал @IlyaBursov, «проблема» в этом заключается в гиперпоточности.

Гиперпоточность - это не просто волшебство. Истинная цель гиперпоточности состоит в том, чтобы иметь возможность выполнять другой процесс или поток во время задержки ожидания доступа к памяти другого процесса.

А в вашем случае ваш код слишком прост, чтобы повысить производительность с помощью гиперпоточности. Это просто счетчик, увеличенный в бесконечном цикле. Весь код может быть помещен в кэш L1, кэш-память наверняка не пропущена ...

Но если вы добавите слишком много процессов, стоимость переключения контекста между двумя процессами не будет незначительной.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...